Javascript 中的短路求值是指在邏輯運算中,如果第一個操作數已經能夠確定結果,則不會計算第二個操作數,而直接返回第一個操作數的值。這種求值方式雖然可以提高程序的運行效率,但也會導致一些預期外的結果。下面我們來看幾個實例:
1. 利用短路求值來實現默認參數
function test(a, b) { b = b || 0; console.log(a + b); } test(1, 2); //輸出3 test(1); //輸出1,因為b的值為0
2. 利用短路求值來判斷對象屬性是否存在
var obj = { a: 1, b: null }; console.log(obj.a && obj.a.foo); //輸出undefined console.log(obj.b && obj.b.foo); //輸出null
3. 利用短路求值來避免空指針異常
var obj = { a: { b: { c: 1 } } }; console.log(obj && obj.a && obj.a.b && obj.a.b.c); //輸出1 console.log(obj && obj.a && obj.a.b && obj.a.b.d); //輸出undefined
需要注意的是,短路求值只適用于布爾運算符(&& 和 ||),不適用于位運算符(&、|、^、~等)。
另外,短路求值在一些場景下會出現一些問題。如下面的代碼:
var x = 1; var y = 2; x >0 && (y = y + 1); console.log(y); //輸出2
這時候我們可能預期的結果是 y 的值為3,但實際上,因為 x 的值為1,所以第一個操作數為真,第二個操作數并沒有執行,導致 y 的值沒有被修改。
綜上所述,短路求值雖然可以提高程序的效率,但需要注意一些細節上的問題,慎重使用。