首页 > 编程语言 >JavaScript中的不可变原始值和可变对象引用

JavaScript中的不可变原始值和可变对象引用

时间:2023-08-27 09:12:58浏览次数:55  
标签:相等 相同 对象 JavaScript let 引用 数组 可变

在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

相关文章

  • CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中
    CS0012:类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义。必须添加对程序集“System.Data.Entity,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。网址:yii666.com<网址:yii666.com处理办法,在web.config-》syst......
  • JavaScript中实现类与类继承
    new操作符调用的作用如果一个函数被使用new操作符调用了,那么它会执行如下操作:1.在内存中创建一个新的对象(空对象);2.这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性;(后面详细讲);3.构造函数内部的this,会指向创建出来的新对象;4·执行函数的内部代码(函数体代码);5·......
  • 初识JavaScript
    1995年,JavaScript问世。当时,它的主要用途是代替Perl等服务器端语言处理输入验证。在此之前,要验证某个必填字段是否已填写,或者某个输入的值是否有效,需要与服务器的一次往返通信。网景公司希望通过在其Navigator浏览器中加入JavaScript来改变这个局面。在那个普遍通过电话......
  • javascript学习日记day6
    前两天跑去学公司的框架和游戏脚本去了,果然我就是属于三天打鱼两天晒网的那种,下面是今天的笔记对象的增删改查letgood={goods:'小米',name:'小米10青春版',num:100012816024,weight:'0.55kg',address:'中国大陆'}增:good.pric......
  • 弱引用
    弱引用(WeakReference)是编程语言中的一个概念,用于在某些情况下防止循环引用并避免内存泄漏。它在内存管理和垃圾回收的背景下发挥作用。 循环引用:循环引用指的是对象之间形成了一个循环的引用链,导致这些对象都无法被垃圾回收,即使它们已经不再被程序所使用。这可能会导致内存泄......
  • 用 PHP 和 JavaScript 显示地球卫星照片
    向日葵8号气象卫星是日本宇宙航空研究开发机构设计制造的向日葵系列卫星之一,重约3500公斤,设计寿命15年以上。该卫星于2014年10月7日由H2A火箭搭载发射成功,主要用于监测暴雨云团、台风动向以及持续喷发活动的火山等防灾领域。——百度百科日本发射这颗卫星后,不仅......
  • C++11 右值引用&&、移动语义std::move、完美转发std::forward
    参考:https://blog.csdn.net/HR_Reborn/article/details/130363997 #pragmaonceclassArray{public:Array():size_(0),data_(nullptr){}Array(intsize):size_(size){data_=newint[size_];}//复制构造函数(深拷贝构造)A......
  • EF 多对多循环引用序列化失败 解决办法
    解决办法:外键添加[JsonIgnore]特性即可解决 ///<summary>///文章相册///</summary>[Table("ArticleAlbum")]publicclassArticleAlbumModel{///<summary>///主键ID///</summary>[Display(Name="主键ID")]......
  • JavaScript-算术运算符
    概述JavaScript共提供10个算术运算符,用来完成基本的算术运算。加法运算符:x+y减法运算符: x-y乘法运算符: x*y除法运算符:x/y指数运算符:x**y余数运算符:x%y自增运算符:++x 或者 x++自减运算符:--x 或者 x--数值运算符: +x负数值运算符:-x减法、乘法、除法运算法比较单纯......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......