邏輯運算子"&&"、「||」、「!」是對運算進行布林算術運算,經常和關係運算子一起配合使用,邏輯運算子將多個關係表達式組合起來組成一個更複雜的表達式。
i.邏輯與
"&&"運算子可以從三個不同的層次來理解。最簡單一層理解是,當操作數都是布林值是,「&&」對兩個布林值執行布林與(AND)操作,只有在第一個操作數和第二個操作數都是true的時候,它才回傳true.如果其中有一個操作數為false.則它傳回false.
"&&"長用來連接兩個關係表達式
x == 0 && y == 0; //只有在x和y都是0時,才回傳true
關係表達式總是回傳true或false,因此當這樣使用的時候,「&&」本身也回傳true或false。關係運算子的優先順序要比"&&"(和「||」)高,因此類似這種表達式可以放心地書寫,而不用補充園括號。
"&&"運算元不一定是布林值,回想一下,有些值是可以當做「真值」和「假值」的。 (如假值是:false null undefined 0 -0 NaN和"",所有和其它的值包括所有的物件都是真值)。對「&&」第二層理解是,「&&」是可以對真值和假值進行布林與(AND)操作。如果兩個運算元都是真值的,則那麼傳回一個真值;否則,至少一個運算元是假值的。 javascript在任何使用布林值的地方的時候,表達式語句都會將其當做真值或假值來對待,因此實際上「&&」並不總是返回true和false.但也並無大礙。
要注意的是,上文提到了運算子返回“真值”和“假值”,但並沒說說明這個“真值”或“假值”到底是什麼值,為此我們深入討論對「&&」第三層的理解。運算子首先計算左運算元的值,也就是先計算「&&」左邊的表達式,如果計算結果是假值,那麼整個表達式的結果一定是假值,因此「&&」這時簡單的回傳左操作的值,而不會對右邊的操作數進行計算。
var o = { x: 1 }; var p = null; o && o.x; //=>1 : 1:0是真值,因此返回值是o.x p && p.x //= null :p是假值,因此将其返回,而并不计算p.x
這對於理解「&&」可能不計算右操作數的情況至關重要,在上述程式碼中,變數P的值是null,而如果計算p.x的話則會拋出一個例外錯誤,因此,只有p為真值(不能是null或undefined)的情況下才計算p.x
"&&"的行為有時候被稱為“短路”(short circuiting),我們經常能看到很多程式碼利用了這一也行來有條件的執行程式碼。例如下面的兩個程式碼是等價的
if (a == b) stop(); //只有a==b时才能调运stop() (a == b) && stop(); //同上
一般來講,當「&&」右邊的表達式具有副作用的時候(賦值,遞增,遞減和函數呼叫表達式)要格外小心。因為當這些有副作用的表達式的執行時候,就依賴左操作鼠的計算結果。
儘管「&&」可以按照第二層和第三層的理解進行一些複雜的表達式運算,但大多數的情況下,「&&」只用來對真值和假值的做布林計算。
ii.邏輯或(||)
"||"運算子對兩個運算元做布林或(OR)運算。如果其中一個為真值,則傳回真值,兩個運算元都為假值,傳回假值。
儘管「||」運算子大多情況下只是做簡單的布林或(OR)運算,和「&&」一樣,也具備一些更複雜的行為,它首先計算第一個操作數的值,也就是說回先計算左側的表達式,如果計算結果為真,則傳回真值,否則,再計算第二個值。
和「&&」一樣,用於應該避免右操作數包含一些具有副作用的表達式,除非你目地明確在右側使用帶副作用的表達式,而有可能不會計算右側的表達式。
這個運算子最常用的方式是用來從一組備選的表達式中選取第一個真值的表達式。
//如果max_width已经定义了,则直接使用它。赋值在preferences对象中查找max_width //如果没有定义它,则使用一个写死的常量。 var max =max_width || preferences.max_windth || 500;
這種貫用法通常在函數體內,用來給參數預設值。
//将o成功的属性复制到p中,并返回p function copy(o, p) { p = p || {}; //如果向参数p没有传入任何对象,则使用一个新创建对象。 //函数体内的主逻辑
iii.邏輯非(!)
"!"運算子是一元運算符,它被放置在一個單獨操作數之前。它的目的是將操作數的布林值求反。
和"&&"、"||"運算子不同,「!」運算子先將其運算元轉換為布林值,然後再對布林值求反。也就是"!"總是回傳true和 false。並且,可以透過使用兩次邏輯非運算來得到一個值的布林值:
「!」具有很高的優先級,並且和操作數緊密的綁在一起,如果希望對p && q ,則需要園括號!(p && q)。如下程式碼:
!(p && q) === !p || !q !(p || q) === !p && !q
對於p和q取任何值,這兩個表達式永遠成立。
以上是javascript基礎課程之邏輯表達式定義用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!