JavaScript数据类型转换
1065 字
5 分钟
JavaScript数据类型转换
JavaScript数据类型转换 有时候需要强制转换,有时候JavaScript会自己进行隐式转换,此时就得注意了。
'1' == 1 //true'' == null //false'' == 0 //true[] == 0 //true[] == '' //true[] == ![] //truenull == undefined //trueNumber(null) //0Number('') //0parseInt('') //NaN{}+10 //10
let obj = { [Symbol.toPrimitive](){ return 200 }, valueOf() { return 300 }, toString(){ return 'Hello' }}console.log(obj+200) //400强制类型转换
强制类型转换方式包括Number()、parseInt()、parseFloat()、toString()、String()、Boolean(),这些方法都比较相似,就是通过自身的方法来进行数据类型的强制转换。
Number()强制转换
- 布尔值,true转换为1,false转换为0
- 数字返回自身。
- null返回0
- undefined返回NaN
- 如果是字符串
- 如果字符串中只包含数字(或是0x/0X开头数字可以有正负)将其转换为十进制
- 如果字符串中包含有效的浮点格式,转化为浮点数
- 如果是空字符串,转换为0
- 如果不是以上的,返回NaN
- 如果是Symbol,抛出错误
- 如果是对象,并且部署了[Symbol.toPrimitive],调用对象的valueOf()方法,然后根据前面的规则转换返回的值,如果转换的结果是NaN,那么调用对象的toString方法,再次按前面的顺序返回对应的值。
Number(true); // 1Number(false); // 0Number('0111'); //111Number(null); //0Number(''); //0Number('1a'); //NaNNumber(-0X11); //-17Number('0X11') //17Boolean()方法的强制转换规则
undefined, null, false, ”, 0(+0,-0), NaN转换的是false,其他转换的都是true。
Boolean(0) //falseBoolean(null) //falseBoolean(undefined) //falseBoolean(NaN) //falseBoolean(1) //trueBoolean(13) //trueBoolean('a') //trueparseInt()
直接转换
parseInt("1234blue"); //returns 1234parseInt("0xA"); //returns 10parseInt("22.5"); //returns 22parseInt("blue"); //returns NaN根据进制转换
parseInt("AF", 16); //returns 175parseInt("10", 2); //returns 2parseInt("10", 8); //returns 8parseInt("10", 10); //returns 10parseFloat()
跟parseInt()基本一样,不过是转换浮点数,但是没有进制转换的功能
parseFloat("1234blue"); //returns 1234.0parseFloat("0xA"); //returns NaNparseFloat("22.5"); //returns 22.5parseFloat("22.34.5"); //returns 22.34parseFloat("0908"); //returns 908parseFloat("blue"); //returns NaNtoString()
对于原始类型,null转化成”null” , undefined转换成 “undefined”, true转换成“true”, false转化成“false”, 数字除了极大和极小的数字采用指数形式。
var a = 1.07*1000*1000*1000*1000*1000*1000*1000a.toString() //"1.07e21"var b = 15b.toString() //"15"对普通对象来说,除非自行定义,否则toString()返回内部属性Class的值,如”[object Object]”
let a = { name:"a"}a.toString() //"[object Object]"数组对象重写了toString方法,把每个位置的都转换成字符串然后用,拼接
var a = [1,2,3]a.toString() //1,2,3String()
和toString()的转换基本上是一样的,只不过toString没办法直接转换原始类型,只能转换经过js包装的对象。
11.toString() //报错String(11) //"11"隐式类型转换
通过逻辑运算符(&&,||,!),运算符(+,-,*,/),关系操作符(>,<,<=,>=),相等运算符(==)或者if/while条件操作,如果遇到两个数据类型不同的情况,都会出现隐式转化。
==的隐式类型转换规则
- 如果类型相同,无需进行转换
- 如果其中一个值是null或者undefined,那么另一个操作符必须也是null或者undefined,不然返回的就是false不是true
- 如果其中一个是Symbol类型,那么返回false
- 两个操作值如果一个为String类型一个为Number类型,那么会将String类型转换为Number类型
- 如果一个操作值是boolean,会被转换成number
- 如果一个操作值是object,另一个操作值是string/number/symbol,就会把object转换为原始类型再进行判断(调用object的valueOf/toString方法进行转换)
null == undefined // true 规则2null == 0 // false 规则2'' == null // false 规则2'' == 0 // true 规则4 字符串转隐式转换成Number之后再对比'123' == 123 // true 规则4 字符串转隐式转换成Number之后再对比0 == false // true e规则 布尔型隐式转换成Number之后再对比1 == true // true e规则 布尔型隐式转换成Number之后再对比var a = { value: 0, valueOf: function() { this.value++; return this.value; }};// 注意这里a又可以等于1、2、3console.log(a == 1 && a == 2 && a ==3); //true f规则 Object隐式转换// 注:但是执行过3遍之后,再重新执行a==3或之前的数字就是false,因为value已经加上去了,这里需要注意一下文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
JavaScript数据类型转换
https://an2333.com/posts/frontend/javascript/data-transform/相关文章智能推荐
1
JavaScript数据类型检测
前端基础JavaScript中数据类型分为原始类型(number、string、boolean、null、undefined、bigint和symbol)和对象(Arr…
2
JavaScript 变量提升
前端基础理解了 JavaScript 执行上下文,才能更好的理解 JavaScript 语言本身,比如变量提升,作用域和闭包等。
3
JavaScript原型链
前端基础从一个构造函数和实例的角度来看原型链关系
4
为什么 JavaScript 会栈溢出
前端基础先回答问题:造成栈溢出的原因就是调用栈中的执行上下文堆叠过多没有返回。
5
从执行上下文的角度讲解 this
前端基础JavaScript 的作用域链由词法作用域决定,为什么还需要 this,以及 this 在不同执行上下文中的指向。
随机文章随机推荐














