其他人的回覆是正确的,我是来补充一下的。 数字、字符串、布尔三者,在JS中称为原始的(primitives)资料类型,再加上null与undefined也是。除了这些类型外,其他的都是对象。(注: ES6的Symbol是新加的原始资料类型) 包装对象 对象中有一类是Number, String, Boolean这三个对象,分别对应数字、字符串、布尔类型,我们称它们为包装对象或包装类型(Wrappers),很少会直接使用到它们,在很多情况下也尽量避免使用它们。 包装类型与原始资料类型之间的正确转换方式如下: 原始->包装: new Number(123) 包装->原始: (new Number(123)).valueOf() 包装对象是个对象,所以它与原始资料类型并不相同,用typeof与instanceof都可以检测出来: typeof 123 // "number" typeof new Number(123) // "object" 123 instanceof Number // false (new Number(123)) instanceof Number // true 123 === new Number(123) // false 作为对象来进行比较,因为对象是参照的,不同的对象不可能相等: var a = new Number(123); var b = new Number(123); a === b; // false a == b; // false var a = 123; var b = 123; a === b; // true a == b; // true 原始资料类型的方法与属性是"借"来的 一个原始的资料类型值,并没有如对象会有属性或方法,原始的资料类型在运算时用的属性与方法,是向包装对象"借来"的用的,这是JS中的设计。例如一个数字的(123).toFixed(),toFixed()实际上是在Number对象原型(prototype)中声明的方法。这可以用简单的代码判断出来: (123).toFixed === Number.prototype.toFixed // true "abc".charAt === String.prototype.charAt // true JS总是会求值出原始资料,而不是包装对象 因为包装对象的设计目的,主要是让原始资料使用,所以在求值过程中,总是会强制转为原始资料而非对象,例如下面的代码: var a = new Number(12); var b = a + 3; typeof b; // number 字符串的情况与数字相似不再多说。 但要注意的是布尔的包装对象Boolean的对象实例,因为对象只有在null与undefined时,才会认定为布尔的false值,布尔包装对象本身是个对象,对象->布尔 都是true,所以new Boolean(false)其实是布尔的true,下面这个代码是有大坑的陷阱: if(new Boolean(false)){ alert('true!!'); } 如果你头会昏的话,不要用这个new Boolean()的用法就对了 只有使用了valueOf后才是真正的转换布尔值,与上面包装对象与原始资料转换说明的相同: !!(new Boolean(false)) //true (new Boolean(false)).valueOf() //false 调用Number、String、Boolean函数,是转换其他类型到这个类型的语法 我有看到有网友们回答了,在不使用new关键字作建构对象实例时,使用像Number(123)这样的语法,这是一种从其他资料类型要转到数字类型的函数调用语法。调用后仍然是原始资料类型,并不会产生包装对象实例,用下面代码来说明: var a = Number(123); typeof a; // "number" var b = Number('1.99'); typeof b; // "number" 在ECMASCript标准中分别都有定义的对照表: ToNumber、ToString、ToBoolean。 不过,一般很少用这种转换函数的调用,书上或网上都有教其他的转换语法,虽然与转换函数仍有细部不同。不过一般情况都很常见。以下举这三种的转换语法: 转为数字 +'123.456' //浮点数,这用的是一元正号(+),相同于Number('123.456') ~~'123.456' //整数,双波浪符(~) 转为字符串 '' + value //加号是字符串优先,加一个空字符串 转为布尔 !!(0) //双逻辑否(!)
我第一眼看到也是感觉就是一样 在控制台打1 === Number(1) 也是true然后和同事讨论了一下, 目前看来唯一的区别就是var a = 1 是一个常量, 而Number(1) 是一个函数, 当1 === Number(1) 做判断的时候也是拿Number的执行结果进行对比, 所以这就是根本的区别
当Number被调用时,如果有参数,就会对参数执行toNumber方法toNumber方法被调用时,如果参数是数字,直接返回参数(不经过转换).所以如果Number被调用时参数是数字,其实相当于 function Number(arg){ return arg } 详见ECMAScript-262规范 : Number构造器 toNumber方法
其他人的回覆是正确的,我是来补充一下的。
数字、字符串、布尔三者,在JS中称为原始的(primitives)资料类型,再加上
null
与undefined
也是。除了这些类型外,其他的都是对象。(注: ES6的Symbol是新加的原始资料类型)包装对象
对象中有一类是Number, String, Boolean这三个对象,分别对应数字、字符串、布尔类型,我们称它们为包装对象或包装类型(Wrappers),很少会直接使用到它们,在很多情况下也尽量避免使用它们。
包装类型与原始资料类型之间的正确转换方式如下:
原始->包装: new Number(123)
包装->原始: (new Number(123)).valueOf()
包装对象是个对象,所以它与原始资料类型并不相同,用
typeof
与instanceof
都可以检测出来:作为对象来进行比较,因为对象是参照的,不同的对象不可能相等:
原始资料类型的方法与属性是"借"来的
一个原始的资料类型值,并没有如对象会有属性或方法,原始的资料类型在运算时用的属性与方法,是向包装对象"借来"的用的,这是JS中的设计。例如一个数字的
(123).toFixed()
,toFixed()
实际上是在Number
对象原型(prototype)中声明的方法。这可以用简单的代码判断出来:JS总是会求值出原始资料,而不是包装对象
因为包装对象的设计目的,主要是让原始资料使用,所以在求值过程中,总是会强制转为原始资料而非对象,例如下面的代码:
字符串的情况与数字相似不再多说。
但要注意的是布尔的包装对象
Boolean
的对象实例,因为对象只有在null
与undefined
时,才会认定为布尔的false
值,布尔包装对象本身是个对象,对象->布尔 都是true
,所以new Boolean(false)
其实是布尔的true
,下面这个代码是有大坑的陷阱:只有使用了
valueOf
后才是真正的转换布尔值,与上面包装对象与原始资料转换说明的相同:调用Number、String、Boolean函数,是转换其他类型到这个类型的语法
我有看到有网友们回答了,在不使用
new
关键字作建构对象实例时,使用像Number(123)
这样的语法,这是一种从其他资料类型要转到数字类型的函数调用语法。调用后仍然是原始资料类型,并不会产生包装对象实例,用下面代码来说明:在ECMASCript标准中分别都有定义的对照表: ToNumber、ToString、ToBoolean。
不过,一般很少用这种转换函数的调用,书上或网上都有教其他的转换语法,虽然与转换函数仍有细部不同。不过一般情况都很常见。以下举这三种的转换语法:
转为数字
转为字符串
转为布尔
我第一眼看到也是感觉就是一样
在控制台打1 === Number(1) 也是true
然后和同事讨论了一下, 目前看来唯一的区别就是
var a = 1 是一个常量, 而Number(1) 是一个函数,
当1 === Number(1) 做判断的时候也是拿Number的执行结果进行对比,
所以这就是根本的区别
估计就是执行上的问题了吧。
1是Number类型,是常量。
Number(1)是对1执行Number类包装,会对传入的参数去两侧空格,去掉引号,如果是纯数字,则返回纯数字,否则返回NaN
当Number被调用时,如果有参数,就会对参数执行toNumber方法
toNumber方法被调用时,如果参数是数字,直接返回参数(不经过转换).
所以如果Number被调用时参数是数字,其实相当于
详见ECMAScript-262规范 : Number构造器 toNumber方法
难道不是
1
和new Number(1)
吗我这样理解的。
1 是常量;
Number(1)是 调用Number(1)的返回值。
从原型角度考虑呢,1.__proto__会报错,Number(1).__proto__不会报错
Number
不加new
调用是转换函数,如果是Number
实例则直接返回,否则转换成等价的Number
表示形式。Number(1)的返回值为1,一个是num 一个是function
原始类型本身没有属性和方法,当原始类型使用方法时 123.tofixed(),会将原始类型转换成对应的包装对象(这个过程叫装箱),而输出的时候再把包装对象转换回原始类型(这个叫拆箱)
这是一个考查基本功的好问题
该答案已被忽略,原因:无意义的内容,赞、顶、同问等毫无意义的内容