Why are JavaScript primitives not instanceof Object?

隐身守侯 提交于 2019-12-01 03:58:44
Zirak

You have been tricked by a mechanism commonly known as "boxing" (c# related article, java related article) which mesmerises all who come across it. You had the correct answer in the beginning:

Perhaps because 1 is a primitive not an object to begin with?

Exactly so. However, how can primitives ever be able to contain methods? How can they contain properties? After all, in js, they are represented at the lowest level possible (see #4.3.2). To make these values actually useful, whenever you do primitive.property, the following happens (#11.2.1):

Object(primitive).property;

In other words, js has automatic boxing. This can be proven using one of my favourite tricks:

var primitive = 'food';
primitive.isPizza = true; //yummy
console.log(primitive.isPizza); //undefined. where did my pizza go!?

primitive.isPizza disappeared because of this boxing:

var primitive = 'food';
Object(primitive).isPizza = true;
console.log(Object(primitive).isPizza);

The boxed primitive is its own unique snowflake - when you box it a second time, it does not refer to the same thing. The boxed values are quickly GCd and forgotten in the mists of time.

This does not happen if your primitive isn't, well, a primitive:

var obj = new String('food');
obj.isPizza = true;
console.log(obj.isPizza); //true

Does this mean you should only use objects, never primitives? Nope, for the simple reason that the times you do need to store meta-data on primitives are very far and few, and objects complicate things:

obj === primitive; //false, obj is an object, primitive is a primitive
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!