關係運算子用於測試兩個值之間中的關係(相等、小於或「是...的屬性」),根據關係是否存在而傳回true和false.關係表達式總是傳回一個布林值,通常在if while或是for語句中使用關係表達式,以控製程式的執行流程。
i相等和不等運算子
「==」和"==="運算子用於比較兩個值是否相等,兩個運算子允許任意類型的運算符。如果相等則回傳true,否則傳回false.「===」也稱為嚴格相等運算子(有時稱為恆等運算子),它用於偵測兩個運算元是否嚴格相等。 「==」運算子稱為相等運算符,它用來偵測兩個運算元是否相等,這裡的相等定義寬鬆,可以允許進行型別轉換。
javascript支援“=”,“==”,“===”運算符,你應該理解(賦值,相等,恆等)運算符之間的區別。並在編程中小心使用。為了減少混淆,應該把“=”稱作“得到或賦值”,把“==”稱作“相等”,把“===”稱作“嚴格相等”。
“!=”和“!==”運算符規則是“==”,“===”運算符的求反,“!”是布爾非運算符,我們將“!= ”,“!==”稱為不相等,不嚴格相等
javascript物件的比較是引用的比較,而不是值的比較。物件和本身是相等的,但和人和物件都不相等。如果兩個物件具有相同數量的屬性,相同的屬性名稱和值,它們仍然是不相等的。對應位置的數組元素是相等的兩個數組也是不相等的。
嚴格相等運算子"==="先計算運算元的值,然後比較這兩個值,比較過程中沒有任何型別轉換。
如果兩個值類型不想同,則它們不相等
如果兩個值都是null或undefined,則它們不相等
如果兩個值都是布林值true或false,則它們相等
如果其中一個值是NaN,或兩個值都是NaN ,則它們不相等,NaN和其它值都是不相等的,包括它本身。
如果兩個值為數字且相等,則它們相等。如果一個值為0,令一個值為-0,則它們同樣相等。
如果兩個值為字串,且所含對應位上的16位數(參考3章2節)完全相等,則它們相等。如果他們的長度或內容不同,則不相等。兩個字串可能函數完全一樣且所顯示的字元也一樣,但具有不用編碼的16位元值,javascript並不對Unicode進行標準轉換,因此這樣的字串透過"==="和"=="運算子的比較結果也不相等。第三部分的String.localeCompare()提供了另一個比較字串的方法。
如果兩個引用值指向同一個對象,數組或函數,則它們是相等的。如果指向不同的對象,則它們是不等的,儘管兩個對像有完全相同的屬性。
相等運算子"=="和恆等運算子相似,但相等運算子比較並不嚴格。如果兩個數字不是相同類型,那麼相等運算子會嘗試進行一些類型轉換,然後進行比較。
如果兩個運算元相同,則和上文相等運算子的比較規則一樣。如果嚴格相等,那麼比較結果相等。如果他們不嚴格相等,則比較結果不相等。
如果兩個運算元不同,「==」相等運算子也會認為它們相等。偵測相等會遵循如下的規則和型別轉換:
如果一個型別是null,令一個是undefined,則它們相等
如果一個值是數字,另一個是字串,先將字串轉換為數字,然後使用轉換後的值進行比較。
如果一個值是true,則將其轉換為1再進行比較,如果一個值為false,則轉換為0比較。
如果一個值是對象,另一個值是數字或字串,則使用3章8節3小節的方法的轉換規則將物件轉換為原始值,然後進行比較。物件透過toString()方法或valueOf()方法轉換為原始值。 javascript語言核心的內建類別首先嘗試使用valueOf()再嘗試使用toString(),除了日期類,日期類只能透過toString()轉換。那些不是javascript 語言核心中的物件則透過實作中定義的方法轉換為原始值。
其它不同型別之間的比較皆不相等
這裡有一個判斷相等的小例子
"1" == true
這個表達式的結果為true,這表示完全不同類型的值比較結果為相等。布林值true先轉換為數字1 ,然後再執行比較。接下來字串「1」也會轉換為數字1 ,因為兩個數字的值相等,因此結果為true.
#ii.比較運算子
小於(<)
如果第一個運算元小於第二個運算元,「<」運算結果我true,否則為false
小於等於(<=)
大於(>)
大於等於(>=)
....(不詳細介紹意義)
比較操作符的操作數可能是任意型別。然而只有數字和字串才能真正執行比較操作符,因此,那些不是數字和字串的操作數都會進行類型轉換。類型轉換規則如下:
如果操作數為對象,則按照3章8節3小節處鎖描述的轉換規則轉換為原始值:如果valueOf()返回一個原始值,那麼直接使用這個原始值。否則使用toString() 的轉換結果進行比較。
在對轉換為原始值之後,如果兩個操作數都是字串,那麼將按字母表的順序對兩個字串進行比較,這裡提到的「字母表順序」是組成這兩個字串的16位元Unicode字元的索引順序。
在物件轉換為原始值之後,如果至少一個運算元不去是字串,那麼兩個運算元都會為數字進行數值的比較。 0和-0是相等的。 Infinty壁其它任何數字都大(除了infinty本身),-infinty比任何數字都小(除了它自己本身。)如果一個操作數(或轉換後)為NaN,那麼比較符總是返回false
對於數字和字串運算子來說,加號運算子和比較運算子的行為有所不同,前者更偏好字串,如果它的其中一個運算元是字串的話,則進行字串連接運算。而比較運算子則更偏好數字,只有在兩個運算元都是字串字串的時候。才會進行字串的比較。
1 + 2 //=>3 加法,結果為3
"1" + "2" //字串連接,結果為"12"
"1" + 2 / /字串連接,2轉換為"2",結果"12"
11 < 3 //數字比較,結果true
"11" < "3" //字串比較,結果為true
"11" < 3 //數字的比較,「11」轉換為11,結果為true
"one" < 3 //數字比較,"one"轉換為NaN,結果為falase
最後要注意的是,「<=」和「>=」運算子在判斷相等的時候,並不依賴相等運算子和和嚴格相等運算比較規則。相反,小於等於運算符芝是簡單的“不大於”,大於等於運算只是“不小於”。只有一個例外,的那個一個運算元(後轉換後)是NaN的時候,所有4個比較運算子都會回傳fasle.
iii.in運算子
in運算符希望它的左操作數是一個字串或可以轉換為字串,希望它的右邊是一個物件。如果右側的物件擁有一個名為左操作數值的屬性名,那麼表達式傳回true.例如
var point = { x: 1, y: 1 } //定义一个对象 "x" in point //=>true 对象有一个名为x的属性 "z" in point //=>false 对象无名为z的属性 "toString" in point // =>true 对象继承了toString方法 var data = [7, 8, 8] "0" in data //=>true 数组包含0 1 in data //=>true 数字转换为字符串 3 in data //=>fase 没有索引为3的元素
iiii.instanceof運算子
instanceof運算子希望左運算子為一個對象,右操作數標示對象的類別。如果左側的物件是右側類別的實例,則表達式傳回true;負責傳回false.第9章將會講到。 javascript物件的類別是透過初始化他們的建構函數的來定義的。這樣的話,instanceof的右邊操作數應是一個函數。例如:
var d = new Date(); //构造一个新对象 d instanceof Date; //计算结果为true, d是Date() 创建的 d instanceof Object //计算结果为true ,所有的对象都是Object的实例 d instanceof Number //计算结果为 false,d不是一个Number对象 var a = [1,2,3] //数组直接量创建数组 a instanceof Array //计算结果true a为数组 a instanceof Object //true 所有的数组都是对象 a instanceof RegExp //fasle 数组不是正则表达式
要注意的是,所有物件都是Object的實例。當透過instanceof盤對一個物件是否為一個類別的實例的時候,這個判斷也叫做「父類別」(superclass)的偵測,如果instanceof的左側操作物件不是物件的話,instanceof回傳false。如果右側操作不是函數,則拋出類型錯誤的異常。
為了理解instanceof運算子是如何運作的,必須先理解「原型類別」(prototype chain),原型鍊作為javascript的繼承機制,將在6章2節2小節詳細描述。
為了計算表達式o instanceof f ,javascript筆仙首先計算f.prototyoe,然後在原型鏈中查詢o,如果找到,那麼o是f(或者f的父類)的一個實例,那麼傳回true。反之false
以上是javascript基礎課程之關係表達式定義用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!