扫码关注官方订阅号
window.toString =>function () { [native code] } window.toString() =>"[object Window]" 原理是什么?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
它们是一样的哦。
不加括号的时候,你看到的返回结果是函数体本身。至于 [native code],可能是因为这些方法在底层的实现不是 Javascript 而是 C/C++ 之类的,所以浏览器是显示不出来的。另外,这个函数体实际上是 Object.prototype.toString 方法原型继承来的。
Object.prototype.toString
加括号的时候,你看到的是函数体求值(Evaluation)后的结果,toString 这个方法原本的功能就是返回一个字符串形式的对象表征,所以 window 这个对象显示结果为 [object Window] 就再正常不过啦!
toString
window
[object Window]
注意,window 和 Window 首字母大小写不一样,后者是前者的构造函数,前者是后者的实例。
Window
如果你对 [native code] 是什么真的很感兴趣,你可以去看这些浏览器(Google V8/Mozilla SpiderMonkey)的开源源代码,就能看到这些方法的底层实现了。BTW,这些实现基本上都是遵循标准的,较新的版本遵循的标准是 ECMAScript 5。也就是说,你也可以去看标准,里面有对每一个原生方法的实现描述(伪代码)。
我不知道你问的原理是啥,如果你说的是为啥两个结果不一样,那 @nightire 已经解释的比较清楚了,一个是在打印function本身,加了括号以后打印的是返回值。我就随便说些有趣的事吧(chrome浏览器)
window.toString === Window.prototype.toString 嗯,window对象的toString方法不是Object.protoype继承来的,而是就在Window自己的原型上的。那么为啥要覆盖呢?估计是因为要返回[object Window]这个字符串。得益于JS是一门很赖皮的语言,我们可以看一下Object.prototype.toString放在window上会怎样
window.toString === Window.prototype.toString
Object.protoype
> Object.prototype.toString.call(window) "[object global]"
没想到吧,反正我也没想到,简直不明觉历。于是果断开Node撸一把
> root.toString() '[object global]' > root.toString === Object.prototype.toString true
嗯,估计就是V8引擎干的事儿了,得益于强大的github,只要搜索V8的源代码,我们直接就能找到相关的testcase
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
它们是一样的哦。
不加括号的时候,你看到的返回结果是函数体本身。至于 [native code],可能是因为这些方法在底层的实现不是 Javascript 而是 C/C++ 之类的,所以浏览器是显示不出来的。另外,这个函数体实际上是
Object.prototype.toString方法原型继承来的。加括号的时候,你看到的是函数体求值(Evaluation)后的结果,
toString这个方法原本的功能就是返回一个字符串形式的对象表征,所以window这个对象显示结果为[object Window]就再正常不过啦!注意,
window和Window首字母大小写不一样,后者是前者的构造函数,前者是后者的实例。如果你对 [native code] 是什么真的很感兴趣,你可以去看这些浏览器(Google V8/Mozilla SpiderMonkey)的开源源代码,就能看到这些方法的底层实现了。BTW,这些实现基本上都是遵循标准的,较新的版本遵循的标准是 ECMAScript 5。也就是说,你也可以去看标准,里面有对每一个原生方法的实现描述(伪代码)。
我不知道你问的原理是啥,如果你说的是为啥两个结果不一样,那 @nightire 已经解释的比较清楚了,一个是在打印function本身,加了括号以后打印的是返回值。我就随便说些有趣的事吧(chrome浏览器)
window.toString === Window.prototype.toString嗯,window对象的toString方法不是Object.protoype继承来的,而是就在Window自己的原型上的。那么为啥要覆盖呢?估计是因为要返回[object Window]这个字符串。得益于JS是一门很赖皮的语言,我们可以看一下Object.prototype.toString放在window上会怎样没想到吧,反正我也没想到,简直不明觉历。于是果断开Node撸一把
嗯,估计就是V8引擎干的事儿了,得益于强大的github,只要搜索V8的源代码,我们直接就能找到相关的testcase