JavaScript中{ __proto__: [] } instanceof Array报错加括号正常的原因
为什么
{ __proto__: [] } instanceof Array会报错,加括号就正常? 这个问题本质是JavaScript解析器对语法上下文的判断差异导致的,我拆成两点给你讲明白:
解析器对开头
{的默认判断
当代码以{开头时,JS解析器会优先把它识别成块语句的起始标记(就像if(){}、for(){}里的代码块一样)。那{ __proto__: [] }会被解析成什么呢?这里的__proto__会被当作一个标签(label),而[]就是一个普通的数组表达式——这时候整个结构是一个带标签的语句块,后面跟instanceof Array就完全不符合语法规则了,自然会报错。括号强制切换为表达式上下文
当你用()把整个内容包裹起来时,解析器就知道这是一个表达式上下文,里面的{}会被强制解析成对象字面量。这时候({ __proto__: [] })就是一个明确的对象:它的原型被设置为一个空数组实例。接下来用instanceof Array判断时,因为instanceof是检查对象原型链上是否存在构造函数的prototype,这个对象的原型是数组,所以会返回true,语法也完全合法。
举个更简单的例子对比:直接写{ a: 1 }在全局执行,其实是一个标签语句块;而({ a: 1 })才是创建了一个包含a属性的对象。
内容的提问来源于stack exchange,提问作者soarinblue
相关产品推荐
相关产品推荐

