關系運算符用於測試兩個值之間的關系,根據關系是否存在而返回true或者是false.關系表達式總是返回一個布爾值。
具有如下8個關系運算符:大於(>),小於(<),小於等於(<=),大於等於(>=),相等(==),不等(!=),恆等(===),不全等(!==)。從下面幾個方面來分析:
一、相等和不相等運算符
“===”:恆等運算符,也稱是嚴格相等運算符,只有在無需類型轉換運算數就相等的情況下才為true.
<script> console.log('2' === 2); //false 二者的類型不同
console.log(undefined === undefined); //true 二者的類型與值都相同
console.log(NaN === NaN); //false NaN和任何值都不相等包括NaN
console.log('abc' === 'acb'); //false 字符串的相等,要長度和相應位置一樣才相等
console.log([] === []); //false 對象的相等必須是引用的相等才可以
console.log(10 === 0xa); //true 轉換成十進制進行比較
</script>
"==":相等運算符和“===”恆等運算符相類似,但是它沒有那么的嚴格,如果兩個操作數不是同一類型,它會進行轉換后再進行比較是否是相等。
當操作數類型一樣時,比較的規則和恆等運算符一樣,都相等才相等;
當操作數類型不一樣時,會按如下規則來判定:
如果一個值是對象類型,另一個是原始類型,則對象類型會通過valueOf()方法進行轉換,轉換成原始值,如轉換的不是原始值,則通過toString()方法轉換再進行比較;
在對象轉換為原始值后,如果兩個操作數是字符串,則進行字符串的比較,如果里面有一個操作符不是字符串,那兩個操作數通過Number()方法進行轉換,轉成數字進行比較.
<script> console.log('abc' == 'abc'); //true 類型相等,值也相等,當然相等
console.log(NaN == NaN); //false NaN和任何者不等
console.log([] == []); //false
console.log(10 == 0xa); //true 轉換成十進制進行比較是否相等
console.log(true == 0); //false true轉換成數字為1
console.log(true == '1'); //true
console.log([1] == 1); //true
console.log(true == 1); //true
console.log(null == undefined); // true null和undefined是相等的
console.log(0 == null); // false 0和null不等
console.log('' == false); //true 空字符串轉成0和false相等
</script>
"=": 可以看成是得到或者是賦值。作用是把等號右邊的值賦予等號左邊的變量或屬性。
賦值操作符的結合性是從右到左,也就是說,如果一個表達式中出現了多個賦值運算符,運算順序是從右到左。
“!==”:恆不等運算符,又稱嚴格不等運算符。操作數的比較過程與恆等運算符相同,結果取反就可。
“!=”:不相等運算符。它的操作數比較的過程和與相等運算符相同,結果取反即可。
注意:undefined只與null相等,與其它任何值相比較都不相等。字符串相對比,比較的是字符對應的ASCII碼。
<script> console.log([] !== []); //true
console.log(1 !== true); //true
console.log('1' !== 1); //true
console.log(NaN !== NaN); //true
console.log('1' != true); //false
console.log(null != undefined);//false
console.log(NaN != ''); //true
console.log(undefined == null); //true
</script>
二、比較運算符
它用來檢測兩個操作數的大小關系。有大於(>),小於(<),小於等於(<=),大於等於(>=)。
1、大於運算符
大於運算符的操作數可能是任意類型,然而,只有數字和字符串才能真正執行比較操作,因此那些不是數字和字符串的操作數都將進行類型轉換。規則如下:
如果操作數是對象,則這個對象將先使用valueOf()轉換成原始值,如果結果還不是原始值,則再使用toString()方法轉換;
在對象轉換為原始值之后,如果兩個操作數都是字符串,則按照字母表的順序對兩個字符串進行比較,這里提到的字母表順序是指組成這個字符串的16位unicode字符的索引順序;
在對象轉換為原始值之后,如果至少有一個操作數不是字符串,則兩個操作數都轉換成數字進行比較。
需要注意的是Javascript字符串是一個由16位整數值組成的序列,字符串的比較也只是兩個字符串中的字符的數值比較,由unicode定義的字符編碼和任何特定語言或者本地語言字符集中的傳統字符編碼順序不盡相同。字符串比較是區分大小寫的,所以一般首先會將字符串通過String.toLowerCase()或者是String.toUpperCase()做大小寫的轉換。
2、大於等於運算符
大於等於運算符並不依賴於大於或等於運算符的比較規則,而是遵循小於運算符的比較規則,結果取反
3、小於等於運算符
小於等於運算符(<=)並不依賴於小於或等於運算符的比較規則,而是遵循大於運算符的比較規則,結果取反。
4、小於運算符
小於運算符(<)用於比較兩個操作數,如果第一個操作數小於第二個操作數,則小於運算符的計算結果為true,否則為false。
三、in運算符
in運算符希望它的左操作數是一個字符串或可以轉換為字符串,希望它的右操作數是一個對象。如果右側的對象有一個名為左操作數值的屬性名,那么表達式返回true.
<script>
let point = { x: 1, y: 2 } //定義一個對象
console.log("x" in point); //true 對象里有一個名為”x"的屬性
console.log("d" in point); //false對象里沒有一個名為”d"的屬性
</script>
四、instanceof運算符
instanceof運算符希望左操作是一個對象,右操作數標識對象的類。如果左側的對象是右側類的實例,則返回true,否則為false.
<script>
let d = new Date(); //通過Date()構造函數來創建一個新的對象
console.log(d instanceof Date); //true d是由Date()創建的
console.log(d instanceof Object);//true 所有的對象都是Object的實例
console.log(d instanceof Number);//false d不是一個Number對象
</script>
