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

Javascript 为什么`Object.prototype.toString.call(null)`在非严格模式下工作?,javascript,ecmascript-5,Javascript,Ecmascript 5,为什么在ES5非严格模式下会出现以下结果 Object.prototype.toString.call(null); => [object Null] 鉴于此 Object.prototype.toString.call(window); => [object global] 这两行在非严格模式下不应该相同吗,因为someFunction.callnull应该等同于someFunction,而someFunction应该等同于someFunction.callwindow?根据E

为什么在ES5非严格模式下会出现以下结果

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

Object.prototype.toString.call(window);
=> [object global]
这两行在非严格模式下不应该相同吗,因为someFunction.callnull应该等同于someFunction,而someFunction应该等同于someFunction.callwindow?

根据ES5,在非严格模式下:

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

因此,是的,这似乎应该默认为全局对象。但其中有:

thisArg值作为this值在未经修改的情况下传递。这是对第3版的更改,其中未定义或空thisArg被替换为全局对象,ToObject应用于所有其他值,结果作为This值传递

最后:

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

If the this value is undefined, return "[object Undefined]".
If the this value is null, return "[object Null]".
根据ES5,当处于非严格模式时:

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

因此,是的,这似乎应该默认为全局对象。但其中有:

thisArg值作为this值在未经修改的情况下传递。这是对第3版的更改,其中未定义或空thisArg被替换为全局对象,ToObject应用于所有其他值,结果作为This值传递

最后:

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

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

这只适用于普通的方法调用,当您使用call方法时,您显式地设置This对象,这正是call方法的原因。因此,我认为问题中显示的结果是正确的;输出窗口。调用方法不重写非严格模式规则。@HBP已修复。self注意:首先检查规范。在任何处于非严格模式的ES5浏览器中,Object.prototype.toString以外的任何函数的callnull都在窗口对象的上下文中运行。免责声明:我所说的任何浏览器都是指在最新版本的Firefox、Chrome和Safari中测试过的浏览器。我所说的任何函数都是指我尝试过的任何函数。@NathanWall-我认为关键在于function.prototype.call调用相关对象的内部[[call]]方法。正是这个内部方法决定了如何处理这个对象。描述函数对象的内部[[Call]]方法,但Array.prorotype.slice不是函数对象,它是内置方法,请参阅。我看不出内部[[Call]]是在哪里描述的。这只适用于普通的方法调用,当您使用Call方法时,您显式地设置了This对象,这正是调用方法的原因。因此,我认为问题中显示的结果是正确的;输出窗口。调用方法不重写非严格模式规则。@HBP已修复。self注意:首先检查规范。在任何处于非严格模式的ES5浏览器中,Object.prototype.toString以外的任何函数的callnull都在窗口对象的上下文中运行。免责声明:我所说的任何浏览器都是指在最新版本的Firefox、Chrome和Safari中测试过的浏览器。我所说的任何函数都是指我尝试过的任何函数。@NathanWall-我认为关键在于function.prototype.call调用相关对象的内部[[call]]方法。正是这个内部方法决定了如何处理这个对象。描述函数对象的内部[[Call]]方法,但Array.prorotype.slice不是函数对象,它是内置方法,请参阅。我看不出内部[[Call]]是在哪里描述的。