js类型转换(隐式类型转换显式类型转换)
我们需要了解任何计算都只能在相同的数据类型之间执行。如果我们强制JavaScript执行执行一些操作,例如在字符串中添加一个数字,在这种情况下,js编译器会默认将数字更改为字符串类型,然后将两者连接起来,这就是类型转换。
什么是类型转换?
在JavaScript中,类型转换是将一种数据类型转换为另一种数据类型,例如字符串转为数字,对象转为布尔值等。
使用不同的数据类型执行操作时,需要进行类型转换。这些转换可以由JavaScript编译器自动执行,也可以由我们手动执行。
我们看几个示例:
console.log('1' + 2) //'12'
console.log(1 + 'js')//1js
console.log(1 + 2)//3
console.log(1 + 2 + '1')//31
console.log(1 + '2' + 1)//121
console.log('6' - 2) // 4
console.log('6' * 2) // 12
console.log('6' / '2')//3
console.log(null == 1)//false
console.log('abc' - 1)//NaN
示例中使用不同的数据类型,默认情况下,js编译器对字符串类型数据使用 -、*、/ 运算符时会将字符串转换为数字;
而+运算符与其他运算符有所不同,+运算符执行两个功能:
1.数学加法
2.字符串串联
当对字符串使用+运算符操作时,js不是将字符串转为数字,而是将数字转换为字符串。
对于松散相等 == 运算符,如示例中,会把null转换为Number类型:0,热后比较0==1,返回false.
对于非数字型字符串使用-、*、/运算符,如示例中‘abc’-1,js编译器无法将‘abc’转换为数字类型,会返回NaN,表示不是一个数字。
类型转换的类型
在js中,有两种类型转换:隐式类型转换和显式类型转换。
- 隐式类型转换:js编译器自动执行类型转换。
- 显式类型转换:我们手动执行类型转换。
常见的数据转换:
- 字符串的转换
- 数字的转换
- 布尔值转换
字符串转换
我们通常使用String()方法将其他数据类型转换为字符串类型,我们来看下面的示例。
//隐式转换
'15' + 36 // '1536' 36转为'36'
'20' + null //'25null' null转为'null'
'abc ' + undefined //'abc undefined' undefined转为'undefined'
'2' - 1 // 1 '2'转为2
6 / '2' //3 '2'转为2
'4' * 2 // 8 '4'转为4//显式转换
String(23) // '23'
String(true) // 'true'
String({}) // '[object Object]' 调用目标对象toString()方法
String([]) // ''
在字符串和数字间使用-、*、/运算符,js编译器会将字符串转换为数字,如果是非数字型字符串,返回NaN;对于+运算符,会将数字转为字符串。
数字转换
我们可以使用Number()方法将其他类型数据显式转为数字类型。
//隐式转换
'' == 0 //true
[] == 0 // true []=>'' '' == 0
true == 1 //true true=>1
false == 0// true false=>0//显式转换
Number('12') // 12
Number('-12.34') // -12.34
Number('abc') // NaN
Number(null) // 0
Number(undefined) // NaN
Number({}) //NaN 调用目标对象valueOf()方法
非数字型字符串、undefined、对象在转换为数字类型时会转为NaN。
布尔值转换
我们可以使用Boolean()方法将其他数据类型转换为布尔类型。每一个js值都可以强制转换为true或false。在js中,以下值在转换为Boolean后返回false:
- false
- 0
- -0
- undefined
- ""
- NaN
- null
其他一切值都返回true。
Boolean(-1)//true
Boolean({})//true
Boolean([])//true
Boolean('0')//true
比较运算符、==、===
我们来看一下对于其他运算符的类型转换。
'2' > '1' // true 字符串之间比较第一个字符的Unicode编码 2.charCodeAt()>1.charCodeAt()
'2' > '10' // true 2的Unicode编码比1大 只比较第一个字符
'2' > 10 // false 字符串'2'转为数字2 然后进行比较
'abc' > 'aab' // true 先比较'a'和'a',两者相等,比较下一个字符,'b'>'a'
NaN == NaN // false NaN与任何数据比较都返回NaN
[] == 0 //true [].toString()='' Number('') == 0成立
![] == 0 // true []转为布尔为true 取反得false false == 0 成立
[] == [] //false 引用数据类型存在堆中 栈存的地址引用 两个数组地址不同 返回false
[] == ![] //true
{} == {} //false 类型相同 直接比较 堆内存地址不同 返回false
{} == !{} //false // ????
我们发现了一个问题,为什么{} == {}返回false,{} == !{}也返回false,这是这么回事?
对于严格等于===运算符,会有严格得类型判断,对于对象和数组只看双方地址;对于松散等于==在比较时,如果双方类型相等,进行值或者地址比较,如果类型不相等,先进行类型转换,在比较值或者地址,所以[] == []和{} == {}返回false,因为堆内存中地址不同;我们还需要了解一下==运算符类型转换规则:
- 如果有一个操作数是布尔值,会将其转换为数字类型再进行比较,true:1,false:0;
- 如果一个操作数是字符串,另一个操作数是数值,会先将字符串转换为数值在进行比较,当左右两边类型相等时,采用===运算符断定规则。
回归正题,{} == !{}右侧为Object类型,左侧为Boolean类型,所以要将两侧操作数转换为Number类型,Number({})返回NaN,{}隐式转换为true,!{}等于!true =>false,Number(false)等于0,所以最终运算为NaN == 0,NaN与任何值比较都返回false,故结果为false。
额外补充
有一个需要我们关注的点,看下面这个示例:
3 === new Number("3") // false
3 === Number("3") // true
两行代码都将String类型的‘3’转换成数字3,但返回结果不同;第一行代码返回false,因为我们创建了一个Number对象的实例,返回的是这个实例的引用;而第二行代码返回的是一个原始的数据类型,所以结果是true。
typeOf new Number("3") // object
typeOf Number("3") // number
typeOf 3 // number
如果本文对你有帮助的话就动动小手点个赞吧,我们一起加油!
js类型转换(隐式类型转换显式类型转换)相关推荐
- 如何在 C# 中使用隐式和显式操作符
C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的, ...
- 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化
人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...
- intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系
intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...
- android oreo_Android Oreo隐式和显式广播接收器
android oreo In this tutorial, we'll discuss the changes in Broadcast Receiver since Android Oreo. W ...
- 5-Selenium WebDriver三种等待--隐式等待-显式等待和流畅等待
在selenium中,Waits在执行测试中扮演重要角色.在本教程中,您将学习Selenium中"隐式"和"显式"等待的各个方面. 在Selenium中为什么需 ...
- 接口的隐式和显式实现
1:当类实现一个接口是,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性 2:当类实现多个接口且接口包含相同的方法签名,此时使用显式接口实现.(标示出哪个接口属于哪个方法) 3 ...
- 【两种解法】Quadtrees UVA - 297(隐式建树+显式建树)
立志用最少的代码做最高效的表达 A quadtree is a representation format used to encode images. The fundamental idea be ...
- C++ dll的隐式与显式调用
转载自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用D ...
- CAE 分析中 隐式和显式时间积分算法的python程序实现
前两天,同事研究Dyna的显/隐式时间积分的差异和基本原理.想来自己也有三.四年没做这方面的编程了,对同事问的一些问题也一时犯迷瞪,索性就又看了一遍书,网上找了些资料,写了点代码,理了理思路,以备不时 ...
- 33 个 JavaScript 核心概念系列(三): 显式 (名义) 与 隐式 (鸭子)类型转换
原文地址:落明的博客 一. 前言 说实话,JavaScript 的类型转换是个相当头疼的问题,无论是对于初学者还是有经验的老司机.它的难处并不在于概念多难理解,而是情况多且杂,看似相同的情况结果却又出 ...
最新文章
- 从babel实现es6类的继承来深入理解js的原型及继承
- 条件编译 #ifndef _HEAD_H...中下划线的理解
- Google 不要 Android 了?新系统 Fuchsia 或将支持 Java
- docker-compose的一些理解
- 【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
- Latex Error: File ended while scanning use of \@xdblarge
- gc cr block lost
- 数组(Java基础内容)
- Django出现Error: 111 connect to 192.168.158.141:22122. Connection refused
- 纸机器人的折法_手工折纸教程:一分钟教你折出战斗机器人,看完手里痒痒的...
- LeetCode-初级算法-有效的数独 ( java )
- 四大行、城商行等银行都在使用什么数据库?
- 如何从Docker容器内部获取Docker主机的IP地址
- web前端做汽车之家官网,HTML5+CSS3+JS
- echart 多种覆盖物 显示优先级
- SAP ERP统驭科目
- 某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候,1、5、1、3、5、2、4、1、2,出现缓存直接命中的次数是(),最后缓存中即将准备淘汰的数据项是()
- nodejs 实现 redis 的消息发布及订阅
- Monkey框架(测试方法篇) - monkey测试实例
- 苹果已冻结招聘 VS 推特员工每周狂干 84 小时,防止被裁员
热门文章
- 猿进化系列3——看完这个,你就有好几根猴毛了!
- Django 快速搭建博客 第七节(文章详情页,markdown语法)
- 宝来客:都在说品牌年轻化,究竟要怎么做?
- 速来围观:大佬们学习Spring的方式
- PTA团体程序设计天梯赛-练习集(L1-001~L1-048)
- android 智能家居连接wifi模块,智能家居应用篇 WiFi模块智能开关解决方案
- Docker应用容器引擎——docker的常用命令详解
- UPNP协议细节(转)
- 创建孩子兄弟链表的树c语言,树的孩子兄弟链表实现
- 算法与数据结构王道天勤_复习计算机专业课是买王道考研好还是天勤笔记好?...