js数据类型和值比较

比较规则

1. 对象和布尔值比较
对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字

console.log([] == true); //false []转换为字符串’’,然后转换为数字0,true转换为数字1,所以为false

2. 对象和字符串比较
对象和字符串进行比较时,对象转换为字符串,然后两者进行比较。

console.log([1,2,3] == ‘1,2,3’); // true [1,2,3]转化为’1,2,3’,然后和’1,2,3’, so结果为true;

3. 对象和数字比较
对象和数字进行比较时,对象先转换为字符串,然后转换为数字,再和数字进行比较。

console.log([1] == 1); // true `对象先转换为字符串再转换为数字,二者再比较 [1] => ‘1’ => 1 所以结果为true

4. 字符串和数字比较
字符串和数字进行比较时,字符串转换成数字,二者再比较。

console.log(‘1’ == 1) // true

5. 字符串和布尔值比较
字符串和布尔值进行比较时,二者全部转换成数值再比较。

console.log(‘1’ == true); // true

6. 布尔值和数字比较
布尔值和数字进行比较时,布尔转换为数字,二者比较。

console.log(true == 1); // true
许多刚接触js的童鞋看到这么多的转换规则就懵圈了,其实规律很简单,大家可以记下边这个图(是时候展现我高超的绘画技巧了)
数据转换

如图,任意两种类型比较时,如果不是同一个类型比较的话,则按如图方式进行相应类型转换,如对象和布尔比较的话,对象 => 字符串 => 数值 布尔值 => 数值。
另外,我们来看下一些需要"特别照顾"的。

有一个比较坑的地方,之前有跟后台联调时候拿空数组做校验,然后发现流程走的在意料之外的

console.log([] == false);
console.log(![] == false);
这两个的结果都是true,第一个是,对象 => 字符串 => 数值0 false转换为数字0,这个是true应该没问题,
第二个前边多了个!,则直接转换为布尔值再取反,转换为布尔值时,空字符串(’’),NaN,0,null,undefined这几个外返回的都是true, 所以! []这个[] => true 取反为false,所以[] == false为true。

还有一些需要记住的,像:

console.log(undefined == null) //true undefined和null 比较返回true,二者和其他值比较返回false
console.log(Number(null)) //0

隐式类型转换
(1).四则运算
    加法运算符+是双目运算符,只要其中一个是string类型,表达式的值便是一个String。
    对于其他的四则运算,只要其中一个是Number类型,表达式的便是一个Number。
    对于非法字符的情况通常会返回NaN:‘1’‘a’ // => NaN,这是因为parseInt(a)值为NaN,1NaN还是NaN
(2).判断语句
    判断语句中的判断条件需要是 Boolean类型,所以条件表达式会被隐式转换为Boolean。其转换规则则同Boolean的构造函数。比如:      
     var obj = {};if(obj){while(obj);}
(3).Native代码调用
    JavaScript宿主环境都会提供大量的对象,它们往往不少通过JavaScript来实现的。JavaScript给这些函数传入的参数也会进行隐式转换。例如BOM提供的alert方法接受String类型的参数:alert({a:1}); //=>[object Object]

发布了90 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/me_never/article/details/102810512
今日推荐