Lisp 中相当于 JavaScript 的符号是什么?

问题描述 投票:0回答:1

所以在 Lisp/Scheme 中,有这些“符号”,如果我理解正确的话,它们基本上是对变量(而不是它们的值)的引用,如果我错了,请纠正我。我想知道是否有与此等效的 JavaScript?

谢谢!

javascript scheme lisp symbols
1个回答
0
投票

在Lisp和Scheme中,符号确实代表了唯一的标识符,通常用作变量或常量的名称。它们作为一种轻量级的方式来引用某些东西,而不直接保存值,从而实现符号操作。

在 JavaScript 中,与 Lisp 符号最接近的等效项实际上是 ES6 中引入的符号本身。 JavaScript 的 Symbol 类型代表唯一的、不可变的标识符。它们可以用作对象属性的键,确保不会与其他属性名称意外发生名称冲突,但就变量引用而言,它们与 Lisp 符号并不完全相同。

以下详细介绍了 JavaScript 中的 Symbol 与 Lisp 符号的比较以及它能做什么和不能做什么:

独特性和身份: 在 JavaScript 中,创建的每个符号都是唯一的,这与 Lisp 符号作为唯一标识符的方式一致。例如:

const sym1 = Symbol("mySymbol");
const sym2 = Symbol("mySymbol");
console.log(sym1 === sym2); // false

即使两个符号具有相同的描述,它们也是唯一的。

没有直接引用变量: Lisp 符号可以引用全局环境中的变量名或函数。然而,JavaScript 符号并不直接链接到变量或保存对值的引用。它们更像是不会与其他键发生冲突的键。这意味着您不能像 Lisp 符号引用绑定那样使用 Symbol 来引用变量。

用作对象键: JavaScript 符号通常用作对象中的属性键,以创建不干扰其他键的“隐藏”属性。以下是您可以如何使用它们:

const key = Symbol("secretKey");
const obj = {
    [key]: "hidden value"
};
console.log(obj[key]); // "hidden value"

变量引用行为的解决方法 如果您想要更接近 Lisp 的行为(例如,引用变量的符号名称),您可以在映射中使用字符串键,甚至可以使用具有保存变量值的属性名称的对象。例如:

const symbols = {
   myVariable: 42,
   anotherVariable: "hello"
};

const symbolName = "myVariable";
console.log(symbols[symbolName]); // 42

这不会为您提供真正的符号操作,但它允许您通过名称间接引用变量。

总结:

JavaScript Symbol 提供了唯一的标识符,对于对象中的键很有用,但没有 Lisp 提供的变量绑定引用。 您可以使用对象属性或映射来模拟引用,尽管这种方法缺乏 Lisp 的符号操作功能。

© www.soinside.com 2019 - 2024. All rights reserved.