已知arr = [1,2,NaN,1,4,2,NaN],现为输出arr的不重复元素(重复元素只输出一次),则下列程序中的①处,可以作为判断条件的是()

发布时间 2023-11-10 16:54:37作者: 龙陌
var newArr = [];
for(var i = 0 ;i<arr.length;i++){
  if(①){
    newArr.push(arr[i]);
  }
}
console.log(newArr);

A
newArr.indexOf(arr[i]) == -1

B
!newArr.indexOf(arr[i]) == -1

C
newArr.includes(arr[i])

D
!newArr.includes(arr[i])

正确答案:D
indexOf()方法与includes()方法的一个重要区别在于indexOf()并不能判断数组的NaN元素,
换句话说,不管数组arr是否有NaN元素,arr.indexOf(NaN)返回值都是-1,
所以AB选项不能对NaN进行去重,不符合题意;
如果newArr数组不含有arr数组的某个元素,就应该把该元素添加到newArr数组中,如果含有,则不能添加,这样才能达到去重的目的,
即newArr.includes(arr[i])返回值为false时,就应该执行if内的语句,所以应该使用“!”对条件取反,D选项符合题意,C选项不符合题意

NaN 相关:

NaN == NaN // false
NaN === NaN // false

// indexOf方法无法识别数组的NaN成员
[NaN].indexOf(NaN) // -1

// 向 Set 数据结构中加入值时认为NaN等于自身
let set = new Set();
set.add(NaN);
set.add(NaN);
console.log(set); // Set {NaN}

// Object.is()方法认为NaN等于NaN
Object.is(NaN, NaN) // true
+0 === -0 //true
Object.is(+0, -0) // false

// ES7中新增的数组实例方法,includes()方法认为NaN等于自身
[1, 2, NaN].includes(NaN) // true

indexOf()判断是否相等使用的是严格相等运算符 === ,所以
[NaN].indexOf(NaN)值为-1。

includes()判断是否相等使用的是sameValueZero判断算法,所以
[NaN].includes(NaN)值为true。

[1, 2, NaN].includes(NaN); // true
console.log([1, 2, NaN].indexOf(NaN)) //-1