我们需要了解任何计算都只能在相同的数据类型之间执行。如果我们强制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,因为堆内存中地址不同;我们还需要了解一下==运算符类型转换规则:

  1. 如果有一个操作数是布尔值,会将其转换为数字类型再进行比较,true:1,false:0;
  2. 如果一个操作数是字符串,另一个操作数是数值,会先将字符串转换为数值在进行比较,当左右两边类型相等时,采用===运算符断定规则。

回归正题,{} == !{}右侧为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类型转换(隐式类型转换显式类型转换)相关推荐

  1. 如何在 C# 中使用隐式和显式操作符

    C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的, ...

  2. 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化

    人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...

  3. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  4. android oreo_Android Oreo隐式和显式广播接收器

    android oreo In this tutorial, we'll discuss the changes in Broadcast Receiver since Android Oreo. W ...

  5. 5-Selenium WebDriver三种等待--隐式等待-显式等待和流畅等待

    在selenium中,Waits在执行测试中扮演重要角色.在本教程中,您将学习Selenium中"隐式"和"显式"等待的各个方面. 在Selenium中为什么需 ...

  6. 接口的隐式和显式实现

    1:当类实现一个接口是,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性 2:当类实现多个接口且接口包含相同的方法签名,此时使用显式接口实现.(标示出哪个接口属于哪个方法) 3 ...

  7. 【两种解法】Quadtrees UVA - 297(隐式建树+显式建树)

    立志用最少的代码做最高效的表达 A quadtree is a representation format used to encode images. The fundamental idea be ...

  8. C++ dll的隐式与显式调用

     转载自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用D ...

  9. CAE 分析中 隐式和显式时间积分算法的python程序实现

    前两天,同事研究Dyna的显/隐式时间积分的差异和基本原理.想来自己也有三.四年没做这方面的编程了,对同事问的一些问题也一时犯迷瞪,索性就又看了一遍书,网上找了些资料,写了点代码,理了理思路,以备不时 ...

  10. 33 个 JavaScript 核心概念系列(三): 显式 (名义) 与 隐式 (鸭子)类型转换

    原文地址:落明的博客 一. 前言 说实话,JavaScript 的类型转换是个相当头疼的问题,无论是对于初学者还是有经验的老司机.它的难处并不在于概念多难理解,而是情况多且杂,看似相同的情况结果却又出 ...

最新文章

  1. 从babel实现es6类的继承来深入理解js的原型及继承
  2. 条件编译 #ifndef _HEAD_H...中下划线的理解
  3. Google 不要 Android 了?新系统 Fuchsia 或将支持 Java
  4. docker-compose的一些理解
  5. 【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
  6. Latex Error: File ended while scanning use of \@xdblarge
  7. gc cr block lost
  8. 数组(Java基础内容)
  9. Django出现Error: 111 connect to 192.168.158.141:22122. Connection refused
  10. 纸机器人的折法_手工折纸教程:一分钟教你折出战斗机器人,看完手里痒痒的...
  11. LeetCode-初级算法-有效的数独 ( java )
  12. 四大行、城商行等银行都在使用什么数据库?
  13. 如何从Docker容器内部获取Docker主机的IP地址
  14. web前端做汽车之家官网,HTML5+CSS3+JS
  15. echart 多种覆盖物 显示优先级
  16. SAP ERP统驭科目
  17. 某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候,1、5、1、3、5、2、4、1、2,出现缓存直接命中的次数是(),最后缓存中即将准备淘汰的数据项是()
  18. nodejs 实现 redis 的消息发布及订阅
  19. Monkey框架(测试方法篇) - monkey测试实例
  20. 苹果已冻结招聘 VS 推特员工每周狂干 84 小时,防止被裁员

热门文章

  1. 猿进化系列3——看完这个,你就有好几根猴毛了!
  2. Django 快速搭建博客 第七节(文章详情页,markdown语法)
  3. 宝来客:都在说品牌年轻化,究竟要怎么做?
  4. 速来围观:大佬们学习Spring的方式
  5. PTA团体程序设计天梯赛-练习集(L1-001~L1-048)
  6. android 智能家居连接wifi模块,智能家居应用篇 WiFi模块智能开关解决方案
  7. Docker应用容器引擎——docker的常用命令详解
  8. UPNP协议细节(转)
  9. 创建孩子兄弟链表的树c语言,树的孩子兄弟链表实现
  10. 算法与数据结构王道天勤_复习计算机专业课是买王道考研好还是天勤笔记好?...