5 回答

TA貢獻1786條經(jīng)驗 獲得超11個贊
第一個: arr[i] = 0執(zhí)行的是先賦值,得到結(jié)果0,再執(zhí)行if(0),0是false啊,所以不進if語句,所以循環(huán)一遍其實就是挨個賦值了,得到6個0不難理解吧
if(arr[i] = 0){
arr.splice(i , 1)
}
第二個:其實看起來結(jié)果很詫異,運行一下就知道了
當(dāng)i=0時,進入if,數(shù)組變?yōu)閇5,1,2,3,4,5],執(zhí)行刪除——>[1,2,3,4,5]
當(dāng)i=1時,進入if,數(shù)組變?yōu)閇1,5,3,4,5],執(zhí)行刪除——>[1,3,4,5]
當(dāng)i=2時,進入if,數(shù)組變?yōu)閇1,3,5,5],執(zhí)行刪除——>[1,3,5]
當(dāng)i=3時,此時數(shù)組長度僅為3,跳出循環(huán),得到最終結(jié)果

TA貢獻1798條經(jīng)驗 獲得超3個贊
賦值語句的返回值是被賦的值本身。
也就是說你第一段代碼的 if 進不去是因為都是 if(0),第二次都是 if(5) 所以就進去了
我們經(jīng)常會這樣利用這個特性:
var a5 = a[5] || (a[5] = 100)
// 取 a 的 5 號位,如果沒有值(或者 falsey),為它賦值并取它的值
聰明如你應(yīng)該一下就能看懂
注意一個區(qū)別,變量聲明語句沒有返回值,這解釋你最后一段的倒數(shù)第二行代碼
簡單的驗證:
var a = 1 // undefined
a = 2 // 2
希望對你有幫助

TA貢獻1803條經(jīng)驗 獲得超6個贊
我找到答案了!
一、首先說if(arr[i] = 0)
的情況,這里也用上面類似的小demo演示:
var a = 1 //undefinedBoolean(a = 0) //false
看到了嗎,此時if語句的條件最終的結(jié)果是false,也就是說每次循環(huán)都執(zhí)行了if語句里面的賦值,但是條件不符合,所以if語句里面的代碼塊沒有執(zhí)行,結(jié)果就是6個0。
二、再說說if(arr[i] = 8)
的情況:
第一次循環(huán),i=0,if語句括號里面賦值后結(jié)果是true,所以執(zhí)行條件體,刪除數(shù)組第0項,
此時的數(shù)組是[1,2,3,4,5]
第二次循環(huán),i=1,if語句括號里面賦值后結(jié)果是true,所以執(zhí)行條件體,刪除數(shù)組第1項,
此時的數(shù)組是[1,3,4,5]
第三次循環(huán),i=2,if語句括號里面賦值后結(jié)果是true,所以執(zhí)行條件體,刪除數(shù)組第2項,
此時的數(shù)組是[1,3,5]
第四次循環(huán)的時候,i=4,而此時數(shù)組長度為3,條件不符合,循環(huán)結(jié)束。
這樣就縷清楚了!

TA貢獻1806條經(jīng)驗 獲得超8個贊
第一段代碼對數(shù)組進行了賦值操作
第二段代碼對數(shù)組進行刪除元素操作,結(jié)果:[ 1, 3, 5 ] 是刪除后剩下的元素
希望能幫到你

TA貢獻1858條經(jīng)驗 獲得超8個贊
其實這個都是因為賦值表達式的值是賦值表達式右值。
所以你第一段代碼中的
if(arr[i] = 0){ // 這里因為賦值值為0,永遠為假,下面的語句不會執(zhí)行
arr.splice(i , 1)
}
后面
Boolean(a = 3) //這里如果賦值為a=3 !=0 所以返回真,如果是a=0,則返回假。
添加回答
舉報