日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js 运算符 || 妙用

發(fā)布時間:2025/7/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js 运算符 || 妙用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?

首先出個題:

?

假設(shè)對成長速度顯示規(guī)定如下:

成長速度為5顯示1個箭頭;

成長速度為10顯示2個箭頭;

成長速度為12顯示3個箭頭;

成長速度為15顯示4個箭頭;

其他都顯示都顯示0各箭頭。

用代碼怎么實現(xiàn)?

?

差一點的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實現(xiàn)起來也很麻煩了。

?

那么你有沒有想過用一行就代碼實現(xiàn)呢?

ok,讓我們來看看js強大的表現(xiàn)力吧:

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

?

更強大的,也更優(yōu)的:

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;??

?

?

首先我們來梳理一下一個概念,請你一定要記住:在js邏輯運算中,0、""、null、false、undefined、NaN都會判為false,其他都為true(好像沒有遺漏了吧,請各位確認下)。這個一定要記住,不然應(yīng)用||和&&就會出現(xiàn)問題。

這里順便提下:經(jīng)常有人問我,看到很多代碼if(!!attr),為什么不直接寫if(attr);
其實這是一種更嚴謹?shù)膶懛?#xff1a;
請測試 typeof 5和typeof !!5的區(qū)別。!!的作用是把一個其他類型的變量轉(zhuǎn)成的bool類型。

下面主要討論下邏輯運算符&&和||。

幾乎所有語言中||和&&都遵循“短路”原理,如&&中第一個表達式為假就不會去處理第二個表達式,而||正好相反。
js也遵循上述原則。但是比較有意思的是它們返回的值。
代碼:var attr = true && 4 && “aaa”;
那么運行的結(jié)果attr就不是簡單的true或這false,而是”aaa”
再來看看||:
代碼:var attr = attr || “”;這個運算經(jīng)常用來判斷一個變量是否已定義,如果沒有定義就給他一個初始值,這在給函數(shù)的參數(shù)定義一個默認值的時候比較有用。因為js不像php可以直接在型參數(shù)上定義func($attr=5)。再次提醒你記住上面的原則:如果實參需要是0、""、null、false、undefined、NaN的時候也會當false來處理。

?

if(a?>=5){

????alert(
"你好");
}

?


可以寫成:

a?>=?5?&&?alert("你好");

?

?

這樣只需一行代碼就搞定。但是需要注意的一點就是:js中||和&&的特性幫我們精簡了代碼的同時,也帶來了代碼可讀性的降低。這就需要我們自己來權(quán)衡了。
一方面精簡js代碼,能實質(zhì)性的減少網(wǎng)絡(luò)流量,尤其是大量應(yīng)用的js公用庫。個人比較推薦的做法是:如果是相對復雜的應(yīng)用,請適當?shù)貙懸恍┳⑨尅_@個和正在表達式一樣,能夠精簡代碼,但是可讀性會降低,對讀代碼的人要求會高些,最好的辦法就是寫注釋。

?

我們可以不使用這些技巧,但是我們一定要能看懂,因為這些技巧已經(jīng)廣泛應(yīng)用,尤其是像JQuery等js框里的代碼,不理解這些你就很難看懂別人的代碼。

像var Yahoo = Yahoo || {};這種是非常廣泛應(yīng)用的。

?

ok,最后讓我們來看一段jQuery中的代碼吧:

?

代碼 var?wrap?=??????
????
//?option?or?optgroup??????
????!tags.indexOf("<opt")?&&??????
????[?
1,?"<select?multiple='multiple'>",?"</select>"?]?||??????
??????????
????
!tags.indexOf("<leg")?&&??????
????[?
1,?"<fieldset>",?"</fieldset>"?]?||??????
??????????
????tags.match(
/^<(thead|tbody|tfoot|colg|cap)/)?&&??????
????[?
1,?"<table>",?"</table>"?]?||??????
??????????
????
!tags.indexOf("<tr")?&&??????
????[?
2,?"<table><tbody>",?"</tbody></table>"?]?||??????
??????????
????
//?<thead>?matched?above??????
????(!tags.indexOf("<td")?||?!tags.indexOf("<th"))?&&??????
????[?
3,?"<table><tbody><tr>",?"</tr></tbody></table>"?]?||??????
??????????
????
!tags.indexOf("<col")?&&??????
????[?
2,?"<table><tbody></tbody><colgroup>",?"</colgroup></table>"?]?||??????
??????????
????
//?IE?can't?serialize?<link>?and?<script>?tags?normally??????
????!jQuery.support.htmlSerialize?&&??????
????[?
1,?"div<div>",?"</div>"?]?||??????
??????????
????[?
0,?"",?""?];??????
??????????
????
//?Go?to?html?and?back,?then?peel?off?extra?wrappers??????
????div.innerHTML?=?wrap[1]?+?elem?+?wrap[2];??????
??????????
????
//?Move?to?the?right?depth??????
????while?(?wrap[0]--?)??????
????????div?
=?div.lastChild;?????

?

?

?

這段代碼是作者用來處理 $(html) 時,有些標簽必須要約束的,如<option>必須在<select></select>之內(nèi)的。

可能你也發(fā)現(xiàn)了作者還有一個很巧的地方就是 !tags.indexOf("<opt") ,作者很巧很簡單的就實現(xiàn)了startWith的功能了,沒有一點多余的代碼。jquery源代碼中還有很多如此精妙的代碼,大家可以去學習學習。

?

代碼 null==undefined?:?true??
null==""?:?false??
null==0?:?false??
0==""?:?true??
false==0?:?true??
false==""?:?true??
true==0?:?false??
true==1?:?true??
true==-1?:?false??
false==null?:?false??
'':?undefined???
false==undefined?:?false??
-0===+0?:?true??
-0==+0?:?true??
-(-0)===0?:?true??
false===(!true)?:?true??
typeof(null)?:?object???
typeof(false)?:?boolean??
typeof(undefined)?:?undefined???
typeof(1)?:?number???
typeof(+1.1)?:?number

?

?

給大家留下一個問題:3||6&&9的運算結(jié)果是什么? 具體的分析可以看這里:&&和||運算 內(nèi)容如下: 一直以為 && 和 || 這兩個運算符只能在判斷表達式時使用,一般就是常在if語句使用。前段時間在公司的磨刀行動的考核題目中,完全做錯了。由于對這兩個運算符不是很理解,只是簡單的認為是一個判斷表達式。當時考試的題目:3||6&&9的運算結(jié)果是什么?我居然寫的是true! 今天在博客園里看到了對這兩個講解,認為很多人在這里還是存在誤區(qū)的。所以也把他記了下來。 我們先不看答案,先來對&& 和 || 的理解。我記得在以前的計算機書上看到過這兩個運算符,他們的優(yōu)先級是:&&大于|| 。那&&又是怎么運算的呢? exp1&&exp2:如果執(zhí)行exp1后返回true,則執(zhí)行exp2并返回exp2的值;如果執(zhí)行exp1后返回false,則整個表達式返回exp1的值,exp2不執(zhí)行; exp1 || exp2:如果執(zhí)行exp1后返回true,則整個表達式返回exp1的值,exp2不執(zhí)行;如果執(zhí)行exp1后返回false,則執(zhí)行exp2并返回exp2的值; 那下面我們來看答案吧: 3||6&&9:先運算&&,由于6和9都大于0,即都為true,所以結(jié)果為 9。表達式變?yōu)?||9。由于3和9 都為true,則返回3。所以答案就是3。 由上面我又延伸幾個問題:false==0,true==0,false==null,false==undefined,false==""他們的值 又是什么呢? 在末尾我在給大家留個問題:&和&& 他們之間又有什么區(qū)別呢??

?

?

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的js 运算符 || 妙用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。