为什么`Object.prototype.toString.call(null)`在非严格模式下工作?

时间:2012-10-31 06:25:03

标签: javascript ecmascript-5

为什么以下是ES5非严格模式的结果?

Object.prototype.toString.call(null);
=> [object Null]

鉴于

Object.prototype.toString.call(window);
=> [object global]

两条线在非严格模式下不应该相同,因为someFunction.call(null)应该等同于someFunction(),它应该等同于someFunction.call(window)吗?

1 个答案:

答案 0 :(得分:4)

根据ES5,entering function code处于非严格模式时:

  

否则如果thisArg为null或未定义,则将ThisBinding设置为全局对象。

所以是的,似乎this应该默认为全局对象。 §15.3.4.4 Function.prototype.call中有:

  

thisArg值未经修改即作为此值传递。这是对第3版的更改,其中未定义或null thisArg替换为全局对象,ToObject应用于所有其他值,并将结果作为此值传递。

最后:

  

15.2.4.2 Object.prototype.toString ()

     

调用toString方法时,将执行以下步骤:

If the this value is undefined, return "[object Undefined]".
If the this value is null, return "[object Null]".