深入理解js隐式类型转化

2018-01-04  本文已影响0人  如意同学Try

在开始本文前,先声明两句十分重要的话

Falsy 类型值包括:"", 0, null, undefined, NaN, false.

换句话说,除了以上6种,其他任何值都为true

Javascript是弱类型的语言

换句话说,类型之间会通过某些操作进行转化。

好,表演开始

隐式类型转化的两种方式

1. 操作符
a) +:
1 + 2 = 3
1 + "2" = "12"
b) - * % /:

字符串- * % /数值,字符串转化为数值,运算失败则结果为NaN

"-1" * "2" = -2
"" - 1 = -1
"4px" - 2 = NaN
c) null代表空值,转化为0计算
null + 1 = 1   //null代表空值
null - 1 = -1
d) undefined代表未定义,会导致运算失败
undefined + 1 = NaN //undefined代表未定义
2. == 与 ===

之前我对于两者的理解是,==比较两者值是否相等,忽略类型,而===需要值和类型都相等,才会返回ture

其实,上述说法并不规范,===其实是将两边数值直接进行比较,而==其实是比较强制类型转化之后的结果。

Boolean(2 === "2")           //false
Boolean(undefined == null)   //ture
Boolean(undefined === null)  //false

有几个值得注意的地方:

对象和数组的比较
Boolean([]);           //ture
//空数组为ture

Boolean({});           //ture
//空对象为ture

Boolean([] == []);     //false
//两个数组(对象也一样),就算属性和方法完全一致,两者也不相等。

var arr = [],a = arr,b = arr;
Boolean(a == b)        //ture
//指向同一个数组的两个变量才能说是相等的

因为数组和对象实际上是地址的引用,不同的数组之间,即使属性和方法完全一致,指向的地址也是不一致的。所以才有深拷贝这一说法了。

类型转化

很简单,数字会加上引号转化为字符串,再进行比较

Boolean(1 == "1")  //true
Boolean(false == 1) //false
Boolean([] == false) //ture

左边空数组[]转化为number 0,

右边false也转化为number 0

但还是想再强调一遍,两个空数组的结果依然是false,因为这时候是直接进行比较的,没有进行转化

Boolean([]==[])   //false
Boolean({} == false) //false

但是同样,两个空对象进行比较,结果依然是false

Boolean({}=={})

不知道你被绕晕了没有,其实理解起来也很简单,只要稍微注意下数组和对象的特殊情况,就能通关了
over~

上一篇下一篇

猜你喜欢

热点阅读