我在ramda源代码中找到@@ functional / placeholder。
export default function _isPlaceholder(a) {
return a != null &&
typeof a === 'object' &&
a['@@functional/placeholder'] === true;
}
ECMAScript标准中似乎没有'@'表示法,那么该表示法代表什么?
这很奇怪。我从未见过这种用法,我想知道这是什么。
答案 0 :(得分:3)
(Ramda的作者在这里)
贝尔吉的评论和尼古拉斯·塔的回答都是正确的。这只是一个唯一的标识符,以确保您实际上不会传递可能被Ramda误认为占位符的有意义的东西。命名的直接灵感来自transducer protocol,而这反过来又会受到著名符号hack的启发。
选择此项时,我们希望其他使用功能库的人可能会使用同一东西,以实现互操作性。尽管那从未发生过,但它似乎仍然比其他选择更好:我们在支持ES5甚至ES3时无法选择使用Symbol。我们本可以选择使用库本身作为占位符,就像lodash那样,但这确实是有道理的,因为lodash(_
)的标准命名看起来像是其他库的占位符语言。或者我们可能只是使用了一个任意对象,但这将要求我们通过引用进行测试,这在功能库中感觉很奇怪。或者我们可以只使用undefined
作为信号,但是那将不允许某人实际使用undefined
作为值。
因此,我们最终制定了一项标准,之后再没有其他标准,但是它至少易于使用并且对Javascript用户有点熟悉。
答案 1 :(得分:1)
它只是对象的一个属性。除了ramda赋予它的含义外,它没有特殊含义。在ramda中,具有此属性的对象是R .__,这是一个特殊的对象,仅告诉ramda的curry函数忽略此参数(请参见documentation for __)。
对象属性的键可以是任何字符串或符号,并且他们选择了字符串“ @@ functional / placeholder”来避免意外的名称冲突(极不可能有人偶然选择该属性名称)。
const example = {
'@@functional/placeholder': true,
};
console.log(isPlaceholder(example));
function isPlaceholder(a) {
return a != null &&
typeof a === 'object' &&
a['@@functional/placeholder'] === true;
}