JavaScript类型转换

一些需要注意的数据类型:

  • NaN的数据类型是number
  • Array、Date、null的数据类型是object
  • 未定义变量的数据类型是undefined

自动转换类型:尝试操作一个 "错误" 的数据类型时,会自动转换为 "正确" 的数据类型。

复制代码
 5 + null    // 返回 5         null 转换为 0     
 "5" + null  // 返回"5null"    null 转换为 "null"
 "5" + 1     // 返回 "51"      1 转换为 "1"  
 "5" - 1     // 返回 4         "5" 转换为 5

==运算符的隐式类型转换规则

1.类型转换:两个操作数的类型不同,js会尝试转换成相同的类型。

2.原始类型比较:两个操作数的类型都是原始类型(如数组、字符串、布尔值),它们会被转换成相同的类型,再进行比较。

3.nullundefined比较:被视为相等。

4.字符串和数字比较:js会将字符串转换成数字,再进行比较。如果字符串不能转换成有效的数字,则结果为false

5.布尔值比较:一个是布尔值,一个非布尔值,则布尔值会被转换成数字,再进行比较。true为1,false为0。

6.对象和原始类型比较:对象通过ToPrimitive转换成原始类型,再进行比较。通常涉及到对象的valueOf()toString()方法。

复制代码
 ToPrimitive(obj, Number) ==> Number({})
 //1.如果 obj 是基本类型,直接返回
 //2.否则,调用 valueOf 方法,如果得到原始值,则返回
 //3.否则,调用 toString 方法,如果得到原始值,则返回
 //4.否则,报错

7.NaN比较:NaN与任何值比较都返回false,包括NaN自己。

在写代码时,最好使用===来避免隐式类型转换并确保类型和值都相等。

[] == ![]返回true

关系转换图如下:

[]![]都是对象,!的优先级大于==,要先进行非运算。

!会进行两步操作:

  • 1.对!后面的操作数转换成布尔值
  • 2.将这个布尔值取反

则将[]转换成布尔值,根据官方文档可知,任何对象转换成布尔值都是true ,所以![]false

则原式变为[] == false,一个是对象一个是布尔值,则都会转换成数字进行比较。[]经过ToPrimitive会被转换成字符串""。再将等号两边的字符串""和布尔值false转换成数字 0 ,得到 0 == 0 ,打印得到 true

复制代码
 //执行过程
 [] == ![]
 [] == !true // 将空数组这个对象类型转换成布尔值
 [] == false // ! 运算符对 true 进行取反
 '' == false // 对 [] 进行 ToPrimitive 操作,返回一个空对象 
 0 == 0 // 将等号两边都转换成数字类型
字符串转换成数字

js在将字符串转换成数字时,它会查看字符串的内容。如果表示一个有效的数字则会转换成数字,不是则转换成NaN

Q:\t == 0是为什么?

  • 有些特殊含义的字符会被转换成数字0,\t \n \r在进行字符串转换数字时都是0。
  • 还有种说法是:字符串在toNumber()时会首先去除空格,再判断该数字是否为非数字。如果NaN,则结果为``NaN;如果字符串为空则结果为0。

可以多看看这张图:

下图是使用不同的值转换为数字,字符串,布尔值:

相关推荐
拉不动的猪5 分钟前
管理不同权限用户的左侧菜单展示以及权限按钮的启用 / 禁用之其中一种解决方案
前端·javascript·面试
西陵15 分钟前
前端框架渲染DOM的的方式你知道多少?
前端·javascript·架构
小九九的爸爸16 分钟前
我是如何让AI帮我还原设计稿的
前端·人工智能·ai编程
海的诗篇_36 分钟前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
じ☆ve 清风°1 小时前
理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
开发语言·javascript·ecmascript
江城开朗的豌豆1 小时前
eval:JavaScript里的双刃剑,用好了封神,用不好封号!
前端·javascript·面试
Forever Nore1 小时前
前端技能包
前端
江城开朗的豌豆1 小时前
JavaScript篇:前端定时器黑科技:不用setInterval照样玩转循环任务
前端·javascript·面试
书中自有妍如玉1 小时前
.net 使用MQTT订阅消息
java·前端·.net
江城开朗的豌豆2 小时前
JavaScript篇:自定义事件:让你的代码学会'打小报告'
前端·javascript·面试