为什么如果(';k';in 42);在for(';k';in 42)时引发异常;不是吗,用javascript?

为什么如果(';k';in 42);在for(';k';in 42)时引发异常;不是吗,用javascript?,javascript,ecmascript-5,Javascript,Ecmascript 5,从语言设计的角度来看,为什么 if ('k' in 42); 运行时引发TypeError异常 for ('k' in 42); 不是吗 我已经阅读了ECMAScript规范中的以下部分: 有人能解释这种不一致的理由吗 如果(…)只是计算为false,为什么不能在中的42中表达'k'?请重新阅读in部分 If Type(rval) is not Object, throw a TypeError exception. 42不是一个物体,它是一个数字 typeof 42 // 'nu

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

if ('k' in 42);
运行时引发
TypeError
异常

for ('k' in 42);
不是吗

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

有人能解释这种不一致的理由吗


如果(…)只是计算为
false
,为什么不能在
中的42
中表达
'k'?

请重新阅读in部分

If Type(rval) is not Object, throw a TypeError exception.
42不是一个物体,它是一个数字

typeof 42 // 'number'
typeof new Number(42) // 'object'
因为in语句不需要对象,实际上它将其转换为对象

Let obj be ToObject(experValue).

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

我相信这里的关键是“运算符”(in
)和“语句”(in)之间的区别。如果您检查标准,您将看到后者仅在错误写入时才会抛出错误。带有的
案例在严格模式下抛出了一个SyntaxError(!),这很能说明问题


显然,除非首先对
someExpr
进行评估,否则您无法猜测
for(varx in someExpr)
是否写得不正确。

能否解释一下这些设计的考虑因素?
这就是问题:为什么不一致?@raina77ow“我不认为这是这种行为背后的原因,可能是设计缺陷(不一致)“事实上,我看不出有任何不一致之处——这两种表达的目的完全不同,因此行为也完全不同。唯一的缺陷可能是相同的关键字,
中的
,同时用于这两个词。@Bergi是的,类似的,但他们仍然可以将其转换为对象。顺便说一句,在ES3中也是一样的。你的意思是(42中的k)
?字符串literal
'k'
在该位置甚至在语法上都无效。您所说的
with
是什么意思?