模板字符串
document.write(大家好,我叫${uname}, 我今年贵庚${age}岁了)
比较运算符
如果相等操作符两边的操作数,不包含 null 或者 undefined,且两个操作数不全是对象,在执行相等比较之前,会先调用 Number() 将两个操作数强制转为 Number 类型,然后进行比较。
转换规则:在比较运算符时会优先转换操作数(强制转换),然后再进行比较。
第一步:如果有一个操作数类型为布尔值,则在比较相等之前将其转换为数值类型,即 false => 0, true => 1;
第二步:如果一个操作数是字符串,另一个是数值,在比较前先将字符串转换成数值
第三步:在双等号对比时,左右类型相等的情况下,采用三等号的方式进行比较,严格的运算符判定规则
基本数据类型:
- 如果有一个操作数是(number,string,Boolean),则在比较相等性之前,将其转换为数值;
- 在比较相等性之前,不能将 null 和 undefined 转成其他值,且null 和 undefined 是相等的。
- 如果有一个操作数是 NaN,则都返回 false;(NaN不与任何相等,包括NaN)
1 | '55' == 55; //true ( Number('55') -> 55 ) |
复杂数据类型:
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;
1 | NaN == NaN; //false (参考第4条规则) |
[] == [] 和 {} == {}
在 JavaScript 中,Object、Array、Function、RegExp、Date 都是引用类型。
声明引用类型的时候,变量名保存在 js 的栈内存里面,而对应的值保存在堆内存里面。而这个变量在栈内存中实际保存的是:这个值在堆内存中的地址,也就是指针。
1 | var a = {}; |
[] == ![] 和 {} == !{}
逻辑非 (!) 的优先级高于相等操作符 ( == )
1 | [] == ![] //![] == false ->Number([]) == Number(false) -> 0 == 0 -> true |
数组与数值
数组会先通过调用toString()转换为字符串后再转换为数值,比如[true]转换为字符串后为”true”,然后再转换为数值是NaN,所以[true]==1返回false。
1 | console.log([]==0); // true |
null == 0 、null >= 0 、null > 0
1.关系运算符知 和 相等运算符 并不是一个类别的.
2.关系运算符,在设计上总是需要运算元道尝试转为一个number,而相等运算符在设计上,则没有这方面的考虑.
1 | null==0 //false |
特殊情况:
NAN===NAN(false)
0.1+0.2===0.3(false)js的小数加法存在精度问题
null==undefined(true)
null===undefined(false)
[]==[](false)
[]===[] (false)
undefined进行比较时,是作为对象,转化为NaN来处理。