JavaScript高阶教程之“==”隐藏下的类型转换
文件大小: 216k
源码售价: 10 个金币 积分规则     积分充值
资源说明:抛砖引玉 按照正常的逻辑来说,我们判断两个值是否相等会遵循以下规则: 但是我看下面一组值: []==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,从而提高代码的清晰性和可靠性。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。