今天正好有太多的时间可以消磨,我在Node(v0.10.13)命令行上玩了一下:
> 1 instanceof Object
false
> (1).__proto__
{}
> (1).__proto__ instanceof Object
true
> (1).__proto__.__proto__ === Object.prototype
true
现在,根据MDN,instanceof
它的作用是:
instanceof 运算符测试对象的原型链中是否具有构造函数的原型属性。
但显然Object.prototype
IS 在1
的原型链中。那么为什么是1 instanceof Object
假的呢?也许是因为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 中测试了这些并得到了相同的结果。