首頁 > web前端 > js教程 > 主體

javascript基礎課程之關係表達式定義用法詳解

伊谢尔伦
發布: 2017-07-19 10:24:53
原創
1309 人瀏覽過

關係運算子用於測試兩個值之間中的關係(相等、小於或「是...的屬性」),根據關係是否存在而傳回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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板