比较运算符:[] == false 结果是true

564 阅读1分钟

https://www.cnblogs.com/nanchen/p/7905528.html

比较运算

  1. 严格比较(===),只有类型相等,值也一致时才会为true,否则为false,
  2. 宽松相等(==),先将运算数转化为相同类型,再做比较,具体过程见 Abstract Equality Comparison Algorithm。

这个算法大致说了这么几个情况,x == y

  • xy都为Null或undefined,return true;
  • x或y为NaN, return false;
  • 如果x和y为String,Number,Boolean并且类型不一致,都转为Number再进行比较
  • 如果存在Object,转换为原始值,比较
Number('')
0
Number(null)
0
Number(undefined)
NaN
Number({})
NaN
Number([])
0
Number('1')
1
Number('10')
10
Number('0')
0

[].valueOf()
// []
[].toString()
// ""
({}).valueOf()
// {}
({}).toString()
// "[object Object]"
[1,2] == '1,2'
// true
[1,2,3].map(parseInt)
// [1, NaN, NaN]
typeof 1 == true ? 1 : 0; //0 相当于'number' == true ? 1 : 0; 
// 注意优先级:等于、不等于、严格等于运算符的优先级 > 条件运算符(条件运算符的优先级很低的)
[] == false;	//true

1.存在object, 转化为原始值
ToPrimitive([]); // ''

2.一个string, 另外为boolean,都转为number
Number('');//0
Number(false);//0

3.return 0 == 0;/true
// 昨天遇到的一道奇葩面试题:间隔时间是一个立即执行的函数
for (var i = 0; i < 3; i++) {
	setTimeout(() => {
		console.log(i);
	}, function () {
		var b = i * 1000;
		console.log(b);
		return b;
	}(i));
}
0
10000
20000
3 3 3
/****************************************************************/

Boolean()

把其它数据类型的值转换为布尔类型 只有0 NaN 空字符串 null undefined这五个数据值转换为布尔类型时是false,其余的都为true。

Boolean(0)
false
Boolean('')
false
Boolean(null)
false
Boolean(undefined)
false
Boolean(NaN)
false
Boolean(false)
false
Boolean([])
// true
Boolean({})
// true
Boolean('hello')
// true
Boolean(12)
// true
Boolean(-1)
// true