1. 程式人生 > >全面解析JavaScript中“&&”和“||”操作符(總結篇)

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

這篇文章主要介紹了全面解析JavaScript中“&&”和“||”操作符(總結篇)的相關資料,需要的朋友可以參考下
1、||(邏輯或),
從字面上來說,只有前後都是false的時候才返回false,否則返回true。
alert(true||false); // true
alert(false||true); // true
alert(true||true); // true
alert(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); // false
alert(true&&true); // true
alert(false&&false); // false
alert(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

相關推薦

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

這篇文章主要介紹了全面解析JavaScript中“&&”和“||”操作符(總結篇)的相關資料,需要的朋友可以參考下 1、||(邏輯或), 從字面上來說,只有前後都是false的時候才返回false,否則返回true。 alert(true|

this全面解析--JavaScript

函數的調用 fun 全局 是否 參數 沒有 ... obj 引用 上一章我們排除了一些對this的錯誤認識和知道了this是在調用函數時被綁定的,完全取決於函數的調用位置。先介紹兩個概念:調用位置和調用棧。 調用棧:就是為了到達當前執行位置所調用的所有函數。 調用位置:在當

JavaScriptin操作符(for..in)、Object.keys()Object.getOwnPropertyNames()的區別

定義 typeerror 轉換 異常 error: pan 不同 html gree   ECMAScript將對象的屬性分為兩種:數據屬性和訪問器屬性。每一種屬性內部都有一些特性,這裏我們只關註對象屬性的[[Enumerable]]特征,它表示是否通過 for-in 循環

第十javaScript的JSON總結

參考網站:json中國,MDN json 一、必知基礎     JSON 是JavaScript物件文字元號的一個子集,它可以自如的在JavaScript中使用. 看下這個物件: var myJSONObject = {   "b

[轉] JavaScriptin操作符(for..in)、Object.keys()Object.getOwnPropertyNames()的區別

hasd code 復制 不成功 參數 關於 name .net hellip   ECMAScript將對象的屬性分為兩種:數據屬性和訪問器屬性。每一種屬性內部都有一些特性,這裏我們只關註對象屬性的[[Enumerable]]特征,它表示是否通過 for-in 循環返回屬

JavaScript學習總結(五)——Javascript=====的區別

一、JavaScript"=="的作用 當==兩邊的內容是字串時,則比較字串的內容是否相等。 當==兩邊的內容是數字時,則比較數字的大小是否相等。 當==兩邊的內容是物件或者是物件的函式屬性時,則比較記憶體地址是否相等。 二、==和===的區別   ==用於一般比較,===用於嚴格比較

全面解析iOSApp的名稱內容以及啟動頁三大板塊的國際化方案

在做iOS專案時,App的國際化(I18N)幾乎是必做的一件事。App的國際化主要有應用名稱的國際化、內容的國際化,以及啟動頁的國家化。趁著週末有空在網上整理了一些比較全面的資料,給老鐵們分享下。De

JavaScript“==”“===”的區別是什麽?

ber 之間 -s soft microsoft array family 作用 進行 在JavaScript中,“==”和“===”的區別是要視數據類型而定的:對於string/number等基礎數據類型,是有區別的,即不同類型之間的比較,“==”會轉化為相同的數據類型再

(轉)JavaScript=====的區別

嚴格 布爾型 就是 相同 script scrip === bsp true == 用於比較 判斷 兩者相等 ==在比較的時候可以轉自動換數據類型 ===用於嚴格比較 判斷兩者嚴格相等 ===嚴格比較,不會進行自動轉換,要求進行比較的操作數

Swift?!使用總結

Optional(可選型別) Swift的可選(Optional)型別,用於處理值缺失的情況。可選表示“那兒有一個值,並且它等於x”或者“那兒沒有值,為nil”。它的定義通過在型別聲明後加一個 ? 操作符來完成的 : var str = String? Optional

談談JavaScriptvoid操作符的使用

1.首先最常見的是在a標籤中  href="javascript:void(0)" 這個用法不用解釋。 類似的在img標籤中,如有空img,那麼: src="javascript:void(0)" 這樣做對伺服器是有好處的。 2.void 0 先看段程式碼

全面理解JavaScript的 this

全面理解JavaScript中的 this 上下文 VS 作用域 作用域(scope) 是在執行時程式碼中的某些特定部分中變數,函式和物件的可訪問性。換句話 說,作用域決定了程式碼區塊中變數和其他資源的可見性。而上下文 (context)是用來指定程式碼某些特定部分中 this 的值。

面試提升必備 全面解析 iOS 的 Runtime機制

第1章 課程介紹 介紹課程目標和學習內容,以及課程需要用到的知識點和環境引數。 1-1 全面解析iOS中的Runtime機制導學 1-2 介紹課程目標和學習內容 1-3 課程需要用到的知識點和環境引數 第2章 Runtime之必備C知識

解析Javascript從學習bind到實現bind的過程

這篇文章主要介紹了Javascript中從學習bind到實現bind的過程,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 bind是什麼 bind()方法建立一個新的函式, 當被呼叫時,將其this關鍵字設定為提供的值

javascript && ||的妙用

一、||的妙用:引數為空時,給它加上預設值:var param1 = element._zid || (element._zid = _zid++);上文的意思是:if(element._zid){return element._zid;}else{element._zid

全面解析js的for迴圈

JavaScript誕生已經有20多年了,我們一直使用的用來迴圈一個數組的方法是這樣的:for(var index=0;index<myArray.length;index++) {  console.log(myArray[index]);}自從JavaScript5起,我們開始可以使用內建的forE

JavaScriptMath函式總結

最近正在做一個ionic的專案,從原生的轉變為混合開發,算是一個轉折點吧,在專案裡面用到了JavaScript的知識,這個我對Math函式做了一些總結,希望能給你們帶來一些幫助吧。 Math函式 Math.abs() -- 返回數字的絕對值

javascript加號(+)操作符的一些神奇作用

javascript是一門神奇的語言,這沒神奇的語言中有一個神奇的加操作符。 常用的加操作符我們可以用來做: 1.加法運算,例如:alert(1+2); ==>3 2.字串連線,例如:alert(“a”+”b”);==>”ab” 高階一點的還有“+=”,也是做以上兩種操作的。 昨天在javasc

通過例子全面解析Java的Aop技術-包括靜態代理,動態代理,Spring Aop(全面解析,附帶全部原始碼,小白看一遍也可以理解)

AOP概述(Aspect Oriented Programming)所謂AOP,就是面向方面(切面)的程式設計,簡單來說,就是通過面向切面,在執行的方法前後加上所需要實現的事情,比如,日誌,計算方法執行的時間,實現事務等。這樣做的目的一方面在於不改變原有程式碼,提高通用性,最

第112天:javascript函數預解析執行階段

col 對象 全部 內存空間 div 實現 undefined 私有 分解 關於javascript中的函數:   1、預解析:把所有的函數定義提前,所有的變量聲明提前,變量的賦值不提前   2、執行 :從上到下執行,但有例外(setTimeout,setInterval,