问题描述
在这里。在 Stack Overflow 上看到这个很有趣 :)
在逐步完成行为之前,澄清一些事情很重要:
例如:
(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
好的,我们开始吧。
誓言。
> function dis() { return this }
undefined
> five = dis.call(5)
[Number: 5]
定义一个函数dis
并用. 5
这将5
作为上下文
( this
) 执行函数。在这里,它被从 Number 值强制转换为 Number
对象。需要注意的是,如果我们处于严格模式, ,这一点非常重要。
> five.wtf = 'potato'
'potato'
> five.wtf
'potato'
现在我们将属性设置five.wtf
为'potato'
,并以五个作为对象,果然它接受了Simple
Assignment。
> five * 5
25
> five.wtf
'potato'
作为five
一个对象,我确保它仍然可以执行简单的算术运算。它可以。它的属性是否仍然存在?是的。
轮到。
> five++
5
> five.wtf
undefined
现在我们检查five++
. 后缀增量的技巧是整个表达式将根据原始值进行评估 ,然后
增加该值。看起来five
仍然是 5,但实际上表达式评估为 5,然后设置five
为6
。
不仅five
被设置为6
,而且还被强制转换回 Number 值,并且所有属性都丢失了。由于原语不能保存属性,five.wtf
因此未定义。
> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined
我再次尝试将属性重新分配wtf
给five
. 返回值暗示它粘住了,但实际上它并没有,因为five
它是一个 Number 值,而不是一个
Number 对象。该表达式的计算结果为'potato?'
,但是当我们检查时,我们发现它没有被赋值。
声望。
> five
6
自从后缀增量以来,five
一直是6
.
解决方法
最近的一条推文包含这段
JavaScript。
有人可以逐步解释其中发生的事情吗?
> function dis() { return this }
undefined
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
> five * 5
25
> five.wtf
"potato"
> five++
5
> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined
> five
6
特别是,我不清楚:
- 为什么 a 的结果
dis.call(5)
具有Number
某种[[PrimitiveValue]]
属性,但five++
and的结果five * 5
似乎只是普通数字5
和25
(而不是Number
s) - 为什么属性在增量
five.wtf
后消失five++
- 尽管赋值显然设置了值,但为什么在增量
five.wtf
之后该属性甚至不再可设置。five++``five.wtf = 'potato?'