Javascript 什么';ramda源代码中@@functional/placeholder的含义是什么?

Javascript 什么';ramda源代码中@@functional/placeholder的含义是什么?,javascript,ramda.js,Javascript,Ramda.js,我在ramda源代码中找到了@functional/placeholder ECMAScript标准中似乎没有“@”符号,那么这个符号代表什么呢 这很奇怪。我从未见过这种用法,我想知道这是什么 它只是对象上的一个属性。除了拉姆达赋予它的意义外,它没有特别的意义。在ramda中,具有此属性的对象是R.。uuu,这是一个特殊的对象,它只告诉ramda的curry函数忽略此参数(请参阅) 对象属性的键可以是任何字符串或符号,它们选择字符串“@@functional/placeholder”以避免意外

我在ramda源代码中找到了@functional/placeholder

ECMAScript标准中似乎没有“@”符号,那么这个符号代表什么呢


这很奇怪。我从未见过这种用法,我想知道这是什么

它只是对象上的一个属性。除了拉姆达赋予它的意义外,它没有特别的意义。在ramda中,具有此属性的对象是R.。uuu,这是一个特殊的对象,它只告诉ramda的curry函数忽略此参数(请参阅)

对象属性的键可以是任何字符串或符号,它们选择字符串“@@functional/placeholder”以避免意外的名称冲突(不太可能有人意外地选择该属性名称)

const示例={
“@@functional/placeholder”:true,
};
console.log(isPlaceholder(示例));
功能iPlaceHolder(a){
返回一个!=null&&
a的类型==“对象”&&
a['@@functional/placeholder']==true;
}
(拉姆达作者在此)

Bergi的评论和Nicholas Tower的回答都是正确的。这只是一个唯一的标识符,以确保您不会实际传递可能被Ramda误认为占位符的有意义的内容。命名的直接灵感来自于,这反过来又会受到著名的符号黑客的启发

选择此选项时,我们希望其他函数库用户也可以使用相同的东西,以实现互操作性。虽然这从未发生过,但它似乎仍然是一个比其他选择更好的选择:我们不能选择使用符号,因为我们支持ES5甚至ES3。我们本可以选择像lodash那样使用库本身作为占位符,但这确实有意义,因为lodash的标准命名(
\uu
)看起来像其他语言中的占位符。或者我们可以使用任意对象,但这需要我们通过引用进行测试,这在函数库中感觉很奇怪。或者我们可以使用
undefined
作为信号,但这不允许有人实际使用
undefined
作为值

因此,我们最终制定了一个没有其他人遵循的标准,但该标准至少易于使用,而且Javascript用户对其有些熟悉。

看看他们的灵感来自何方。在现代环境中,他们会使用
符号.for
export default function _isPlaceholder(a) {
  return a != null &&
         typeof a === 'object' &&
         a['@@functional/placeholder'] === true;
}