本文首发于
个人博客
看到这个是否是有一种想打人的觉得,渣滓 JavaScript,这特么都什么鬼,置信很多人不管是笔试照样口试,都被 JS 的范例转换岂非过,置信仔细看完我这篇文章,妈妈再也不必忧郁范例转换的问题了。
原始值到原始值的转换
- 原始值转化为布尔值
一切的假值(undefined、null、0、-0、NaN、””)会被转化为 false,其他都邑被转为 true
- 原始值转化为字符串
都相当于 原始值 + “” 原始值转为数字
- 布尔转数字:true -> 1, false -> 0
字符串转数字:以数字示意的字符串能够直接会转为字符串,假如字符串头尾有空格会疏忽,然则空格在中心,转换效果就是 NaN。
+" 66" // 66 +" 6 7 " // NaN
原始值到对象的转换
- null 和 undefined 转对象直接抛非常
- 原始值经由过程挪用 String()、Number()、Boolean()组织函数,转换为他们各自的包装对象
对象到原始值的转换
- 对象转为布尔都为 true
对象到字符串
- 假如对象有 toString() 要领,就挪用 toString() 要领。假如该要领返回原始值,就讲这个值转化为字符串。
- 假如对象没有 toString() 要领或许 该要领返回的不是原始值,就会挪用该对象的 valueOf() 要领。假如存在就挪用这个要领,假如返回值是原始值,就转化为字符串。
- 不然就报错
对象到数字
- 对象转化为数字做了跟对象转化为字符串做了想同的事儿,差别的是后者是先挪用 valueOf 要领,假如挪用失利或许返回不是原始值,就挪用 toString 要领。
补充。一些经常使用内置对象 toString 要领和 valueOf 的转换划定规矩
- toString 相干
- valueOf 相干
== 运算符怎样举行范例转换
- 假如一个值是null,另一个值是undefined,则相称
- 假如一个是字符串,另一个值是数字,则把字符串转换成数字,举行比较
- 假如恣意值是true,则把true转换成1再举行比较;假如恣意值是false,则把false转换成0再举行比较
- 假如一个是对象,另一个是数值或字符串,把对象转换成基本范例的值再比较。对象转换成基本范例,应用它的 toString 或许 valueOf 要领。 js 中心内置类,会尝试 valueOf 先于 toString(能够理解为对象优先转换成数字);破例的是 Date,Date 应用的是 toString 转换。非 js 中心的对象,经由过程本身的完成中定义的要领转换成原始值。
+ 运算符怎样举行范例转化
假如作为一元运算符就是转化为数字,常经常使用来将字符串转化为数字
+"2" // 2 2+false // 0
假如作为二元运算符就有两种转换体式格局
- 双方假如有字符串,另一边一会转化为字符串举行相加
- 假如没有字符串,双方都邑转化为数字举行相加,对象也依据前面的要领转化为原始值数字。
- 假如个中的一个操作数是对象,则将对象转换成原始值,日期对象会经由过程 toString() 要领举行转换,其他对象经由过程 valueOf()要领举行转换,然则大多数要领都是不具备可用的 valueOf() 要领,所以照样会经由过程 toString() 要领实行转换。
流程图以下:
实战剖析
1. []+[] // ""
_1. 起首运算符是 + 运算符而且很明显是二元运算符,并且有对象,所以挑选末了一点,操作数是对象,将对象转换为原始值。
_2. 双方对象都是数组,左侧的数组先挪用 valueOf() 要领无果,然后去挪用 toString(), 要领,在 toString() 的转化划定规矩内里有『将数组转化为字符串,用逗号分开』,由于没有其他元素,所以直接是空字符串 “”。
![](https://user-gold-cdn.xitu.io/2018/8/7/165124228cd61ccc?w=236&h=64&f=png&s=2453)
_3. 由于加号有一边是字符串了,所以别的一边也转为 字符串,所以双方都是空字符串 “”。
_4. 所以加起来也是空字符串 “”。
2. (! + [] + [] + ![]).length // 9
_1. 起首我们会看到挺多一元运算符,「+」、「!」,关于一元运算符是右连系性,所以能够画出以下运算递次。
_2. 关于+[]
,数组是会被转化为数字的而不是字符串,可见「+ 运算符怎样举行范例转化」的第一条,所以经由第一步就会转化为
(!0 + [] + "false").length
_3. 第二步比较简单,0 转化为布尔值就是 false,所以经由第二步就转化为
(true + [] + "false").length
_4. 第三步中心的 []
会转为空字符串,在「+ 运算符怎样举行范例转化」第二条的第三点,对象会被转转化为原始值,就是空字符,所以经由第三步以后就会变成
("true" + "false").length
_5. 第五步就比较简单啦,终究就是
"truefalse".length // 9
附录:
《JavaScript威望指南》中范例转换表格
个人民众号,迎接继承交换