鍍金池/ 問答/HTML/ JS中if語句條件如果是賦值語句,那么結(jié)果會是什么?

JS中if語句條件如果是賦值語句,那么結(jié)果會是什么?

比方說下面這段代碼:

var arr = [0,1,2,3,4,5]
for (var i = 0; i < arr.length; i++) {
    if(arr[i] = 0){
        arr.splice(i , 1)
    } 
}
console.log(arr);    //結(jié)果是[ 0, 0, 0, 0, 0, 0 ]

而如果把條件的右邊換成其他數(shù),比方說5或者8,只要不是0就可以,結(jié)果如下:

var arr = [0,1,2,3,4,5]
for (var i = 0; i < arr.length; i++) {
    if(arr[i] = 5){
        arr.splice(i , 1)
    } 
}
console.log(arr);    //結(jié)果是[ 1, 3, 5 ]

我想知道if語句的括號里面發(fā)生了什么,我試著用一個小demo去理解,發(fā)現(xiàn)只要是等式成立,那么返回的結(jié)果都可以被轉(zhuǎn)換成true,我的demo如下,在控制臺的顯示是:

var a = 1    //undefined
Boolean(a = 3)    //true

請問怎么理解上面的代碼呢,為什么if語句賦值恒為true不是刪完所有的數(shù)組項呢?輸出結(jié)果有些讓人匪夷所思。

回答
編輯回答
安若晴

其實這個都是因為賦值表達式的值是賦值表達式右值。
所以你第一段代碼中的

if(arr[i] = 0){ // 這里因為賦值值為0,永遠為假,下面的語句不會執(zhí)行
        arr.splice(i , 1)
    } 

后面

Boolean(a = 3) //這里如果賦值為a=3 !=0 所以返回真,如果是a=0,則返回假。 
2017年6月17日 23:30
編輯回答
誮惜顏

我找到答案了!
一、首先說if(arr[i] = 0)的情況,這里也用上面類似的小demo演示:

var a = 1    //undefined
Boolean(a = 0)    //false

看到了嗎,此時if語句的條件最終的結(jié)果是false,也就是說每次循環(huán)都執(zhí)行了if語句里面的賦值,但是條件不符合,所以if語句里面的代碼塊沒有執(zhí)行,結(jié)果就是6個0。

二、再說說if(arr[i] = 8)的情況:

  1. 第一次循環(huán),i=0,if語句括號里面賦值后結(jié)果是true,所以執(zhí)行條件體,刪除數(shù)組第0項,

此時的數(shù)組是[1,2,3,4,5]

  1. 第二次循環(huán),i=1,if語句括號里面賦值后結(jié)果是true,所以執(zhí)行條件體,刪除數(shù)組第1項,

此時的數(shù)組是[1,3,4,5]

  1. 第三次循環(huán),i=2,if語句括號里面賦值后結(jié)果是true,所以執(zhí)行條件體,刪除數(shù)組第2項,

此時的數(shù)組是[1,3,5]

  1. 第四次循環(huán)的時候,i=4,而此時數(shù)組長度為3,條件不符合,循環(huán)結(jié)束。

這樣就縷清楚了!

2017年5月22日 12:38
編輯回答
別瞎鬧

第一段代碼對數(shù)組進行了賦值操作
第二段代碼對數(shù)組進行刪除元素操作,結(jié)果:[ 1, 3, 5 ] 是刪除后剩下的元素
希望能幫到你

2018年6月27日 08:49
編輯回答
涼汐

賦值語句的返回值是被賦的值本身。

也就是說你第一段代碼的 if 進不去是因為都是 if(0),第二次都是 if(5) 所以就進去了

我們經(jīng)常會這樣利用這個特性:

var a5 = a[5] || (a[5] = 100)
// 取 a 的 5 號位,如果沒有值(或者 falsey),為它賦值并取它的值

聰明如你應該一下就能看懂

注意一個區(qū)別,變量聲明語句沒有返回值,這解釋你最后一段的倒數(shù)第二行代碼
簡單的驗證:

var a = 1 // undefined
a = 2 // 2

希望對你有幫助

2017年1月11日 10:44
編輯回答
尐飯團
  • 第一個: 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é)果很詫異,運行一下就知道了

當i=0時,進入if,數(shù)組變?yōu)閇5,1,2,3,4,5],執(zhí)行刪除——>[1,2,3,4,5]
當i=1時,進入if,數(shù)組變?yōu)閇1,5,3,4,5],執(zhí)行刪除——>[1,3,4,5]
當i=2時,進入if,數(shù)組變?yōu)閇1,3,5,5],執(zhí)行刪除——>[1,3,5]
當i=3時,此時數(shù)組長度僅為3,跳出循環(huán),得到最終結(jié)果

2017年7月12日 19:43