【问题标题】:JavaScript indexOf(), includes() not understandable behaviour [duplicate]JavaScript indexOf(),includes()不可理解的行为[重复]
【发布时间】:2022-01-01 20:48:47
【问题描述】:

我找不到对以下内容的解释。为什么会这样?

let mainArr = [ [1], [2] ]
let subArr = [1]
let result = mainArr.includes(subArr)     *//output: false*

还有

let mainArr = [ [1], [2] ]
let subArr = [1]
let result = mainArr.indexOf(subArr)     *//output: -1*

这是我的原始代码:

let mainArr =  [ [ 'apple', 1 ], [ 'bat', 2 ], [ 'cookie', 2 ] ] 
let subArr = [ [ 'apple', 1 ] ]     *//with let subArr = [ 'apple', 1 ] will be also -1*
let result = mainArr.indexOf(subArr)     *//output: -1*

我不明白...

【问题讨论】:

  • 可能是重复的,但是.. 数组是引用类型,它们在引用上进行比较:[] === [] 始终为 false。

标签: javascript arrays include indexof


【解决方案1】:

[1] 数组是mainArr 变量的第一个元素,另一个数组[1]subArr 变量的值不是同一个数组。它们是两个不同的数组,都以 1 作为唯一元素。这就是为什么当你调用includes 时你会得到错误,而当你调用indexOf 时你会得到-1。 如果你希望它是同一个数组,你可以这样做:

let subArr = [1]; // create the [1] array and store a reference to it inside the subArr variable
let mainArr = [subArr, [2]]; // assign the subArr variable as the first element of the mainArr array
let result = mainArr.includes(subArr); // result is true

【讨论】:

    【解决方案2】:

    数组在 javascript 中被视为Objects。只有基本类型,如stringsintegers,可以通过它们在javascript 中的值进行比较。不幸的是,Objects 是通过它们的引用进行比较的(也就是它们存储在内存中的位置)。 -- 每次创建对象时,都会为其存储在内存中的空间提供一个引用 -- 因此,即使一个对象看起来相同,但它的引用却不同。

    要比较两者,您必须遍历一个数组并将每个值与第二个数组的相应索引进行比较。比如:

    
          for (let i = 0; i < mainArr.length; i++){
             if (mainArr[i] !== subArr[i]){
                //not the same
             } else {
                continue
             }
     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2015-02-27
      相关资源
      最近更新 更多