为什么使用相同的函数对数组进行映射会返回不同的对象?

23 浏览
0 Comments

为什么使用相同的函数对数组进行映射会返回不同的对象?

我想知道为什么使用相同的函数进行映射时,v.map(...)不等于v.map(...)。\n在Node REPL上运行此代码,第二个表达式的结果是false。

0
0 Comments

这是因为在Javascript中,数组是通过引用而不是值进行比较的。

换句话说,像这样做:

[1,2] === [1,2];

在Javascript中返回false,因为这两个数组在内存中占据不同的位置。它们不是通过它们可能具有的实际内容进行比较的(这就是我们所说的按值比较)。

相反,执行以下操作:

var x = [1,2];
x === x;

返回true。在这种情况下,变量x引用(解析到数组的内存位置)相同的数组,而这个共同的内存位置引用足以产生true

map()返回一个数组。在Javascript中,通过值比较两个数组是一个相当复杂的事情。

解决这个问题的方法之一是在比较之前先将数组转换为字符串形式,然后再进行比较。这样可以通过JSON.stringify()方法来实现。例如:

var array1 = [1, 2];
var array2 = [1, 2];
if (JSON.stringify(array1) === JSON.stringify(array2)) {
    console.log("The arrays are equal");
} else {
    console.log("The arrays are not equal");
}

在这个例子中,我们使用JSON.stringify()将数组转换为字符串,然后进行比较。这样,我们可以通过比较字符串来判断两个数组是否相等。

注意:这种方法仅适用于数组中的值是基本类型(如数字、字符串等)。如果数组中包含复杂类型(如对象或函数),则需要使用其他方法来进行比较。

0
0 Comments

为什么使用相同的函数来映射数组会返回不同的对象?

当比较非基本类型的相等性时,Javascript通过引用相等性来进行比较 - 也就是说,被测试的两个对象是否引用内存中的同一个对象?

在这种情况下,它们并不是 - .map返回一个新的对象,并且在同一个数组上运行两次.map将返回两个不同的引用 - 不管在映射过程中进行了哪些计算。

总结一下:

v === v 是true,因为v引用内存中的同一个对象

[1,2,3,4,5] === [1,2,3,4,5] 是false,因为这两个数组是内存中的不同对象(即比较的是引用而不是值)

.map总是会返回一个新的数组实例 - 所以结果不能等于另一个.map语句

解决方法:

要比较两个数组是否相等,可以使用其他方法,如循环遍历数组并逐个比较元素的值。另外,可以使用JSON.stringify将数组转换为字符串,然后比较字符串的相等性。

例如:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [1, 2, 3, 4, 5];
// 方法一:循环遍历比较元素值
function arraysEqual(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }
  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i] !== arr2[i]) {
      return false;
    }
  }
  return true;
}
console.log(arraysEqual(arr1, arr2)); // 输出 true
// 方法二:将数组转换为字符串比较
console.log(JSON.stringify(arr1) === JSON.stringify(arr2)); // 输出 true

通过以上方法,我们可以比较两个数组的相等性,而不受.map方法返回不同对象的影响。

0