var a = [0];
if (a) { console.log(a == true); else { console.log("wut"); }
//答案:false 额,这里有点坑
==在比较的时候可以转换数据类型,若等式两边数据类型不相同,将会往数值类型方向转换后再进行比较
有以下规则:
1、x、y为Number和String类型时,则转换为Number类型比较。
2、有Boolean类型时,Boolean转化为Number类型比较。
3、一个Object类型,一个String或Number类型,将Object类型进行原始转换后,按上面流程进行原始值比较。
注意:==等好两边都为对象时,比较的是地址
所以下面就能够解释了
[0]==true ---false
[1]==true ----true
分析:数组[0]调用toNumber方法结果为0;再与布尔值比较,当有布尔类型时转化为数
JS中进行 A+B 这种操作时会经历怎样一个过程
下面是三个很有意思的示例
function fn() { return 20; } console.log(fn + 10); // 输出结果是多少
function fn() { return 20; } fn.toString = function() { return 10; } console.log(fn +10); // 输出结果是多少?
function fn() { return 20; } fn.toString = function() { return 10; } fn.valueOf =function() { return 5; } console.log(fn + 10); // 输出结果是多少?
分析结论:JS中进行 A+B
1.将A和B都转换为原始值(primitive,执行ToPrimitive),这里记为A1,B1
2.如果A1和B1中有一个值为string,则将A1、B1都转换为string(执行ToString),其值记为A2、B2,将A2 B2连接后就是A+B的结果
3.否则的话将A1、B1都转换为number(执行ToNumber),其值记为A3、B3,将A3 B3相加即为A+B的结果
ToPrimitive执行过程:
- 如果obj为原始值,直接返回;
- 否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
- 否则调用obj.toString(),如果执行结果是原始值,返回之;
- 否则抛异常。
注意:如果preferredType为String,将上面的第2步和第3步调换(obj为Date的实例时preferredType会被设置为String,其他情况下preferredType都会被设置为Number)