资源说明:抛砖引玉
按照正常的逻辑来说,我们判断两个值是否相等会遵循以下规则:
但是我看下面一组值:
[]==0 //true
[]==false //true
[]==!{} //true
[10]==10 //true
'0'==false //true
''==0 //true
undefined==null //true
!null==true //true
居然没有按照我们的剧本走,那它比较规则又是什么?下面我就来分析一波。
“==”的比较规则
首先我们先去ECMAScript5.1中文版( http://lzw.me/pages/ecmascrip… )找一下“==”的比较规则,
JavaScript中的“==”运算符在进行比较时,其行为可能会让人感到意外,因为它的比较规则涉及到了复杂的类型转换。在JavaScript中,数据类型分为原始数据类型(如null、undefined、Number、String、Boolean、Symbol)和引用类型(如Object)。在进行“==”比较时,如果比较的两个值类型不同,JavaScript会尝试进行隐式类型转换,以便进行比较。
我们来看“==”的比较规则。根据ECMAScript5.1规范,当比较两个不同类型的值时,会遵循以下步骤:
1. 如果两个值的类型相同,那么:
- 如果都是Undefined,返回true。
- 如果都是Null,返回true。
- 如果都是Number,会进行数值比较,包括处理NaN的情况。
- 如果都是String,只有当字符串完全相同(长度和每个字符都一样)时,返回true。
- 如果都是Boolean,同为true或同为false返回true,否则返回false。
- 如果是引用同一个对象,返回true,否则返回false。
2. 如果x是null,y是undefined,或者相反,返回true。
3. 如果x是Number,y是String,会将y转换成Number再进行比较。
4. 如果x是String,y是Number,会将x转换成Number再进行比较。
5. 如果x是Boolean,会先将其转换成Number再与y比较。
6. 如果y是Boolean,会先将其转换成Number再与x比较。
7. 如果一个值是Object类型,另一个是原始数据类型,会尝试将Object转换成原始数据类型(ToPrimitive)再进行比较。
对于原始数据类型到Number的转换(ToNumber),有以下规则:
- Boolean:true转换为1,false转换为0。
- String:如果是非数字格式的字符串,转换规则复杂,比如"123"会转成123,而"abc"会转成NaN。
- null转换为0。
- undefined转换为NaN。
例如,以下是一些“==”比较的例子,它们展示了类型转换的影响:
- `[] == 0`:空数组被转换为Number时为0,因此与0相等。
- `[] == false`:空数组转换为0,false转换为0,两者相等。
- `[] == !{}`:空数组转换为0,!{}的结果是true,true转换为1,不相等。
- `[10] == 10`:数组转换为Number后,10与10相等。
- `'0' == false`:字符串'0'转换为0,false转换为0,两者相等。
- `'' == 0`:空字符串转换为0,与0相等。
- `undefined == null`:两者在“==”下相等。
- `!null == true`:null转换为0,!0为true,与true相等。
理解这些规则有助于避免JavaScript中常见的类型转换陷阱,并使代码更加可预测。在编写JavaScript代码时,建议尽量使用严格相等运算符`===`,以避免不必要的类型转换。这可以确保只有当值和类型都相同时,比较结果才为true,从而提高代码的清晰性和可靠性。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。