为啥JS中数值类型已经可以使用Number方法,还要引入Number对象概念?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥JS中数值类型已经可以使用Number方法,还要引入Number对象概念?相关的知识,希望对你有一定的参考价值。

JS中数值类型已经可以使用Number方法,为什么还要引入Number对象概念呢?也就是说:
var n1 = 10;
var n2 = new Number(10)
n1 和 n2的区别在哪里呢,二者都可以:
n1.toString()
n2.toString()
结果都一样。
除了typeof不同。
另外Number.isInteger(n1) 返回true
而Number.isInteger(n2)却返回false,Number.isInteger()不是对象方法吗,怎么反而是false?
拜托高手帮忙解答,多谢了

javascript中,数值类型有两种表示方式:直接量和Number对象。这两种表示方式在大多数情况下是等价的,但是它们有一些重要的区别。
直接量(也称为原始值)表示一个数值常量,它直接写在代码中,例如10或者3.14。直接量是不可变的,它们是原始类型的值,不能调用方法,只能进行基本的运算。
Number对象表示一个数值,但是它是一个对象,而不是原始类型的值。Number对象可以调用方法来执行更高级的操作,比如转换为字符串、比较大小等。但是,由于Number对象是可变的,所以它的性能要比直接量差一些。
所以,通常来说,我们应该优先使用直接量来表示数值,只有在需要使用Number对象的方法时才使用Number对象。
对于上面的例子,n1和n2两者都可以调用toString()方法来将数值转换为字符串,但是n2是一个Number对象,所以它可以调用更多的方法。例如,使用Number.isInteger()方法检查一个数值是否为整数时,n1是直接量,所以它可以直接传入`Number
另外,由于Number.isInteger()方法是Number对象的一个静态方法,而不是实例方法,所以它无法直接在Number对象实例上调用。例如,在上面的例子中,Number.isInteger(n1)返回true,因为n1是一个直接量,它可以直接传入Number.isInteger()方法;而Number.isInteger(n2)返回false,因为n2是一个Number对象实例,而不是直接量,它不能直接传入Number.isInteger()方法。

总之,直接量和Number对象两者都可以表示数值,但是它们有一些重要的区别,应该根据实际情况来选择使用哪种方式。通常来说,我们应该优先使用直接量来表示数值,只有在需要使用Number对象的方法时才使用Number对象。
参考技术A

                                        数字类型、Number和new Number的区别

        不难看出三种类型都和数字相关,但是都有各自存在的意义,而且在实际前端开发中都比较常用。例如字符串类型数字转化为Number类型,方便计算价格等等。接下来做个全面讲解,结合源码和贴近开发案例。

1、 数字类型: let num1 = 100,在js中表示声明一个数字类型变量,实质上也是把数字转化成Numer对象,所以可以调用toString()方法,可以用来参与加减乘除的数学计算,例如num1 *1=100,num1+1=101,num1-1=99,num1 /1=100;

2、Number类型:用于将后端接口返回的字符串转化成数字类型,和定义数字变量全等关系,比如价格 let num2 = '100',除了显示在页面,还可以转化成数字类型 const num3 = Number(num2 ),还能保留有效小数位,比如const num3 = Number(num2 ).toFixed(2),输出结果 100.00;

3、new Number类型:new Number(100),是把数字字符串或者数字类型转化成Number对象,因为js的new Number()后的对象用于原型链(toString)自带方法,比如toString()、valueOf()和toLocaleString()等等,详情看下图;

new Number()创建对象后的结构

比较三者:

js代码

输出结果

总结:

从实际结果不难看出,num1和num2是数字类型,num3是对象,Number 和数字类型全等,二者和new Number结果不全等。值得关注的是,一个原始类型值并没有任何可用的方法,其使用的方法是包装对象原型上的,例如:(12).toFixed(),toFixed()实际上是在Number对象原型(prototype)中声明的方法。

本回答被提问者采纳

为啥js的==能自动转换类型呢?

你好,根据你的描述,我想你可以参考如下:

    ==符号在判断左右两边数据是否相等时,如果数据类型一致,直接比较值即可

    ==符号左右数据类型不一致时,如果两方数据为布尔型、数值型、字符串型时,不为数字的那一方自动调用Number()方法

Number(mix)使用方法如下

Number()使用规则


如果觉得满意,望采纳!提问者的点赞和采纳就是我们回答者的动力和追求,谢谢!

参考技术A 这里有个js的概念: 隐式类型转换。 当你使用比较运算符时,js会进行隐式类型转换。
如果你又问,为什么会隐式类型转换呢,那我只能回答:这是js语言本身的特性,内部约定的。
隐式类型转换是遵循一定原则的
1. 两个数字比较时是不存在隐式类型转换的
2. 数字和非数字比较时,会将非数字的一方隐式转换成数字,然后进行比较。
3. 两个字符串进行比较时, 会将其第一个字母转成对应的ASCII,然后进行比较, 比如 'a' > 'b', 会先将a 和 b 分别转换为其ASCII值: 97, 98, 因为 97 小于98,所以 'a' > 'b' 为 false。
4. 两个boolean 类型比较时,true会被转换成1,false 会被转换为 0。
5. 两个对象进行比较时,会先调用其 valueOf方法,然后再进行比较。

基本就这些了,更多这方面的知识,需要你自己去加深了解了。

以上是关于为啥JS中数值类型已经可以使用Number方法,还要引入Number对象概念?的主要内容,如果未能解决你的问题,请参考以下文章

C#,字符串“Number”转换为数值等于多少?为啥用Convert。ToDouble()无法转换???

js中为啥NaN的返回类型为number

vue前端表格展示number类型太长数值四舍五入为啥

js中数值的方法和属性总结

JS中六种数据类型——Number (转)

关于Js 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)