在JavaScript中,原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)之间存在着根本的区别。原始值是不可变的,意味着它们的值无法改变。这对于数字和布尔值很容易理解:修改它们的值是没有意义的。然而,对于字符串来说,这可能会稍微不太直观。由于字符串类似于字符数组,可能会认为在特定索引处修改字符是可能的。然而,JavaScript不允许这样做。所有看似修改字符串的方法实际上都返回一个新的字符串。例如:
// 一个小写字符串
let s = "hello";
// 返回 "HELLO",但不会修改s
s.toUpperCase();
// => "hello":原始字符串保持不变
s
原始值通过其值进行比较,意味着只有当两个值的值相同时,它们才被认为是相等的。这在处理数字、布尔值、null和undefined时可能听起来令人困惑。但实际上很简单:例如,当比较两个不同的字符串时,只有当它们具有相同的长度且在相同索引处的每个字符都相同时,JavaScript才认为它们是相等的。
(程序员的软技能:ke.qq.com/course/6034346)
另一方面,对象是可变的;它们的值可以改变:
// 声明一个对象
let o = { x: 1 };
// 修改:更改一个属性的值
o.x = 2;
// 修改:添加新属性
o.y = 3;
// 数组也是可变的
let a = [1, 2, 3];
// 修改:更改一个元素的值
a[0] = 0;
// 修改:添加新元素
a[3] = 4;
对象不是通过值进行比较的;即使两个具有相同属性和值的不同对象,也不被认为是相等的。类似地,具有相同元素且顺序相同的两个不同数组也不相等:
// 两个具有相同属性的对象
let o = { x: 1 }, p = { x: 1 };
// => false:不同的对象永远不会相等
o === p
// 两个不同的空数组
let a = [], b = [];
// => false:不同的数组永远不会相等
a === b
对象有时被称为引用类型,与JavaScript的原始类型相对。根据这种术语,对象值是引用,对象通过引用进行比较。换句话说,只有当两个对象值引用相同的底层对象时,它们才相等。
// 这个变量引用一个空数组
let a = [];
// 现在b也引用相同的数组
let b = a;
// 修改变量b引用的数组
b[0] = 1;
// => 1:变化也会通过变量a可见
a[0]
// => true:a和b引用相同的对象,所以它们相等
a === b
从上面的代码可以看出,将对象(或数组)赋值给一个变量实际上是赋值引用,而不是对象的新副本。如果要创建对象或数组的新副本,必须显式地复制其属性或元素。下面的示例演示了如何使用for循环来实现这个过程:
// 要复制的源数组
let a = ["a", "b", "c"];
// 用于复制的目标数组
let b = [];
// 对于a[]中的每个索引
for (let i = 0; i < a.length; i++) {
// 从a复制元素到b
b[i] = a[i];
}
// 在ES6中,可以使用Array.from()来复制数组
let c = Array.from(b);
如果要比较两个不同的对象或数组,必须比较它们的属性或元素。下面的代码定义了一个函数,用于比较两个数组:
function equalArrays(a, b) {
// 引用相同对象的数组是相等的
if (a === b) return true;
// 长度不同的数组是不相等的
if (a.length !== b.length) return false;
// 遍历所有元素
for (let i = 0; i < a.length; i++) {
// 如果发现任何不同,数组就不相等
if (a[i] !== b[i]) return false;
}
// 否则,数组是相等的
return true;
}
(程序员的软技能:ke.qq.com/course/6034346)
标签:相等,相同,对象,JavaScript,let,引用,数组,可变 From: https://www.cnblogs.com/web-666/p/17659843.html