深入理解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
- 布尔类型的值会转换为数字,false转化为0,true转化为非0数字
Boolean(false == 1) //false
- 数组的转换
空数组本身为true,但是在做比较时是转化为0
Boolean([] == false) //ture
左边空数组[]
转化为number 0,
右边false
也转化为number 0
但还是想再强调一遍,两个空数组的结果依然是false,因为这时候是直接进行比较的,没有进行转化
Boolean([]==[]) //false
- 对象的转换
javascript中所有对象都是true。
Boolean({} == false) //false
但是同样,两个空对象进行比较,结果依然是false
Boolean({}=={})
不知道你被绕晕了没有,其实理解起来也很简单,只要稍微注意下数组和对象的特殊情况,就能通关了
over~