今天有人問了我一個這樣的問題檀夹,javascript中张肾,“hello”&&88的結果是什么呢速勇?當時就給我問懵了前痘,趕緊上網(wǎng)搜了一下但是沒有有效的回答凛捏,也算是屬于最后兩個人討論慢慢想清楚的了。
要解決這個問題我們需要先明白這幾點
- &&運算符表示并且芹缔,意思是坯癣,當a&&b時,只有當a和b都為true的時候最欠,最后的運算結果才是true示罗;相反,a和b中任何一個為false芝硬,結果就是false蚜点。
- ||運算符表示或者,意思是拌阴,當a||b時绍绘,只有當a和b都為false的時候,最后的運算結果才是false迟赃;只要a和b中任何一個為true陪拘,結果就是true。
- 短路求值(short-circuit evaluations)纤壁,意思是左刽,當計算a&&b時,如果a的值為false的話酌媒,則不進行b的計算了欠痴,直接輸出a&&b的值為false,因為不論b的值為什么馍佑,結果都為false斋否;當計算a||b時,如果a的值為true的話拭荤,則不進行b的計算了茵臭,直接輸出計算結果為false,因為b的值為什么已經(jīng)對結果構不成影響了舅世。
- 0轉換為false旦委,其他數(shù)字均轉換為true奇徒;空字符串‘'轉換為 false,除此外的一切字符串轉換為 true缨硝;null摩钙、NaN、undefined均轉換為false
結合一些例子
其實到這里大家應該已經(jīng)大概懂了查辩。
console.log("hello" && 88); //88
console.log(88 && "hello"); //hello胖笛。
因為“hello”會被轉化成true,第一個參數(shù)為true宜岛,則會去計算第二個參數(shù)长踊,所以結果為88。88也表示的true萍倡,所以也會去計算第二個參數(shù)身弊。
console.log("hello" && 0); //0
console.log(0 && "hello"); //0
第一個結果為0也屬于情理之中,因為第一個參數(shù)為true列敲,所以會去計算第二個參數(shù)阱佛,最后結果為0也就相當于結果為false啊。第二個結果為0是因為第一個參數(shù)就是0戴而,即false凑术,根據(jù)短路原理,不會再計算第二個參數(shù)了所意,所以結果也為0麦萤。
console.log("hello" || 0); //hello
console.log(0 || "hello"); //hello
第一個結果為hello是根據(jù)短路原理,在進行||運算時扁眯,第一個參數(shù)為true時就會返回結果不會再繼續(xù)進行計算壮莹。第二個結果為hello是因為第一個參數(shù)為0即false,會繼續(xù)計算第二個參數(shù)姻檀,則結果為hello命满,即為true。
console.log(null && undefined); //null
console.log(undefined && null); //undefined
console.log(null || undefined); //undefined
console.log(undefined || null); //null
這幾個例子給大家自己體會~
最后附上一個我覺得挺有用的資料:http://www.grauw.nl/blog/entry/510
如果發(fā)現(xiàn)問題绣版,歡迎批評指正~