序言
js是一门弱类型的表达,它强制类型转换的欺骗性也被人诟病,比如文章标题提及的一个小事例,我觉得往往很难再寻找别的的表达,容许大家觉到一个值好像为真也为假。
因为现在标准比较推荐js开发人员们尽量使用==这类也会产生强制类型转换的词法,大伙儿尽量用到===代替,我在工作上也确实如此。
这儿牵涉到强制类型转换问题,因为js的种类设计方案这般,它不是难用,反而是很容易出现令人理解不了的具体内容,因此被人们抨击。实际上碰到其他问题,第一时间从来都不是逃避,而应该尝试去了解它,明白了就不会迷惑了。
估计你也想要消除一下自己的蒙蔽吧?本文就给介绍一下有关==的数据转换难题。
==与===的差别
此刻,假如你有工作经验,你一定会说:这个我知道,==只分辨值,===会与此同时分辨值与种类
那么了解也许可以,可是严格上来说,这话不足精确,真真正正的差别应当是:==在对比2个不同种类的值的时候会产生强制类型转换,而===不容易
强制类型转换
随后怎么转换呢?记一下以下几个方面就完事儿了。
前提条件是二者类型不同,
-
二者假如是关系式,先计算表达式。
-
二者含有一个是对象类型,则其对象类型实行ToPrimitive之后再进行较为。
-
两者都是基本类型,分辨种类是不是同样,不一样,则与此同时实行ToNumber之后再较为。
-
突发情况,null==underfined,两者在==较为上只和对方和他们本身相同。
ToPimitive:实行该对象valueOf函数公式,如果结果为基本类型则直接回到,不然回到该对象toString函数的执行结果。
ToNumber:转换成种类。
事例
ok,知道以上的内容,我们来看一下[]==![]
发生什么事。
[] == ![] // 右边关系式,先来计算,[]的boolean值为true,因此![]乃为false
// ⬇⬇⬇
[] == false // 右边基本类型,左侧乃是二维数组(对象类型),所以对左边实行ToPrimitive
// ⬇⬇⬇
// ToPrimitive执行过程
[].valueOf() // 结果显示[],valueOf返回仍是原数组对象,非基本类型,实行ToString
[].toString() // 结果显示空字符串'',为字符串数组基本类型,回到
'' == false // 两边为基本类型,种类依然不一样,两侧与此同时实行ToNumber
// ⬇⬇⬇
// 两侧与此同时ToNumber转换成种类
Number('') // 0
Number(false) // 0
0 == 0 // true
哈哈哈哈哈,虽然比较胡扯,但是结果就是这个样子。
训练
试一下,依据上边学到的专业知识,能否试着使自己了解以内的式子怎么是true呢?
console.log('0' == false) // true
console.log(0 == false) // true
console.log('' == false) // true
console.log([] == false) // true
console.log('' == 0) // true
console.log('' == []) // true
console.log(0 == []) // true
突发情况undefined==null
尽管两者都是基本类型,但是遇上他们时应特别处理,不可以用Number开展变换,两者在==上只与彼此之间与自身相同,因而开展上边流程分辨时,不要忘记碰到null和undefined,不必继续变换了。
而且根据这个特殊特性,在我们必须判断一个数值undefined或是null时,一定可以简单化分辨,这不是太好吗?
if (res === undefined || res === null) {
// ...
}
// 相当于
if (res == null) {
// ...
}
尾言
文中阐述了==的强制类型转换,虽然我知道这在工作上应用性并不大,哈哈哈哈哈,但是就当达到一下自己的好奇心吧。
如果你觉得文章内容很好得话,热烈欢迎点赞收藏哦,有什么错误或是问题可以留言,感激~
声明:本文仅供个人学习使用,来源于互联网,本文有改动,本文遵循[BY-NC-SA]协议, 如有侵犯您的权益,请联系本站,本站将在第一时间删除。谢谢你
原文地址:不容易强制类型转换随后怎么转换呢?