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

时间:2019-10-30 03:02:50

标签: javascript ramda.js

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

Code Link in github

export default function _isPlaceholder(a) {
  return a != null &&
         typeof a === 'object' &&
         a['@@functional/placeholder'] === true;
}

ECMAScript标准中似乎没有'@'表示法,那么该表示法代表什么?

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

2 个答案:

答案 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;
}