为何Object.getPrototypeOf(5)与5.__proto__结果不同?
问题解答
核心原因:原始值的自动装箱与语法解析规则
- 先纠正一个表述偏差:
Object.getPrototypeOf(5)返回的不是Number构造函数,而是Number.prototype——这是所有Number包装对象的原型。 - 数字
5属于JS的原始值(primitive value),本身并非对象,天然没有__proto__属性。
1. Object.getPrototypeOf(5)的执行逻辑
当给Object.getPrototypeOf传入原始值时,JS引擎会自动触发自动装箱(autoboxing):把原始值5转换为对应的包装对象new Number(5),再获取该包装对象的原型,最终得到Number.prototype。
2. 5.__proto__报错的原因
JS语法解析器会把紧跟在数字后的.识别为小数点,而非对象属性访问符。因此5.__proto__会被解析成「数字5.加上__proto__」,不符合数字的语法规范,直接抛出语法错误。
3. 正确获取原始值对应原型的方式
若要通过__proto__获取,需用语法明确告知解析器这是属性访问操作:
- 给原始值加括号:
(5).__proto__ - 使用两个小数点:
5..__proto__(第一个是小数点,第二个是属性访问符)
这两种写法都会触发自动装箱,最终得到的结果和Object.getPrototypeOf(5)完全一致,都是Number.prototype。
4. 普通对象的差异
普通对象本身就是引用类型,不存在装箱操作,Object.getPrototypeOf(obj)和obj.__proto__直接指向同一个原型对象,因此二者严格相等。
内容的提问来源于stack exchange,提问作者santosh yadav
相关产品推荐
相关产品推荐

