类型转换
也可以参考官方版类型转换
转为String
- undefined null true false 均转换为相应的字符串:“undefined”等
- 数值:+0和-0转为“0”;NaN、Infinity、-Infinity均转换为相应的字符串
- 对象对有toString()方法,则直接调用。否则,尝试调用valueOf()。否则返回类型错误异常。
toString()方法:数组返回逗号隔开的数组字符串;函数可以返回函数的字符串;Date、TegExp也可以返回。普通的object({x:1,y:2})返回[object object]。
转为Number
- undefined转为NaN,null转为+0
- true为1,false为0
- “”为0;”1.2”转为1.2;”one”转为NaN;其他的看下面具体规则
- 如果为对象。先转换为原始值,再转换为数值。[]转为0;[9]转为0,其他基本都是NaN;
转为Boolean
- undefined null “” 0 -0 NaN 转为false
- 其他的转为true(包括[]、{})
ES5和ES6中的比较相等的运算符
在ES5中,只有两个运算符:相等运算符(==)和严格相等运算符(===)。在ES6中,则新增了一个中比较相等的方法Object.is()。
相等运算符会自动转换数据类型,而严格相等运算符不会。但是,根据严格相等运算符,NaN不等于NaN,+0等于-0。
ES6的Object.is()提出“Same-value equality”(同值相等)算法,以解决上述问题。其用来比较两个值是否严格相等,与严格比较运算符的行为基本一致。
三个方法的比较及结果
下列的步骤,是有顺序的,如满足1,则不会使用2.
相等比较步骤
- 如果两个值类型相同,返回严格相等(===)的结果。
- null和undefined返回true
- 一个为Number,一个为String,将String转为Number;
- 布尔类型转换为Number比较
- 一个为String/Number/Boolean,另一个为object,则将object转换,进行比较;
总结:有Number类型,则将另外一个值转为Number进行比较。Boolean转为Number。一个为object则转换为原始值进行比较。
严格相等比较步骤
- 类型不相同,返回false
- null等于null,undefined等于undefined
- NaN不等于任何数,包括自身;两个数值相同,返回true;+0等于-0;其他false
- 为String,完全相等,返回true
- true等于true,false等于false;
- 相同的Symbol值(Symbol.for(‘f’),Symbol.for(‘f’)),返回true;
- 相同的object,则返回true。
- 返回false;
Object.is()比较步骤
- Type(x)和Type(y)不同,返回false
- Type(x)为null或undefined,返回true(null等于null,undefined等于undefined)
- Type(x)为数字。NaN等于NaN;+0不等-0;相同数字相等;正/负无穷不等于正/负无穷;
- Type(x)为string,两个值为相同的序列单元返回true,否则返回false;
- Type(x)为Boolean,true等于true,false等于false;
- Type(x)为Symbol,相同的Symbol值,返回true;
- x和y是相同的object值,返回true,否则返回false({}不等于{})。
一些特殊值的比较
值1 值2 | == | === | Object.is() |
---|---|---|---|
类型不同 | 转换 | false | false |
null undefined | true | false | false |
null null | true | true | true |
undefined undefined | true | true | true |
NaN NaN | false | false | true |
+0 -0 | true | true | false |
-Infinity -Infinity | true | true | true |
“12345” “12345” | true | true | true |
false false | true | true | true |
Symbol(‘f’) Symbol.for(‘f’) | false | false | false |
Symbol.for(‘f’) Symbol.for(‘f’) | true | true | true |
object object(引用相同) | true | true | true |
{} {} (引用不同) | false | false | false |
参考链接及书籍
ECMAScript2015 官方语法
JavaScript中文版