对于某种,可以说是不合逻辑或嘲弄的程度,我可以了解JS的结果,如:
// Coercing to string and concatenating
3 + [4,2]
'34,2'
// Coercing and doing proper math
4 - [2]
2
// Or failing miserably
3 - [4,2]
NaN
但为什么3[4,2]
评估为undefined
?至少在上面的例子中,有操作要执行(正在做某事)。在相关的说明中,具有讽刺意味的是[4,2]3
引发SyntaxError: Unexpected number
错误。
这里发生了什么?
上下文 :花了一个早上发现并挤压一个错误,其中,
(逗号)从数组混合中丢失和嵌套数组:[1, 2, 3 [4, 2], 5, [8], 7]
。
答案 0 :(得分:8)
表达式
3[4,2]
评估为
(new Number(3))[4, 2]
属性查找操作。 4,2
表达式是逗号运算符的示例,其值是子表达式列表中的最后一个2
。
运行时创建的Number实例没有名为“2”的属性,因此结果为undefined
。
该语言对.
和[]
运算符的处理几乎相同,但.
与数字文字的令牌语法纠缠在一起。左侧将转换为对象(如果可能;当它为undefined
时,您将获得熟悉的“无法读取未定义的属性foo”错误)。然后获取属性值(如果存在)。
例如
3["valueOf"]
不是undefined
:它是Number.prototype.valueOf
函数的引用。