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

azt*_*ack 9 javascript ecmascript-5

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

if ('k' in 42);
Run Code Online (Sandbox Code Playgroud)

抛出TypeError异常

for ('k' in 42);
Run Code Online (Sandbox Code Playgroud)

才不是?

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

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

为什么不能表达'k' in 42if (...)只是评估为false

Sil*_*cea 2

重新阅读 in 部分。

If Type(rval) is not Object, throw a TypeError exception.
Run Code Online (Sandbox Code Playgroud)

42 不是一个对象,而是一个数字

typeof 42 // 'number'
typeof new Number(42) // 'object'
Run Code Online (Sandbox Code Playgroud)

for-in 语句不需要对象,事实上它实际上将其转换为对象

Let obj be ToObject(experValue).
Run Code Online (Sandbox Code Playgroud)

我不认为这是这种行为背后的原因,这可能是一个设计缺陷(不一致)

  • 实际上我没有看到任何不一致 - 这两种表达有完全不同的目的,因此完全不同的行为。唯一的缺陷可能是两者使用了相同的关键字“in”。 (2认同)
  • @Bergi 是的,类似的东西,但是他们仍然可以将其转换为对象。 (2认同)