W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
void
運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式,然后不返回任何值,或者說(shuō)返回undefined
。
void 0 // undefined
void(0) // undefined
上面是void
運(yùn)算符的兩種寫(xiě)法,都正確。建議采用后一種形式,即總是使用圓括號(hào)。因?yàn)?code>void運(yùn)算符的優(yōu)先性很高,如果不使用括號(hào),容易造成錯(cuò)誤的結(jié)果。比如,void 4 + 7
實(shí)際上等同于(void 4) + 7
。
下面是void
運(yùn)算符的一個(gè)例子。
var x = 3;
void (x = 5) //undefined
x // 5
這個(gè)運(yùn)算符的主要用途是瀏覽器的書(shū)簽工具(Bookmarklet),以及在超級(jí)鏈接中插入代碼防止網(wǎng)頁(yè)跳轉(zhuǎn)。
請(qǐng)看下面的代碼。
<script>
function f() {
console.log('Hello World');
}
</script>
<a rel="external nofollow" target="_blank" onclick="f(); return false;">點(diǎn)擊</a>
上面代碼中,點(diǎn)擊鏈接后,會(huì)先執(zhí)行onclick
的代碼,由于onclick
返回false
,所以瀏覽器不會(huì)跳轉(zhuǎn)到 example.com。
void
運(yùn)算符可以取代上面的寫(xiě)法。
<a href="javascript: void(f())">文字</a>
下面是一個(gè)更實(shí)際的例子,用戶點(diǎn)擊鏈接提交表單,但是不產(chǎn)生頁(yè)面跳轉(zhuǎn)。
<a href="javascript: void(document.form.submit())">
提交
</a>
逗號(hào)運(yùn)算符用于對(duì)兩個(gè)表達(dá)式求值,并返回后一個(gè)表達(dá)式的值。
'a', 'b' // "b"
var x = 0;
var y = (x++, 10);
x // 1
y // 10
上面代碼中,逗號(hào)運(yùn)算符返回后一個(gè)表達(dá)式的值。
逗號(hào)運(yùn)算符的一個(gè)用途是,在返回一個(gè)值之前,進(jìn)行一些輔助操作。
var value = (console.log('Hi!'), true);
// Hi!
value // true
上面代碼中,先執(zhí)行逗號(hào)之前的操作,然后返回逗號(hào)后面的值。
JavaScript 各種運(yùn)算符的優(yōu)先級(jí)別(Operator Precedence)是不一樣的。優(yōu)先級(jí)高的運(yùn)算符先執(zhí)行,優(yōu)先級(jí)低的運(yùn)算符后執(zhí)行。
4 + 5 * 6 // 34
上面的代碼中,乘法運(yùn)算符(*
)的優(yōu)先性高于加法運(yùn)算符(+
),所以先執(zhí)行乘法,再執(zhí)行加法,相當(dāng)于下面這樣。
4 + (5 * 6) // 34
如果多個(gè)運(yùn)算符混寫(xiě)在一起,常常會(huì)導(dǎo)致令人困惑的代碼。
var x = 1;
var arr = [];
var y = arr.length <= 0 || arr[0] === undefined ? x : arr[0];
上面代碼中,變量y
的值就很難看出來(lái),因?yàn)檫@個(gè)表達(dá)式涉及5個(gè)運(yùn)算符,到底誰(shuí)的優(yōu)先級(jí)最高,實(shí)在不容易記住。
根據(jù)語(yǔ)言規(guī)格,這五個(gè)運(yùn)算符的優(yōu)先級(jí)從高到低依次為:小于等于(<=
)、嚴(yán)格相等(===
)、或(||
)、三元(?:
)、等號(hào)(=
)。因此上面的表達(dá)式,實(shí)際的運(yùn)算順序如下。
var y = ((arr.length <= 0) || (arr[0] === undefined)) ? x : arr[0];
記住所有運(yùn)算符的優(yōu)先級(jí),是非常難的,也是沒(méi)有必要的。
圓括號(hào)(()
)可以用來(lái)提高運(yùn)算的優(yōu)先級(jí),因?yàn)樗膬?yōu)先級(jí)是最高的,即圓括號(hào)中的表達(dá)式會(huì)第一個(gè)運(yùn)算。
(4 + 5) * 6 // 54
上面代碼中,由于使用了圓括號(hào),加法會(huì)先于乘法執(zhí)行。
運(yùn)算符的優(yōu)先級(jí)別十分繁雜,且都是硬性規(guī)定,因此建議總是使用圓括號(hào),保證運(yùn)算順序清晰可讀,這對(duì)代碼的維護(hù)和除錯(cuò)至關(guān)重要。
順便說(shuō)一下,圓括號(hào)不是運(yùn)算符,而是一種語(yǔ)法結(jié)構(gòu)。它一共有兩種用法:一種是把表達(dá)式放在圓括號(hào)之中,提升運(yùn)算的優(yōu)先級(jí);另一種是跟在函數(shù)的后面,作用是調(diào)用函數(shù)。
注意,因?yàn)閳A括號(hào)不是運(yùn)算符,所以不具有求值作用,只改變運(yùn)算的優(yōu)先級(jí)。
var x = 1;
(x) = 2;
上面代碼的第二行,如果圓括號(hào)具有求值作用,那么就會(huì)變成1 = 2
,這是會(huì)報(bào)錯(cuò)了。但是,上面的代碼可以運(yùn)行,這驗(yàn)證了圓括號(hào)只改變優(yōu)先級(jí),不會(huì)求值。
這也意味著,如果整個(gè)表達(dá)式都放在圓括號(hào)之中,那么不會(huì)有任何效果。
(expression)
// 等同于
expression
函數(shù)放在圓括號(hào)中,會(huì)返回函數(shù)本身。如果圓括號(hào)緊跟在函數(shù)的后面,就表示調(diào)用函數(shù)。
function f() {
return 1;
}
(f) // function f(){return 1;}
f() // 1
上面代碼中,函數(shù)放在圓括號(hào)之中會(huì)返回函數(shù)本身,圓括號(hào)跟在函數(shù)后面則是調(diào)用函數(shù)。
圓括號(hào)之中,只能放置表達(dá)式,如果將語(yǔ)句放在圓括號(hào)之中,就會(huì)報(bào)錯(cuò)。
(var a = 1)
// SyntaxError: Unexpected token var
對(duì)于優(yōu)先級(jí)別相同的運(yùn)算符,同時(shí)出現(xiàn)的時(shí)候,就會(huì)有計(jì)算順序的問(wèn)題。
a OP b OP c
上面代碼中,OP
表示運(yùn)算符。它可以有兩種解釋方式。
// 方式一
(a OP b) OP c
// 方式二
a OP (b OP c)
上面的兩種方式,得到的計(jì)算結(jié)果往往是不一樣的。方式一是將左側(cè)兩個(gè)運(yùn)算數(shù)結(jié)合在一起,采用這種解釋方式的運(yùn)算符,稱(chēng)為“左結(jié)合”(left-to-right associativity)運(yùn)算符;方式二是將右側(cè)兩個(gè)運(yùn)算數(shù)結(jié)合在一起,這樣的運(yùn)算符稱(chēng)為“右結(jié)合”運(yùn)算符(right-to-left associativity)。
JavaScript 語(yǔ)言的大多數(shù)運(yùn)算符是“左結(jié)合”,請(qǐng)看下面加法運(yùn)算符的例子。
x + y + z
// 引擎解釋如下
(x + y) + z
上面代碼中,x
與y
結(jié)合在一起,它們的預(yù)算結(jié)果再與z
進(jìn)行運(yùn)算。
少數(shù)運(yùn)算符是“右結(jié)合”,其中最主要的是賦值運(yùn)算符(=
)和三元條件運(yùn)算符(?:
)。
w = x = y = z;
q = a ? b : c ? d : e ? f : g;
上面代碼的解釋方式如下。
w = (x = (y = z));
q = a ? b : (c ? d : (e ? f : g));
上面的兩行代碼,都是右側(cè)的運(yùn)算數(shù)結(jié)合在一起。
另外,指數(shù)運(yùn)算符(**
)也是右結(jié)合。
2 ** 3 ** 2
// 相當(dāng)于 2 ** (3 ** 2)
// 512
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: