从语言设计的角度来看,为什么
if ('k' in 42);
在
时抛出TypeError
例外
for ('k' in 42);
没有?
我已经阅读了ECMAScript规范中的以下部分:
有人可以解释这种不一致的理由吗?
为什么'k' in 42
中的if (...)
表达式只能评估为false
?
答案 0 :(得分:2)
重新阅读in部分。
If Type(rval) is not Object, throw a TypeError exception.
42不是一个对象,它是一个数字
typeof 42 // 'number'
typeof new Number(42) // 'object'
for-in语句不需要对象,实际上它实际上将它转换为对象
Let obj be ToObject(experValue).
我不认为这是这种行为背后的原因,它可能是一个设计缺陷(不一致)
答案 1 :(得分:1)
我认为这里的关键是'operator'(in
)和'statement'(for-in
)之间的区别。如果你检查标准,你会看到后者只在错误地写时抛出错误。 with
情况,在严格模式下抛出 SyntaxError (!),非常有说服力。
除非您先评估for (var x in someExpr)
,否则您无法猜测someExpr
是否写得不正确。