全面解析JavaScript中“&&”和“||”操作符(總結篇),全面解析JavaScript

來源:互聯網
上載者:User

全面解析JavaScript中“&&”和“||”操作符(總結篇),全面解析JavaScript

1、||(邏輯或),

從字面上來說,只有前後都是false的時候才返回false,否則返回true。

alert(true||false); // truealert(false||true); // truealert(true||true); // truealert(false||false); // false

這個傻子都知道~~

但是,從深層意義上來說的話,卻有另一番天地,試下面代碼

alert(0||1);//1

顯然,我們知道,前面0意味著false,而後面1意味著true,那麼上面的結果應該是true,而事實返回的結果是1。再看下面代碼:

alert(2||1);//2

我們知道,前面2是true,後面1也是true,那返回結果又是什麼呢?測試結果是2,繼續看:

alert('a'||1);//'a'

同樣,前面'a'是true,後面1也是true;測試結果是'a',下面

alert(''||1);//1

由上,我們知道前面”是false,後面1是true,而返回結果是1。再看下面

alert('a'||0);//'a'

前面'a'是true,而後面0是false,返回結果是'a',繼續下面

alert(''||0);//0

前面”是false,後面0同樣是false,返回結果是0

alert(0||'');//''

前面0是false,後面”是false,返回結果是”

這就意味

1、只要“||”前面為false,不管“||”後面是true還是false,都返回“||”後面的值。

2、只要“||”前面為true,不管“||”後面是true還是false,都返回“||”前面的值。

我稱這種為短路原理: 知道了前面第一個的結果就知道後的輸出,如果為第一個為:true,則取第一個的值,如果第一個為false,則取第二個的值。

js必須牢記的6個蛋蛋: 請你一定要記住:在js邏輯運算中,0、”“、null、false、undefined、NaN都會判為false,其他都為true(好像沒有遺漏了吧,請各位確認下)。這個一定要記住,不然應用||和&&就會出現問題。

這裡順便提下:經常有人問我,看到很多代碼if(!!attr),為什麼不直接寫if(attr);

其實這是一種更嚴謹的寫法:
請測試 typeof 5和typeof !!5的區別。!!的作用是把一個其他類型的變數轉成的bool類型。

2.&&(邏輯與)

從字面上來說,只有前後都是true的時候才返回true,否則返回false。

alert(true&&false); // falsealert(true&&true); // truealert(false&&false); // falsealert(false&&true); // false

然後,根據上面經驗,我們看看“&&”號前後,不單單是布爾類型的情況。

alert(''&&1);//''

結是返回”,“&&”前面”是false,後面是1是true。

alert(''&&0);//''

結是返回”,“&&”前面”是false,後面是0也是false。

alert('a'&&1);//1

結是返回1,“&&”前面”a是true,後面是1也是true。

alert('a'&&0);//0

結是返回0,“&&”前面”a是true,後面是0是false。

alert('a'&&'');//''

結是返回”,“&&”前面”a是true,後面是”是false。

alert(0&&'a');//0

結是返回0,“&&”前面”0是false,後面是'a'是true。

alert(0&&''); //0

結是返回0,“&&”前面”0是false,後面是”也是false。

短路原理

1、只要“&&”前面是false,無論“&&”後面是true還是false,結果都將返“&&”前面的值;

2、只要“&&”前面是true,無論“&&”後面是true還是false,結果都將返“&&”後面的值;

3.在開發中的應用

下面三段代碼等價:

a=a||"defaultValue"; if(!a){ a="defaultValue"; } if(a==null||a==""||a==undefined){ a="defaultValue"; }

你願意用哪一個呢?

2、 像var Yahoo = Yahoo || {};這種是非常廣泛應用的。 獲得初值的方式是不是很優雅?比if。。。。else…好很多,比?:也好不少。

3、 callback&&callback()

在回調中,經常這麼寫,更嚴謹,先判斷 callback 是不是存在,如果存在就執行,這樣寫的目的是為了防止報錯
如果直接寫 callback(); 當callback不存在時代碼就會報錯。

4、綜合執行個體

需求

這裡寫圖片描述

假設對成長速度顯示規定如下:

成長速度為5顯示1個箭頭;
成長速度為10顯示2個箭頭;
成長速度為12顯示3個箭頭;
成長速度為15顯示4個箭頭;
其他都顯示都顯示0各箭頭。
用代碼怎麼實現?

差一點的if,else:

var add_level = 0; if(add_step == 5){ add_level = 1; } else if(add_step == 10){ add_level = 2; } else if(add_step == 12){ add_level = 3; } else if(add_step == 15){ add_level = 4; } else { add_level = 0; }

稍好些的switch:

var add_level = 0; switch(add_step){ case 5 : add_level = 1; break; case 10 : add_level = 2; break; case 12 : add_level = 3; break; case 15 : add_level = 4; break; default : add_level = 0; break;}

如果需求改成:

成長速度為>12顯示4個箭頭;
成長速度為>10顯示3個箭頭;
成長速度為>5顯示2個箭頭;
成長速度為>0顯示1個箭頭;
成長速度為<=0顯示0個箭頭。

那麼用switch實現起來也很麻煩了。

那麼你有沒有想過用一行就代碼實現呢?

ok,讓我們來看看js強大的表現力吧:

var add_level = (add_step==5 && 1) || (add_step==10 && 2) || (add_step==12 && 3) || (add_step==15 && 4) || 0;

更強大的,也更優的:

var add_level={'5':1,'10':2,'12':3,'15':4}[add_step] || 0;

第二個需求:

var add_level = (add_step>12 && 4) || (add_step>10 && 3) || (add_step>5 && 2) || (add_step>0 && 1) || 0;

以上所述是小編給大家介紹的全面解析JavaScript中“&&”和“||”操作符(總結篇),希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對幫客之家網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.