为什么JavaScript原语不是Objectof?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么JavaScript原语不是Objectof?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2300字,纯文字阅读大概需要4分钟。
内容图文
![为什么JavaScript原语不是Objectof?](/upload/InfoBanner/zyjiaocheng/698/1e6d8bbbdff640ddb025a7bf40667008.jpg)
今天我碰巧有太多的时间来杀死,我用Node(v0.10.13)命令行玩了一下:
> 1 instanceof Object
false
> (1).__proto__
{}
> (1).__proto__ instanceof Object
true
> (1).__proto__.__proto__ === Object.prototype
true
现在,根据MDN,instanceof的作用是:
The instanceof operator tests whether an object has in its prototype
chain the prototype property of a constructor.
但很明显,Object.prototype IS在1的原型链中.那么为什么1 instanceof Object为false?也许是因为1是一个原始而不是一个开始的对象?
好的,我接受了,我做了更多测试:
> (1).__proto__ === (2).__proto__
true
> 'a'.__proto__ === 'b'.__proto__
true
> (1).__proto__ === 'a'.__proto__
false
> (1).__proto__.__proto__ === 'a'.__proto__.__proto__
true
> (1).__proto__.type = 'number'
'number'
> 'a'.__proto__.type = 'string'
'string'
> (2).type
'number'
> (1.5).type
'number'
> 'b'.type
'string'
显然,所有数字基元都从一个对象继承,并且所有字符串基元都从另一个对象继承.这两个对象都继承自Object.prototype.
现在的问题是,如果数字和字符串被认为是原语,为什么要从其他对象继承它们?或者相反,当它们从其他对象继承时,为什么不考虑它们呢?对我来说,对象的孩子不是对象似乎是荒谬的.
顺便说一句,我也在Firefox 22中测试了这些并得到了相同的结果.
解决方法:
你被一种通常被称为“拳击”(c# related article,java related article)的机制所欺骗,这种机制会使所有遇到它的人陷入困境.你在开始时得到了正确的答案:
Perhaps because 1 is a primitive not an object to begin with?
正是如此.但是,原语如何能够包含方法?它们如何包含属性?毕竟,在js中,它们代表最低级别(见#4.3.2).要使这些值实际有用,无论何时执行primitive.property,都会发生以下情况(#11.2.1):
Object(primitive).property;
换句话说,js有自动装箱.这可以使用我最喜欢的技巧证明:
var primitive = 'food';
primitive.isPizza = true; //yummy
console.log(primitive.isPizza); //undefined. where did my pizza go!?
primitive.isPizza因为这个拳击而消失了:
var primitive = 'food';
Object(primitive).isPizza = true;
console.log(Object(primitive).isPizza);
盒装基元是它自己独特的雪花 – 当你第二次装盒时,它并不是指相同的东西.盒装值很快就会被GCd所遗忘,并在时间的迷雾中被遗忘.
如果你的原语不是原始的,那就不会发生这种情况:
var obj = new String('food');
obj.isPizza = true;
console.log(obj.isPizza); //true
这是否意味着你应该只使用对象,而不是原始对象?不,原因很简单,你需要在元素上存储元数据的时间非常少而且对象复杂化:
obj === primitive; //false, obj is an object, primitive is a primitive
内容总结
以上是互联网集市为您收集整理的为什么JavaScript原语不是Objectof?全部内容,希望文章能够帮你解决为什么JavaScript原语不是Objectof?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。