不容易强制类型转换随后怎么转换呢?

lxf2023-02-16 15:49:28

序言

js是一门弱类型的表达,它强制类型转换的欺骗性也被人诟病,比如文章标题提及的一个小事例,我觉得往往很难再寻找别的的表达,容许大家觉到一个值好像为真也为假。

因为现在标准比较推荐js开发人员们尽量使用==这类也会产生强制类型转换的词法,大伙儿尽量用到===代替,我在工作上也确实如此。

这儿牵涉到强制类型转换问题,因为js的种类设计方案这般,它不是难用,反而是很容易出现令人理解不了的具体内容,因此被人们抨击。实际上碰到其他问题,第一时间从来都不是逃避,而应该尝试去了解它,明白了就不会迷惑了。

估计你也想要消除一下自己的蒙蔽吧?本文就给介绍一下有关==的数据转换难题。

==与===的差别

此刻,假如你有工作经验,你一定会说:这个我知道,==只分辨值,===会与此同时分辨值与种类

那么了解也许可以,可是严格上来说,这话不足精确,真真正正的差别应当是:==在对比2个不同种类的值的时候会产生强制类型转换,而===不容易

强制类型转换

随后怎么转换呢?记一下以下几个方面就完事儿了。

前提条件是二者类型不同,

  1. 二者假如是关系式,先计算表达式。

  2. 二者含有一个是对象类型,则其对象类型实行ToPrimitive之后再进行较为。

  3. 两者都是基本类型,分辨种类是不是同样,不一样,则与此同时实行ToNumber之后再较为。

  4. 突发情况,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) {
    // ...
}

尾言

文中阐述了==的强制类型转换,虽然我知道这在工作上应用性并不大,哈哈哈哈哈,但是就当达到一下自己的好奇心吧。

如果你觉得文章内容很好得话,热烈欢迎点赞收藏哦,有什么错误或是问题可以留言,感激~