首页 > 试题广场 >

已知arr = [1,2,NaN,1,4,2,NaN],现为

[单选题]

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

var newArr = [];
for(var i = 0 ;i<arr.length;i++){
  if(①){
    newArr.push(arr[i]);
  }
}
console.log(newArr);

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

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

  • newArr.includes(arr[i])

  • !newArr.includes(arr[i])

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

发表于 2021-12-15 08:38:02 回复(4)

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

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


js中的相等比较算法有以下四种:
1.        The Abstract Equality Comparison Algorithm (==)            
2.        The Strict Equality Comparison Algorithm (===)               
3.        SameValue (Object.is())                (附:这里NaN和NaN相等,0和-0不相等)
4.        SameValueZero (暂未提供API)     (附:这里NaN和NaN相等,0和-0和+0都是相等的)

最常见的就是第一种和第二种,大家应该都知道了(==只比较值,不比较值的类型;===既比较值,又比较值的类型)
下面我们主要说第三种和第四种。

SameValue (Object.is()) 
Object.is(NaN,NaN);  //true
Object.is(0,-0);     //false
Object.is(0,+0);     //true
Object.is(+0,-0);    //false
1)我们知道NaN==NaN是false,NaN===NaN也是false,  但是SameValue算法里,NaN和NaN是相等的。
2)SameValue算法里0默认是+0,同时 0 和 -0 是不相等的(+0和-0也不相等)。


SameValueZero (暂未提供API)
SameValueZero算法和SameValue算法的区别在于对0的处理(认为0、+0以及-0三者是相等的),其他的和SameValue一样(例如NaN和NaN是相等的)
例一: 
[NaN].includes(NaN);  //true 
[0].includes(-0);  //true 
[0].includes(+0);  //true  


例二:
const a = new Set();
a.add(0);
a.add(NaN);
 
a.has(-0);  //true
a.has(+0);  //true
a.has(NaN); //true
includes()内部使用的比较算法就是SameValueZero,Set中的has()比较是否相等用的算法也是SameValueZero
(+0和-0和0都是相等的,NaN和NaN也是相等的)


编辑于 2022-01-09 19:29:09 回复(7)
[1, 2, NaN].includes(NaN); // true
console.log([1, 2, NaN].indexOf(NaN)) //-1
发表于 2021-12-10 16:36:19 回复(0)
indexOf无法识别数组的NaN,有它返回-1,set中NaN等于自身,Object.js(NAN,NAN)//ture includes方法能识别NaN
发表于 2022-07-18 23:20:06 回复(0)
Object.is(NaN,NaN);//true
[1, 2, NaN].includes(NaN); // true
发表于 2021-12-14 09:50:41 回复(0)
indexOf和includes的区别在于,第一:indexOf(NaN)必定返回-1,不能对NaN去重;第二返回值不同,indexOf返回索引值,includes返回布尔值
发表于 2022-08-21 13:38:26 回复(0)
indexOf()方法与includes()方法的一个重要区别在于indexOf()并不能判断数组的NaN元素,换句话说,不管数组arr是否有NaN元素,arr.indexOf(NaN)返回值都是-1
[1, 2, NaN].includes(NaN); // true
console.log([1, 2, NaN].indexOf(NaN)) //-1

发表于 2022-07-19 16:50:26 回复(1)
indexOf无法识别数组的NaN,有它返回-1,set中NaN等于自身,Object.js(NAN,NAN)//ture includes方法能识别NaN
发表于 2022-04-06 02:08:04 回复(0)
首先排除B C 逻辑都不对
发表于 2022-04-03 11:36:16 回复(0)
哦顿悟了,NAN和NAN不想等!
发表于 2022-03-09 00:18:23 回复(0)