01 > function dis() { return this }
02 undefined
03 > five = dis.call(5)
04 Number {[[PrimitiveValue]]: 5}
05 > five.wtf = 'potato'
06 "potato"
07 > five.wtf
08 "potato"
09 > five * 5
10 25
11 > five.wtf
12 "potato"
13 > five++
14 5
15 > five.wtf
16 undefined
17 > five.wtf = 'potato?'
18 "potato?"
19 > five.wtf
20 undefined
21 > five
22 6
01声明了一个返回上下文对象的函数dis。它所代表的内容取决于您是否使用严格模式。如果函数声明为:
> function dis() { "use strict"; return this }
这在ES5规范的10.4.3节中有详细说明
如果函数代码是严格的代码,将ThisBinding设置为thisArg。
否则,如果thisArg为null或未定义,则将ThisBinding设置为全局对象。
否则,如果Type(thisArg)不是Object,将ThisBinding设置为ToObject(thisArg)。
02是函数声明的返回值。Undefined在这里应该是不言自明的。
当在原语值5的上下文中调用变量5时,用返回值dis初始化变量5。因为dis不是严格模式,所以这一行等同于调用five = Object(5)。
返回值为奇数Number {[[PrimitiveValue]]: 5},表示封装了原语值5的对象
5对象的WTF属性被赋值为'potato'
06是赋值的返回值,应该是不言自明的。
07五个对象的WTF属性正在检查中
八是五。WTF之前设置为“土豆”,它在这里返回“土豆”
5对象乘以原始值5。这与其他被相乘的对象没有什么不同,ES5规范的11.5节对此进行了解释。特别值得注意的是如何将对象转换为数值,这将在几节中介绍。
9.3,当时:
让primValue为ToPrimitive(输入参数,提示数字)。
返回,当时(primValue)。
9.1 ToPrimitive:
返回Object的默认值。通过调用对象的[[DefaultValue]]内部方法来检索对象的默认值,并传递可选提示PreferredType。内部方法[[DefaultValue]]的行为由8.12.8中所有原生ECMAScript对象的规范定义。
8月12日8 [DefaultValue]:
让valueOf是调用对象O的[[Get]]内部方法的结果,参数为valueOf。
如果IsCallable(valueOf)为真,则,
让val是调用valueOf的[[Call]]内部方法的结果,O作为this值和一个空参数列表。
如果val是一个基本值,则返回val。
这完全是一种迂回的方式,说明对象的valueOf函数被调用,该函数的返回值被用于方程中。如果你要改变valueOf函数,你可以改变操作的结果:
> five.valueOf = function () { return 10 }
undefined
> five * 5
50
10 as fives valueOf函数没有改变,它返回被包装的原语值5,因此5 * 5的结果为5 * 5,结果为25
11 5个对象的WTF属性被再次计算,尽管它从05分配时就没有改变。
12“土豆”
在5处调用后缀增量操作符,它获取数值(5,我们前面介绍过),存储值以便返回,在值(6)上加上1,将值赋给5,然后返回存储值(5)
14和前面一样,返回值是它被加一之前的值
15访问存储在变量5上的原语值(6)的WTF属性。ES5规范的15.7.5节定义了这种行为。数字从Number.prototype中获取属性。
16号。Prototype没有WTF属性,因此返回undefined
17 5。WTF被赋值为'potato?'。赋值在ES5规范的11.13.1中定义。基本上,赋值会被返回,但不会被存储。
18“土豆吗?'由赋值操作符返回
19再次访问值为6的5,并再次访问Number。Prototype没有WTF属性
20未定义如上所述
21五被访问
22返回6,如13所述