Number(1) 与 new Number(1) 为什么两者会不一样
发布于 8 个月前 作者 nqdy666 939 次浏览 来自 问答
var a = Number(1) // 1
var b = new Number(1)  // Number {[[PrimitiveValue]]: 1}
typeof (a) // number
typeof (b) // object
a == b // true

Number和类型number是什么关系,为什么Number(1)结果是类型是number,而new Number(1)不是? Number内部实现大概是怎么样的? 为什么 new Number(1) 产生的类型是object。object类型的数字有什么使用场景? 对象1 == 数值1 为什么结果会是true? ==运算符大致是怎么实现?

9 回复

== 会自动转换类型 number 是基本类型之一, 同样的还有string, boolean等, 类似C语言的基础类型 Number是基本类型的封装类,是一个对象 number是放在堆栈上的, Number是放在堆里面的 这跟java的int跟Integer的区别类似

@151263

number是放在堆栈上的, Number是放在堆里面的

这句话能再详细解释一下么?

Number是构造函数。 当没有new操作符时,当成普通函数调用,用来执行类型转换(尝试将传入的参数值转换成数字,参数如果无法转换成数字则返回NaN),结果要么是数字要么是NaN(NaN也是一种特殊的数字)。 使用new操作符,则返回对象(new的功能就是创建对象的)。 typeof 的结果就很显然了。 两者为什么相等? 隐式类型转换,可查看具体的转换规则。 (话说转换规则好多,逃~)

根据ECMAScript规范,有6种原始类型(primitive type):Number, Boolean, String, null, undefined, Symbol。由原始类型创造出来的是原始值,原始值不是对象。 而用new Number(1)创造出来的是对象,故而和Number(1)创造出来的(原始值)是两个概念。

不过当年JS设计的时候太匆忙,以至于typeof null返回的是"object"而不是正确的"null",不过这已经不能修改了,否则会引起兼容性问题。

一个是包装对象, 一个是Number类型 == 会类型转换

@nqdy666 程序内存分为栈内存, 和堆内存, 基础类型会放在栈上,固定内存长度, 对象的引用也会放在栈上, 对象的实际存储空间则是在堆上, boolean number char 这种基础类型, 则只会在栈中以固定长度的形式存在, 比如char只占用一个字节 再比如: number 是基础类型, 只会占用栈内存, 但是 Number类型, 则不是基础类型, 而是基础类型的包装类, 对象的引用4个字节或8个字节放在栈上, 实际则储存在堆上 所以, 基础类型占用的内存通常更少, 效率更高, 而且不用垃圾回收, 但是,栈空间是的长度是不可以在运行时改变的, 提前分配好的, 也就没那么灵活, 堆内存更灵活, 但就需要垃圾回收, 否则就像C++那样,需要手工分配,手工回收

@151263 谢谢你。不过javascript没有char类型把

回到顶部