什么是javascript中的obj?.prop语法?

Apu*_*hak 9 javascript ecmascript-5

我正在查看代码,我遇到了这个:

{{abc?.xvy=== tyu?abc?.xz:abc?.xz}}
Run Code Online (Sandbox Code Playgroud)

我无法理解这个表达的含义.我知道这是一个安全的属性访问,但我对链接有点困惑.任何帮助深表感谢

Cer*_*nce 8

这看起来是可选链接提议的一个示例,它仍然是一项正在进行的工作(仅在第1阶段).它实际上并没有在vanilla JS环境中实现.运用

obj?.prop
Run Code Online (Sandbox Code Playgroud)

表示:如果obj未定义或为null,则表达式求值为undefined.但否则,它将评估prop对象上的属性.这是语法糖

obj && obj.prop
Run Code Online (Sandbox Code Playgroud)

(obj.prop如果obj未定义或为null,则单独使用将抛出)

所以,你的

abc?.xvy=== tyu?abc?.xz:abc?.xz
Run Code Online (Sandbox Code Playgroud)

将评估true嵌套值abc?.xvy是否等于嵌套值abc?.xz- 或者,true如果至少有一个嵌套值不存在,它将评估为另一个嵌套值undefined.

间隔更方便阅读:

abc?.xvy === tyu
? abc?.xz
: abc?.xz
Run Code Online (Sandbox Code Playgroud)

如您所见,两者?:表达式是相同的,这使得条件运算符不必要.等效测试(假设引用tyu不抛出)将是

abc?.xvy === abc?.xz
Run Code Online (Sandbox Code Playgroud)


Vis*_*ole 5

它的新ES提议称为“可选”,用于安全检查对象属性。上面的表达式等效于:

(abc && abc.xvy) === (tyu) ? (abc && abc.xz) : (abc && abc.xz)
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多详细信息:https : //github.com/davidyaha/ecmascript-optionals-proposal

  • 不过,OP的代码没有任何对`xz`变量的独立引用。 (2认同)

Ale*_*ark 5

它被称为Null Propagation Operator

我们可以想到每个?。运算符作为短路,其中“如果直到这一点的表达式为未定义,则整个表达式的计算结果为未定义”。我们还可以选择调用函数。