有些情况的比较是不是能搞得你发疯?
123==true // false 但是,123转换为布尔值,不是true吗,true和true不相等吗?,but反着想,true转换为number的话为1,这样123确实不等于1,确实会返回false,到底是什么规则呢?
undefined==false // false , undefined转换为布尔值不是false吗,那为什么返回false呢?
null==false // false , 也返回false
想弄清楚上面这样的问题,我们首先了解JS的(==)比较机制,如下。
比较(==)的规律:
如果==两边的数据类型相同则直接进行值得比较,如果数据类型不同,则按以下规律比较。
当 a 与 b 进行比较 ( a==b ,注意是两个等号) 的时候,如果a、b是基本数据类型(Number,String,Boolean)的数据,并且 a 与 b 为不同类型的值的时候,那么将 a 与 b 都转换成数字(Number)再进行比较。(数据类型转换的规则请看这里 和 这里)
如下所示:
false == 0 // true --- false先转换成Number类型,所以false转换为 0 与等号右边的0进行比较,最终返回true
false == "" // true --- false先转换成 0 , 空字符串转换成Number类型也是0,所以返回true
"5" == 5 // true --- 原理同上
看到这里,上面让人发疯的问题,看起来弱爆了,基本数据类型都转换成number类型再比较而已!
那当基本数据类型和引用数据类型(对象类型)的值进行比较的话,又是什么样的规律呢??
这个也很简单,那就把对象类型也转换成Number类型,再比较喽!值得注意的是对象类型先调用valueOf方法,再调用toString方法,得到基本数据类型的数据,如需要再转为Number类型进行比较(这里如果是字符串和对象类型比较,对象类型调用toString方法后,==两边就是相同的值类型了,就直接进行字符串的比较了),如果valueOf和toString方法都没有得到基本类型的值,则认定为不相等。详情见这里
ex:
var a="abc",b={};
alert(a==b);
//a转化为Number类型为NaN,b先调用valueOf得到自己本身,再调用toString方法,得到"[object Object]",再转化成Number同样得到NaN,所以最终弹出false
ex2:
var a =false,b=[];
alert(a==b);
//a转化成Number得到0,b调用valueOf和toString方法得到空字符串“”,再转换成Number为0,所以最终弹出true
还有第三种情况,==左右两边都是对象类型的数据应该怎样比较?都转换成Number类型再比较吗??
——No!No!No!想多了,两边都是对象类型的话最简单了,直接比较引用地址是否相同,也就是完全比较两边是不是一个对象!是就相等,不是就不相等,即使两个对象存的值都是一模一样的,也不相等!
那null和undefined与其他值比较的时候,会怎么转换呢?先理解一下null和ECMAScript怎么看待null和undefined的。
我对null和undefined的理解:
一般编程语言中,基本都有且只有一个表示不存在的值---null,而在JavaScript中,有两个值表示不存在,他们就是null和undefined,它们都是标示性的值,null表示主动性的不存在,undefined通常表示意外的不存在。言外之意就是程序中当返回了null是意料之中的,我们就是想让它返回null,而返回undefined的时候,有可能我们的代码就有错误了(如果代码书写规范的话)。
JavaScript通常认为,undefined是基本数据类型(值类型),而null是对象类型(引用类型)的数据!但是null和undefined没有valueOf和toString方法!
因为null本身就是不存在的意思,所以null强制转换成Number类型得到0,强制转换成String类型得到“null”,强制转换成布尔值得到false。undefined强制转换成Number类型得到NaN-这点有点特殊,要记住哦,强制转换成String类型得到“undefined”,强制转换成布尔值得到false。
那么当我们做null或者undefined与其他数据进行比较的时候,是用不到上面的转化规则的!
因为undefined被当成基本数据类型,undefined被看成基本值,而又因为undefined转换为数字为NaN,所以undefined与Number、String、Boolean这三种类型比较的时候,总是返回false。
而对于null来说,JS把它当成对象来进行比较,即先尝试调用null的valueOf与toString方法,而又因为它没有valueOf和toString方法,所以始终返回false。
值得注意的是,null == undefined 是成立的!因为undefined是从Null类派生出来的,所以JS认为他们是相等的。也可以理解为null没有valueof和toString方法,,所以转为基本类型为undefined,那么undefined == undefined,结果也是true。
综合以上2点,null和undefined和其他类型比较都是false!
了解到这些,就知道下面比较的答案了:
null == undefined // true
false==null // false
undefined == false // false
相关推荐
理解javascript中undefined和null的区别
在JavaScript编程语言中,`null`和`undefined`是两种非常重要的值,它们在很多情况下容易引起混淆。本文将深入探讨两者之间的区别和比较。 首先,`undefined`是一种特殊的值,它代表变量已经被声明但没有赋值。在...
在JavaScript编程语言中,Null和Undefined是两种不同的原始值,它们在特定场景下有特定的含义,有时也会引起初学者的困惑。理解这两者之间的差异是编写健壮JavaScript代码的关键。 首先,Undefined类型是一个特殊的...
在 JavaScript 中,undefined、null、NaN 是三个经常被混淆的概念,但它们有着不同的含义和用途。今天,我们将深入探讨这三个概念的区别和应用。 undefined 在 JavaScript 中,undefined 是一个基本数据类型,表示...
JavaScript中undefined和null的区别 JavaScript两个表示”无”的值:undefined和null。我在平时只是null用的多一点,undefined只是在报错中经常遇到。下面针对这两个数据类型的异同做一下详细的比较。 1.undefined和...
本文将深入探讨undefined和null的含义、用途以及如何在JavaScript中正确区分和使用它们。 理解undefined和null的区别对于JavaScript开发者来说至关重要。它们在表示“没有值”的概念时有着不同的用途和含义。通过...
JavaScript 类型系统中的 `undefined` 和 `null` 是两种特殊的原始值,它们分别代表不同的概念。`undefined` 主要用于表示变量已经声明但未被赋值的情况,而 `null` 则是一个特意设置的值,通常用来表示一个“空”的...
在JavaScript编程语言中,null和undefined是两个非常基础且常用的特殊值。尽管它们看起来相似,但它们在JavaScript中有着本质上的区别和各自的应用场景。本文将详细探讨这两个特殊值的相同点和不同点,以及在实际...
在JavaScript中,使用`==`比较运算符比较`undefined`和`null`会得到`true`,因为这两个值在松散相等比较中被视为相等。然而,使用严格相等运算符`===`比较时,它们被认为是不相等的,因为它们是两种不同的数据类型:...
一时间不好回答,特别是... null 是 JavaScript 保留关键字。 null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值: 表达式:123 + null 结果值:123 表达式:123 * null 结果
虽然`null`和`undefined`在某些情况下看起来很相似,并且在某些比较操作中它们可能被认为是相等的(例如`null == undefined`),但实际上它们有着本质的不同: 1. **数据类型不同**:`undefined`是一种原始类型的值...
在JavaScript编程语言中,`null` 和 `undefined` 是两个重要的概念,它们都用来表示某种“不存在”或“没有”的状态,但它们之间存在着微妙的差异。了解这些差异对于编写健壮的JavaScript代码至关重要。 首先,`...
JavaScript 类型系统中的 `undefined` 和 `null` 是两种特殊的原始值,它们分别代表不同的概念。在 JavaScript 中,每个变量都有一个类型,当变量未初始化或引用的对象不存在时,就会出现 `undefined` 或 `null`。 ...
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。于是,细想之后,写下本文,请各位大侠拍砖。 总所周知:null == undefined ...