JavaScript青少年简明教程:赋值语句

JavaScript青少年简明教程:赋值语句

赋值语句(assignment statement)

JavaScript的赋值语句用于给变量、对象属性或数组元素赋值。赋值语句的基本语法是使用符号 (=) 将右侧的值(称为“源操作数”)赋给左侧的变量、属性或元素(称为“目标操作数”)。

变量赋值方面,原始(基本)数据类型的变量赋值是值的复制,而引用数据类型(对象类型)的变量赋值是引用的复制。

JavaScript的变量赋值,对于基本数据类型(如数字、字符串、布尔值等),赋操作会将值复制给变量。而对于引用数据类型(如对象、数组等),赋值操作会将引用(指向对象的内存地址)复制给变量,而不是复制对象本身。这意味着,当你修改一个引用类型的变量时,实际上是修改了引用所指向的对象。

☆对于原始类型,变量赋值是通过将一个值复制给另一个变量来完成的。这意味着当你将一个原始数据类型的变量赋值给另一个变量时,实际上是将原始值复制到了新的变量中。这两个变量是完全独立的,修改其中一个变量的值不会影响另一个变量。

例如:

let a = 5.1;

let b = a;

b = 10.2;

console.log(a); // 输出 5.1

console.log(b); // 输出 10.2

当把一个原始变量的值赋给另一个原始变量时,只是把栈中的内容复制给另一个原始变量,此时这两个变量互不影响——其实在内存中是两个地址,是互相独立的存在,当一个变量值改变时,另一个变量不会因此而发生任何变化。图解如下:

【图中的红色❌,表示5.1这个值不再被变量a引用,若一个值不再被任何变量引用,可以被垃圾回收器标记为可回收的,具体的垃圾回收时间是由JavaScript引擎决定的。】

☆对于引用数据类型,变量赋值是通过将引用复制给另一个变量来完成的。引用是指向存储在内存中的对象的地址。当你将一个引用数据类型的变量赋值给另一个变量时,实际上是将引用复制到了新的变量中,这两个变量指向同一个对象,修改其中一个变量的属性会影响另一个变量。

例如:

let obj1 = { name: 'Alice' };

let obj2 = obj1;

obj2.name = 'Bob';

console.log(obj1.name); // 输出 'Bob'

console.log(obj2.name); // 输出 'Bob'

需要注意的是,当你修改引用数据类型的属性时,实际上是修改了对象本身,而不是变量。因此,所有指向该对象的变量都会反映出这个修改。图解如下:

说明:

基本赋值:通过等号(=)将一个值赋给一个变量。例如:

let x = 5;

这个赋值语句将整数值5赋给变量x。

初学者需要注意,符号=在编程中作为赋值操作符的意义和数学中作为等号的意义不同。编程中的赋值表示将右侧的值或表达式的结果赋给左侧的变量。

多重赋值:JavaScript还支持多个变量同时赋值的方式。例如:

let a = 1, b = 2, c = 3;

这个赋值语句将分别把1、2和3赋给变量a、b和c。

复合赋值操作符:JavaScript中还支持复合赋值操作符,用于将运算结果赋给变量。例如:

let x = 10;

x += 5; // 等同于 x = x + 5;

这个赋值语句将变量x的值加上5,并将结果赋给x。

JavaScript支持多种复合赋值运算符:

x += 5;  // 等同于 x = x + 5

x -= 3;  // 等同于 x = x - 3

x *= 2;  // 等同于 x = x * 2

x /= 4;  // 等同于 x = x / 4

x %= 3;  // 等同于 x = x % 3

x **= 2; // 等同于 x = x ** 2 (ES7,ECMAScript 2016)。

链式赋值:JavaScript中的赋值语句支持链式赋值。例如:

let a, b, c;

a = b = c = 10;

这个赋值语句将把值10同时赋给变量a、b和c。

需要注意的是,JavaScript是一种动态类型语言,变量的类型可以在运行时改变。因此,赋值语句可以用于改变变量的类型,例如:

let x = 5;

x = "Hello";

这个赋值语句将整数值5赋给变量x,然后将字符串"Hello"赋给同一个变量x。

JavaScript在赋值过程中可能进行隐式类型转换:

let x = "5";

let y = +x;  // y 是数字 5

特别提示,学习者需要明确,JavaScript的赋值操作分为 值赋值(Value Assignment)和引用赋值(Reference Assignment)两种情况。

值赋值:当将一个简单数据类型——原始数据类型(Primitive Types)包括Number、String、Boolean、null、undefined和Symbol(在ES6中引入)——赋给一个变量时,实际上是将该值复制到变量中,而不是将变量指向原始值的内存地址。这意味着变量和原始值是完全独立的,对变量的修改不会影响原始值。例如:

let x = 5;

let y = x;

x = 10;

console.log(x); // 输出 10

console.log(y); // 输出 5

在这个例子中,将变量x赋值给变量y时,实际上是将数字5复制给y。后续对变量x的修改不会影响变量y。

引用赋值:当将一个复杂数据类型——引用类型(Reference Types),包括Object、Array、Function等——赋给一个变量时,实际上是将该值的引用复制给变量,而不是将整个值复制到变量中。这意味着变量和原始值引用的是同一个内存地址,对变量的修改也会影响原始值。例如:

let obj1 = { name: "Alice" };

let obj2 = obj1;

obj2.name = "Bob";

console.log(obj1.name); // 输出 "Bob"

console.log(obj2.name); // 输出 "Bob"

在这个例子中,将变量obj1赋值给变量obj2时,实际上是将指向对象的引用复制给obj2。后续对obj2的修改也会影响obj1,因为它们引用的是同一个对象。

需要注意的是,在引用赋值中修改对象的属性不会改变原始对象的引用,但是重新赋值一个新的对象会改变原始对象的引用。例如:

let obj1 = { name: "Alice" };

let obj2 = obj1;

obj2 = { name: "Bob" };

console.log(obj1.name); // 输出 "Alice"

console.log(obj2.name); // 输出 "Bob"

在这个例子中,重新赋值一个新的对象给obj2,不会影响obj1,因为它们引用的是不同的对象。

总结起来,JavaScript中的赋值操作是根据数据类型的不同而有所区别。

基本类型(Primitive Types,原始类型):

包括Number, String, Boolean, Undefined, Null, Symbol, BigInt;

赋值操作会创建一个新的副本(值复制);

修改一个变量不会影响另一个变量,即两个变量互不影响。

引用类型(Reference Types):

包括Object, Array, Function 等;

赋值操作复制的是引用(地址),而不是实际的数据;

修改一个变量可能会影响另一个变量,因为它们指向同一个对象,或者它们引用的是同一个对象。

基本类型(Primitive Types)赋值是值赋值(value assignment),引用类型(Reference Types)赋值是引用赋值(reference assignment)。

值赋值是复制数据的值,而引用赋值是复制数据的引用。这导致了一个重要的区别:

对于值赋值,变量和原始值是独立的,对变量的修改不会影响原始值;

而对于引用赋值,变量和原始值共享同一个内存地址,对变量的修改会影响原始值。需要注意的是,这种影响仅限于修改对象的属性,而不是重新赋值一个新的对象。如果重新赋值一个新的对象给一个变量,那么原始对象的引用将会改变。

【基本类型(Primitive Types)也有人称为简单类型,引用类型(Reference Types)也有人称为复杂类型】

这种分类和赋值行为在 JavaScript 中是非常重要的概念,理解它们有助于避免在处理数据时产生意外的副作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—154. 寻找旋转排序数组中的最小值 II【困难】

2024每日刷题&#xff08;147&#xff09; Leetcode—154. 寻找旋转排序数组中的最小值 II 实现代码 class Solution { public:int findMin(vector<int>& nums) {int l 0;int r nums.size() - 1;int m -1;while(l < r) {m (r - l) / 2 l;if(nums[m] < n…

邮件安全篇:企业电子邮件安全涉及哪些方面?

1. 邮件安全概述 企业邮件安全涉及多个方面&#xff0c;旨在保护电子邮件通信的机密性、完整性和可用性&#xff0c;防止数据泄露、欺诈、滥用及其他安全威胁。本文从身份验证与防伪、数据加密、反垃圾邮件和反恶意软件防护、邮件内容过滤与审计、访问控制与权限管理、邮件存储…

恐怖数字暗影:猜中才能逃离

大家可以看看这个&#xff0c;也很有意思&#xff01; 猜数字游戏&#xff08;老六版&#xff09;-CSDN博客 1、 剧情介绍 在一个阴暗潮湿的古堡中&#xff0c;你独自一人走进了一间散发着诡异气息的房间。房间的正中央有一张古老的桌子&#xff0c;上面放着一本泛黄的羊皮卷…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 33 节&#xff09; P33《32.通知-进度条通知》 下载按钮对应的逻辑&#xff1a; 取消按钮对应的逻辑&#xff1a; 暂停按钮对应的…

吴恩达深度学习笔记1 Neural Networks and Deep Learning

参考视频&#xff1a;(超爽中英!) 2024公认最好的【吴恩达深度学习】教程&#xff01;附课件代码 Professionalization of Deep Learning_哔哩哔哩_bilibili Neural Networks and Deep Learning 1. 深度学习引言(Introduction to Deep Learning) 2. 神 经 网 络 的 编 程 基 础…

Python机器学习入门:从理论到实践

文章目录 前言一、机器学习是什么&#xff1f;二、机器学习基本流程三、使用Python进行机器学习1.数据读取2.数据规范化3. 数据降维&#xff08;主成分分析&#xff09;4. 机器学习模型的选择5. 线性回归模型的实现6. 可视化结果 总结 前言 机器学习是人工智能的一个重要分支&…

排序二叉树(c++)

排序二叉树是一棵有顺序&#xff0c;且没有重复元素的二叉树。 对每个节点而言&#xff1a; 如果左子树不为空&#xff0c;则左子树上的所有节点的权值都小于该节点的权值。 如果右子树不为空&#xff0c;则右子树上的所有节点的权值都大于该节点的权值。 上图为一棵排序二叉…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日派对座位安排(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

如何为Easybr指纹浏览器配置高效代理IP?IPXProxy步骤指南

​Easybr是一款简单易上手的指纹浏览器&#xff0c;它的操作简便、灵活&#xff0c;比较适合跨境电商卖家日常工作中使用。在运营跨境店铺的时候&#xff0c;我们有时会面临网络连接不畅的情况&#xff0c;这会导致没法及时回复客户的消息&#xff0c;而影响店铺的销售。而为了…

5 C 语言数组与字符串的全面解析

目录 1 数组的概念与特性 1.1 什么是数组 1.2 数组的特点 1.3 数组的用途 2 一维数组的定义与初始化 2.1 一维数组的定义 2.2 声明与定义的区别 2.3 一维数组的多种初始化 3 数组名的命名规则与作用 3.1 数组名的命名规则 3.2 数组名的作用 4 一维数组在内存中的存…

C语言:键盘录入案例

主要使用了scanf&#xff1b; scanf的使用方法和注意事项&#xff1a; 1.作用&#xff1a; 用于接收键盘输入的数据并赋值给对应的变量 2.使用方式; scanf("占位符",&变量名); 3.注意事项; 占位符后面的的变量要对应 第一个参数中不写换行 案例1&#xf…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-04-信息系统架构设计方法-信息化总体架构方法

文章目录 1. 信息化概述1.1 信息化1.2 国家信息化1.3 信息化的内涵1.4 品牌信息化建设1.5 信息化特征1.5.1 易用性1.5.2 健壮性1.5.3 平台化、灵活性、拓展性1.5.4 安全性1.5.5 门户化、整合性1.5.6 移动性 2. 信息化工程建设方法2.1 信息化架构模式2.1.1 数据导向架构2.1.2 流…

TQSDRPI开发板教程:实现PL端的UDP回环与GPSDO

本教程将完成一个全面的UDP运行流程与GPSDO测试&#xff0c;从下载项目的源代码开始&#xff0c;通过编译过程&#xff0c;最终将项目部署到目标板卡上运行演示。此外&#xff0c;我们还介绍如何修改板卡的IP地址&#xff0c;以便更好地适应您的网络环境或项目需求。 首先从Gi…

Unity UGUI 之 ScrollBar与ScrollView

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.什么是ScrollBar 滚动块&#xff1a;Unity - Manual: Scrollbar 2.重要参数 该笔记来源…

java用freemarker导出word

freemarker导出word 第一步、将word转换为xml格式第二步、将转换后的xml文件修改后缀为ftl后复制到项目 resources 目录下&#xff08;可以自己新建一个文件夹放在文件夹中&#xff09;第三步、格式化xml代码&#xff08;如果问价太大可能会无法格式化&#xff09;这时候需要在…

微软CrowdStrike驱动蓝屏以及内核签名

原因 当Windows操作系统遇到严重错误导致系统崩溃时&#xff0c;屏幕显示为蓝色&#xff0c;通常伴有错误代码和信息&#xff0c;这被称为“蓝屏死机”&#xff08;Blue Screen of Death&#xff0c;简称BSOD&#xff09; https://www.thepaper.cn/newsDetail_forward_281262…

Unity中UI系统3——UGUI

概述 基础知识 UGUI基础 六大基础组件 Canvas——渲染模式控制组件 Canvas Scaler —— 分辨率自适应组件 CanvasScaler——恒定像素模式 CanvasScaler——缩放模式 可以适当的自己去了解对数 CanvasScaler——恒定物理模式 CanvasScaler —— 3D模式 Graphic Raycaster——射线…

RabbitMQ的学习和模拟实现|muduo库的介绍和使用

muduo库 项目仓库&#xff1a;https://github.com/ffengc/HareMQ muduo库 muduo库是什么快速上手搭建服务端快速上手搭建客户端上面搭建的服务端-客户端通信还有什么问题?muduo库中的protobuf基于muduo库中的protobuf协议实现一个服务器 muduo库是什么 Muduo由陈硕大佬开…

人工智能与机器学习原理精解【3】

文章目录 泰勒级数逼近基础一阶导数和二阶导数的几何意义一阶导数的几何意义二阶导数的几何意义应用示例 导数与微分的区别1. 定义与本质2. 几何意义3. 表达式与关系4. 应用场景 可微函数定义几何意义性质例子 导数导数的定义导数的计算导数的几何意义导数函数的图像一、常见导…

数据编织 VS 数据仓库 VS 数据湖

目录 1. 什么是数据编织?2. 数据编织的工作原理3. 代码示例4. 数据编织的优势5. 应用场景6. 数据编织 vs 数据仓库6.1 数据存储方式6.2 数据更新和实时性6.3 灵活性和可扩展性6.4 查询性能6.5 数据治理和一致性6.6 适用场景6.7 代码示例比较 7. 数据编织 vs 数据湖7.1 数据存储…