var a = ["a","b","c"]; var b = ["a","b"];function diff(arr1,arr2){ var newArr = arr1.length>=arr2.length?arr1:arr2.filter(function(ele){if(arr1.length>=arr2.length?arr2:arr1.indexOf(ele)==-1){ return ele } }) return newArr;}
diff(a,b)
結(jié)果是
["a", "b", "c"]
而
a.filter(function(ele){ if(b.indexOf(ele)==-1){ return ele } })
的結(jié)果是["c"]
在函數(shù)中
arr1.length>=arr2.length?arr1:arr2
結(jié)果確實是數(shù)組a。
arr1.length>=arr2.length?arr2:arr1
也確實是數(shù)組b
但運行結(jié)果卻是不一樣。這是為什么?
貌似樓主的需求是要對a,b數(shù)組中的不同元素作為函數(shù)執(zhí)行的結(jié)果返回。1、樓上兄弟說的運算符優(yōu)先級問題,但是首先.是不是運算符有待討論,翻了下犀牛書下,沒發(fā)現(xiàn)把.歸在運算符中,而是稱之為調(diào)用表達(dá)式。但從樓主的意圖看,的確如1樓兄弟所說,樓主可能認(rèn)為是先運算了?:操作,再執(zhí)行的filter函數(shù)。2、第一,在這段代碼中,>=的優(yōu)先級要高于?:,所以先運算這部分,根據(jù)它的結(jié)果來決定執(zhí)行賦值,是賦arr1,還是arr2.filter()之后的結(jié)果。第二,filter的寫法有點怪怪的,雖然這么寫也沒有什么問題。filter返回一個新的數(shù)組,不會對原數(shù)組進(jìn)行修改,返回的數(shù)組的元素就是通過了傳入的函數(shù)真值檢測的值。第一段中,如果arr1的長度大了,返回一個數(shù)組,結(jié)果必定是true,如果arr2的長度大了,會檢測arr1中的是否包含傳入的元素,結(jié)果為true,返回了這個元素。繞到這才看的明白,函數(shù)要對arr2過濾,返回和arr1中相同的元素。那么問題來了,第一,從這段代碼中無法保證filter函數(shù)中的返回值符合預(yù)期,因為通過了filter中條件后return回去的ele不能保證一定為true,比如ele是0,undefined,null等。而沒有通過if條件檢測時則隱式的返回了undefined,也就是false。所有感覺怪怪的。
因為.運算符的優(yōu)先級高于:運算符啊,var newArr = arr1.length>=arr2.length?arr1:arr2.filter實際上是var newArr = arr1.length>=arr2.length?arr1:(arr2.filter)你要的是(var newArr = (arr1.length>=arr2.length?arr1:arr2).filter)看懂了嗎?