所以在 Lisp/Scheme 中,有这些“符号”,如果我理解正确的话,它们基本上是对变量(而不是它们的值)的引用,如果我错了,请纠正我。我想知道是否有与此等效的 JavaScript?
谢谢!
在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 的符号操作功能。