在浏览器的JS控制台中试试这些:
{}['constructor'] //==> ['constructor']
{}['constructor'] === ['constructor'] //==> false
console.log({}['constructor']) //==> function Object() { [native code] }
第一个表达式返回一个带有单个项目的数组:'constructor'
但是,第二个表达式似乎与返回false
的第一个表达式相矛盾。第三个将Object
构造函数记录到控制台。
为什么后两个表达式与第一个表达式不一致?
答案 0 :(得分:3)
由于
{}['constructor']
被解析为
{
// empty block
}
['constructor']
尝试输入
var x = {}; x['constructor']
或者
({})['constructor']
您将获得预期的结果。 {}
始终被解析为空块,除之外没有意义(如上面的两个示例中所示)。
Barmar explains the second in the comments.简而言之,[1] !== [1]
因为它们是两个不同的数组对象。
第三个例子有效,因为JavaScript知道你不能将一个块传递给一个函数,所以它假设一个空对象。