摘要:首先處理因為關(guān)系運算符優(yōu)先于邏輯運算符。在關(guān)系運算符兩側(cè)的和作為數(shù)值參加關(guān)系運算,的值為?,F(xiàn)在的左側(cè)為,右側(cè)為運算符,而運算符優(yōu)先于,應(yīng)先進行由于的級別最高,因此先進行,得到結(jié)果。此時是對整個右邊的值求值,則,優(yōu)先級高于,則。
這次討論一下JavaScript運算符的結(jié)合性和優(yōu)先級問題 相關(guān)知識鏈接:MDN運算符優(yōu)先級,jingxian:淺談JS運算符&&和|| 及其優(yōu)先級
來源一篇知乎上的問題:JavaScript中運算符優(yōu)先級的問題
這是知友樂已生悲回答的答案:
var a = 0; console.log( 5 > 3 && 8 < 4 + (a = 5) )
表達式“5 > 3 && 8 < 4 + (a = 5)”自左向右掃描。首先處理“5 > 3”(因為關(guān)系運算符“>”優(yōu)先于邏輯運算符“&&”)。在關(guān)系運算符“>”兩側(cè)的5 和 3 作為數(shù)值參加關(guān)系運算,“5>3”的值為true。再進行“true && 8 < 4 + (a = 5)”的運算,“&&”左邊為true,則進行它右邊表達式的運算。8的左側(cè)為“&&”,右側(cè)為“<”運算符,根據(jù)優(yōu)先規(guī)則,應(yīng)先進行“<”的運算,即先進行“8 < 4 + (a = 5)”的運算?,F(xiàn)在4的左側(cè)為“<”,右側(cè)為“+”運算符,而“+”運算符優(yōu)先于“<”,應(yīng)先進行“4 + (a = 5)”,由于“()”的級別最高,因此先進行“a=5”,得到結(jié)果5。然后進行“4 + 5”的運算,得到結(jié)果9,再進行“8 < 9”的運算,得到true,最后進行“true && true”,得到true。(這個例子是模仿《c程序設(shè)計》第四版94頁的例子)
作者:樂己生悲
鏈接:https://www.zhihu.com/questio...
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
我在變換一下幾個式子,試著求值。
5 > 3 && 8 < 4 + (a = 5); false && 8 < 4 + 3 // false : 由于AND操作符左邊的運算為false,短路,直接返回false 5 > 2 || 2 > 4 && 3 > 2 // true : 依次從左向右運算,5>2:true,則 true || 2 > 4 && 3 > 2。由于OR操作符左邊的運算為真,短路,直接返回OR左邊的值。右邊表達式全部忽略; 1 > 2 || 0 && 3 > 2 // 0:從左至右,OR表達式為左結(jié)合,則1>2:false,則false || 0 && 3 > 2。此時是對OR整個右邊的值求值,則0 && 3 > 2,>優(yōu)先級高于AND,則3>2:true。 // 此時則為0 && true,AND為左結(jié)合,先對左邊求值,求值為0,直接返回0,此時最后才是false || 0,OR運算符為左結(jié)合,左邊求值false,則直接返回右值0。 // 看來的確是對的-0-,我是邊分析最后才console,萬一錯了,上面的思路都編程瞎掰的了...... var a = 5; 0 || 6 > a++ && 50 > (3+2)*2 console.log(a); // 依舊從左至右,后面我會用函數(shù)來證明,JavaScript執(zhí)行語句大多數(shù)情況上到下,左到右。優(yōu)先級是根據(jù)結(jié)合性來判斷的,并不是單純的誰優(yōu)先誰就先算 // 對OR左邊求值,為0,則繼續(xù)對右邊求值,即6 > a++ && 50 > (3+2)*1,依舊從左至右。a++是后置自增,后置運算無結(jié)合性。則會先使用a后自增,此時相當(dāng)于 // (6 > 5)++,運算進行到AND,依舊是左結(jié)合,左邊的運算已經(jīng)為true,則直接對右邊繼續(xù)求值,即50 > (3+2)*2,大括號優(yōu)先級最高,先加法后乘法,則(3+2)*2:10 // 最后才是50 > 10,結(jié)果為true,則AND返回的是右邊表達式的值:true。最后最后得出true。 // console我對了,可以試試把AND右邊整體的值換成1,再次console應(yīng)該是:1。 // a:6 var x = 5; var y = 3+2*x++; alert(y+" | "+x) // y的值是13還是15? 是13 // 從左至右,此時遇上的運算符有+、*、后置自增。則應(yīng)考慮優(yōu)先級,即(3 + (2 * (x)))++ // 沒錯,自增是最后才進行的。具體可以看segmentfault里JS表達式語句4.6.4 // 計算2*5之后,與3相加,最后賦值給y,做完這些,x才自增,這就是后置遞增遞減運算符的特性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/82852.html
摘要:變量名必須以字母美元符號下劃線開始,只能包含字母數(shù)字下劃線和美元符號。你有元現(xiàn)在是第年小練習(xí)計算從和增長到自身的倍需要的次數(shù)。 2.3 程序的構(gòu)成 表達式,用于計算并得到值; 變量,用于保存數(shù)據(jù),以便將來使用; 語句,用于執(zhí)行腳本的操作; 2.3.1 表達式 2 2+8.1+5 (2+8.1)* 5 9>4 9>4 && 1===2 dog+house Hello.length ...
摘要:有這樣一個熱門問題其實這個問題很好理解,關(guān)鍵要弄清下面兩個知識點引擎對賦值表達式的處理過程賦值運算的右結(jié)合性一賦值表達式形如的表達式稱為賦值表達式。賦值表達式是右結(jié)合的。 有這樣一個熱門問題: var a = {n: 1}; var b = a; a.x = a = {n: 2}; alert(a.x); // --> undefined alert(b.x); // --> {n: ...
摘要:寫在最前本次分享一下通過廣度優(yōu)先搜索解決八數(shù)碼問題并展示其最短路徑的動畫效果。一個排列中逆序的總數(shù)就稱為這個排列的逆序數(shù)。如果起始狀態(tài)與結(jié)束狀態(tài)的逆序數(shù)的奇偶性相同,則說明狀態(tài)可達,反之亦然。 寫在最前 本次分享一下通過廣度優(yōu)先搜索解決八數(shù)碼問題并展示其最短路徑的動畫效果。 歡迎關(guān)注我的博客,不定期更新中—— 效果預(yù)覽 該效果為從[[2, 6, 3],[4, 8, 0],[7, 1, ...
摘要:如果參數(shù)不在與之間,該方法將返回一個空字符串這個不解釋了方法用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達式匹配的子串。 主要總結(jié) JavaScript的六種數(shù)據(jù)類型:Boolean、Number、String、Null、Undefined、Object 布爾類型 布爾真假判定:短路原則 x && y 只有在x和y都為真的情況下為真。即真真為真,短路:因比較運算為左...
摘要:結(jié)合性當(dāng)一個運算對象兩側(cè)的運算符優(yōu)先級別相同時,則按運算符的結(jié)合性來確定表達式的運算順序。大多數(shù)運算符結(jié)合方向是左結(jié)合性,只有三類運算符的結(jié)合方向是右結(jié)合性,即單目運算符條件運算符賦值運算符。 C語言運算符的優(yōu)先級和結(jié)合性詳細解說 優(yōu)先級 運算符 含義 使用形式 結(jié)合性 操作數(shù) ...
閱讀 1166·2021-11-24 09:39
閱讀 3668·2021-11-22 13:54
閱讀 2637·2021-10-11 10:59
閱讀 889·2021-09-02 15:40
閱讀 1136·2019-08-30 15:55
閱讀 1107·2019-08-30 13:57
閱讀 2437·2019-08-30 13:17
閱讀 3081·2019-08-29 18:32