js中的|與 && 運算符詳解

這篇文章主要介紹了js中的 || 與 && 運算符詳解,需要的朋友可以參考下

js中邏輯運算符在開發中可以算是比較常見的運算符了,主要有三種:邏輯與&&、邏輯或||和邏輯非!。

當&&和|| 連接語句時,兩邊的語句會轉化爲布爾類型(Boolean),然後再進行運算,具體的運算規則如下:

兩邊條件都爲true時,結果才爲true;

如果有一個爲false,結果就爲false;

當第一個條件爲false時,就不再判斷後面的條件

注意
當數值參與邏輯與運算時,結果爲true,那麼會返回的會是第二個爲真的值;如果結果爲false,返回的會是第一個爲假的值。

二.

只要有一個條件爲true時,結果就爲true;
當兩個條件都爲false時,結果才爲false;
當一個條件爲true時,後面的條件不再判斷
注意:當數值參與邏輯或運算時,結果爲true,會返回第一個爲真的值;如果結果爲false,會返回第二個爲假的值;

三.

當條件爲false時,結果爲true;反之亦然。
上代碼說明:

`<!DOCTYPE html>`
`<html lang=``"en"``>`
`<head>`
`<meta charset=``"UTF-8"``>`
`<title>demo</title>`
`<script>`
`console.log( 5 && 4 );``//當結果爲真時,返回第二個爲真的值4`
`console.log( 0 && 4 );``//當結果爲假時,返回第一個爲假的值0`
`console.log( 5 || 4 );``//當結果爲真時,返回第一個爲真的值5`
`console.log( 0 || 0 );``//當結果爲假時,返回第二個爲假的值0`
`console.log((3||2)&&(5||0));``//5`
`console.log(!5);``//false`
`</script>`
`</head>`
`<body>`
`</body>`
`</htm>`

補充:邏輯與的優先級是高於邏輯或的;
比如console.log(3||2&&5||0),會先算2&&5的值爲5,然後再3||5----3,最後再3||0----3,所以最終結果爲3.

補充

表達式a && 表達式b : 計算表達式a(也可以是函數)的運算結果,

如果爲 True, 執行表達式b(或函數),並返回b的結果;

如果爲 False,返回a的結果;

表達式a || 表達式b : 計算表達式a(也可以是函數)的運算結果,

如果爲 Fasle, 執行表達式b(或函數),並返回b的結果;

如果爲 True,返回a的結果;

轉換規則:

對象爲true;
非零數字爲true;
零爲false;
非空字符串爲true;
空字符串爲法false;
其他爲false;
例如

var a = obj || " " ; //如果 obj 爲空,a就賦值爲 " " ;
var a = check() && do(); //如果check()返回爲真,就執行do(),並將結果賦值給 a;
其他網友的補充

今天覆習js繼承的時候發現了一個問題,先上代碼了

`<script type=``"text/javascript"``>`
`window.onload =` `function` `() {`
`var` `mama,`
`mama1,`
`test =` `function` `(name) {`
`debugger;`
`this``.name = name ||` `'mama'``;`
`};`
`debugger;`     
`mama =` `new` `test();`
`mama1 =` `new` `test(``"mama1"``);`
`alert(mama.name);``//name = mama`
`alert(mama1.name);``// name = mama1`
`}`
`</script>`
 ```
在執行構造函數的時候,無參的構造函數返回的name是'mama',有參數時,實例的name就是參數值了。 >這個時候我就有點犯迷糊了,爲什麼>邏輯運算符||能這麼用呢?
由於是C#出身,所以對js ||這樣用感覺很奇怪。
沒轍,不懂先研究,實驗實驗就知道了。
`var` `b, c, d;`
`b =` `true` `|| 0;``//b=true;`
`c =` `false` `|| 0;``//c=0;`
`d = 1 || 0;``//d=1;`

換成別的呢?

`var` `b, c, d;`
`b = 1-1 || 1+1;` `//b=2`
`c =` `function` `() {` `return` `undefined } ||` `function` `() {` `return` `1};``//c=function();`
`d = c();``//d=undefined`
`var` `b, c, d;`
`b = 1-1 || 1+1;` `//b=2`
`c =` `function` `() {` `return` `1 } ||` `function` `() {` `return` `undefined};``//c=function();`
`d = c();``//d=1`
`b = {} || { a: 1, getA:` `function` `() {` `return` `this``.a}};` `//b=object`
image
`var` `b, c, d;`
`b = { a: 1, getA:` `function` `() {` `return` `this``.a } } || {};` `//b=object`
`c = b.getA();``//c=1;`

通過這幾個實驗,可以看出,JS的||並不是像C#裏面的||一樣 單純的返回一個布爾類型。
大家都知道js的布爾類型判定是對象是true,非零是true,非空字符串是true其餘的都是false

由此得出
邏輯或

表達式 表達式2 a取值
1 0 表達式1結果值
1 1 表達式1結果值
0 1 表達式2結果值
0 0 表達式2結果值

邏輯與 && :
var a = 表達式1 && 表達式2

表達式1 表達式2 a取值
1 0 表達式2結果值
1 1 表達式2結果值
0 1 表達式1結果值
0 0 表達式1結果值
主要原因是因爲短路,邏輯或 在前面有一個ture的時候則不看後面直接停止,邏輯與&&同理。

然後計算賦值和我們平時一樣之獲取最新的一次計算結果值。

例如

b = (1 + 1, 2 + 2, 3 + 3);`//b=6;`

嘛嘛,當然只是猜測。
以上僅供參考。萌新一隻,望各位大佬輕批。瞭解更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章