为什么(42中的'k');为for(42中的'k')抛出异常;不是,在JavaScript中?

时间:2013-12-20 11:07:04

标签: javascript ecmascript-5

从语言设计的角度来看,为什么

if ('k' in 42);

时抛出TypeError例外
for ('k' in 42);

没有?

我已经阅读了ECMAScript规范中的以下部分:

有人可以解释这种不一致的理由吗?

为什么'k' in 42中的if (...)表达式只能评估为false

2 个答案:

答案 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是否写得不正确。