网站首页 > 技术文章 正文
前言
今天来详细了解一下javascript中的隐式类型转换,通过在各种情况下发生的隐式类型的例子,来详细的了解隐式类型转换的过程。
如何转换-前置知识
1.对象类型转换
当对象类型进行类型转换时,会调用js内部一个方法toPrimitive, 此方法接收两个参数,一个参数为需要转换的对象,另一个方法接收一个期望类型,string或number。
- 当期望值为number时 会调用valueOf方法,如果返回的值不是原始值,则继续调用toString方法。
- 当期望值为string时 会调用toString方法,如果返回的值不是原始值,则继续调用valueOf方法。
valueOf方法
toString方法
2.原始类型转为number
3.原始类型转为string
4.其他类型转为boolean
什么情况下会发生隐式类型转换
1. +号
+号比较特殊,既可以当做算数运算符做加法,又可以当做字符串连接符
- 1.1 算数运算符 (除string类型外的原始数据类型进行加法运算时) 非数字类型,会转为数字类型
例:
1+null
//1
1+undefined
//NaN
1+true
//2
true + null
//1
true + undefined
//NaN
- 1.2 字符串连接符(string类型以及引用数据类型时) 非string类型会转为string类型
例:
[]+[]
//""
[]+{}
//"[object Object]"
true+[]
//"true"
true+{}
//"true[object Object]"
undefined+[]
//"undefined"
undefined + {}
//"undefined[object Object]"
解析:
- 进行算术运算时,原始数据类型转为数字使用Number()方法(例如:null、boolean、undefined等)
- 进行字符串连接时,引用数据类型会调用自身toString方法,如果返回不是原始值,会继续调用自身valueOf方法,非引用数据类型:v.isString()如果是true,它将调用v.toString()。否则,它将值转换为字符串。
2. 除加号以外的算数运算符(- * /)
- 非数字类型会转为数字类型 如果是原始数据类型会调用Number()方法进行转换如果是引用数据类型会调用自身valueOf方法进行转换,如果转换后不是原始值,则会调用toString方法进行转换,如果转换后不是数字,则会调用Number()进行转换,如果转换后不是数字则会返回NaN。
10-'1'
// 9
10-true
// 9
10-[]
//10
10-null
//10
10-undefined
//NaN
10-{}
//NaN
3.逻辑运算符(&& || !)
- 非布尔类型会转为布尔类型 a&&b 如果a为true,则会返回b;如果a为false,则会返回aa||b 如果a为true,则会返回a;如果a为false则会返回b!a 如果a为布尔值,则直接取反,如果a为非布尔值,则会转换为布尔值然后取反引用数据类型转换为布尔值后总会是true
1&&2
//2
[]&&2
//2
2&&{}
//{}
![]
//false
!{}
//false
小技巧:
!!a,会直接将非布尔值转换为布尔类型的值。
!!{}
//true
!![]
//true
!!0
//false
4.条件判断if()等
- 将括号内的值转为布尔类型
if({}){
console.log(1)
}
//1
if(null){
console.log(1)
}else{
console.log(2)
}
//2
5.比较运算符==、>、<等
- null与undefined进行==比较时不会进行转换,总返回true。
- 引用数据类型,会先转换为string(先调用valueOf,后调用toString),再转换为number
- 如果==左右都是引用数据类型,会进行地址比较
undefined==null
//true
0==[]
//true
[]==[]
//false 两个数组的地址指向不同
结尾
在众多的优秀框架方便我们开发的同时,还是需要多了解一些原生js的知识,打铁还需自身硬,共勉。
猜你喜欢
- 2024-11-01 Airbnb 开源力作:自动将 JavaScript 代码转换为 TypeScript
- 2024-11-01 JavaScript类型在什么情况下会发生类型自动转换
- 2024-11-01 js如何将接口get参数串转换成post格式输出
- 2024-11-01 【JS 字符转换】fromCharCode和charCodeAt
- 2024-11-01 几个JS开发小技巧,转换(js 开发)
- 2024-11-01 JavaScript将unicode编码转换为中文
- 2024-11-01 每日一题(js篇)通过js做进制转换(js 10进制转2进制)
- 2024-11-01 JavaScript-类型转换 224(javascript)
- 2024-11-01 基于Javascript编写的开源Markdown和HTML相互转换器——showdown
- 2024-11-01 JS短文:如何将数字转换为百分比?(js数字转金额格式)
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 506℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 486℃MySQL service启动脚本浅析(r12笔记第59天)
- 466℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 464℃启用MySQL查询缓存(mysql8.0查询缓存)
- 444℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 423℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 419℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)