OP。在Stack Overflow上看到这个很有趣:)
在详细介绍这种行为之前,有几件事是很重要的:
Number value and Number object (a = 3 vs a = new Number(3)) are very different. One is a primitive, the other is an object. You cannot assign attributes to primitives, but you can to objects.
Coercion between the two is implicit.
For example:
(new Number(3) === 3) // returns false
(new Number(3) == 3) // returns true, as the '==' operator coerces
(+new Number(3) === 3) // returns true, as the '+' operator coerces
Every Expression has a return value. When the REPL reads and executes an expression, this is what it displays. The return values often don't mean what you think and imply things that just aren't true.
好了,开始吧。
承诺。
> function dis() { return this }
undefined
> five = dis.call(5)
[Number: 5]
定义一个函数dis并使用5调用它。这将以5作为上下文(This)执行函数。这里它是从一个Number值强制转换为一个Number对象。需要注意的是,如果我们处于严格模式,这种情况就不会发生。
> five.wtf = 'potato'
'potato'
> five.wtf
'potato'
现在我们设置属性5。wtf转换为'potato',并以5作为对象,它当然接受简单赋值。
> five * 5
25
> five.wtf
'potato'
以5为对象,我确保它仍然可以执行简单的算术运算。它可以。它的属性仍然存在吗?是的。
把。
> five++
5
> five.wtf
undefined
现在我们检查5++。后缀增量的技巧是,整个表达式将根据原始值求值,然后再增加该值。看起来5还是5,但实际上表达式的值是5,然后把5设为6。
不仅5被设置为6,而且它还被强制返回为Number值,所有属性都丢失了。由于原语不能保存属性,所以是5。WTF未定义。
> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined
我再次尝试将属性wtf重新分配给5。返回值表明它是固定的,但实际上不是,因为five是一个Number值,而不是一个Number对象。表达式的计算结果是'potato?’,但当我们检查时,我们发现它没有分配。
信誉。
> five
6
从后缀的增量开始,5就变成了6。