首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

既然number是一个原始类型,为什么它在重新赋值给另一个变量时会改变它的值呢?

number是一个原始类型,包括数字、字符串、布尔值和undefined。在JavaScript中,原始类型的值是不可变的,也就是说它们的值一旦确定就无法改变。当我们将一个原始类型的值赋给另一个变量时,实际上是将该值复制给了新的变量。

例如,当我们将一个数字赋给一个变量时,变量会存储该数字的副本。如果我们修改原始变量的值,不会影响到新的变量,因为它们存储的是不同的值。

代码语言:txt
复制
let number = 10;
let newNumber = number; // 将number的值复制给newNumber

number = 20; // 修改number的值

console.log(number); // 输出 20
console.log(newNumber); // 输出 10

在上面的例子中,当我们将number的值赋给newNumber时,newNumber存储的是number的副本,而不是直接引用number的值。因此,当我们修改number的值时,newNumber的值不会受到影响。

需要注意的是,对于引用类型(如对象和数组),赋值操作实际上是将引用复制给了新的变量,而不是复制整个对象或数组。这意味着当我们修改原始对象或数组时,新的变量也会受到影响。但这与原始类型的赋值行为是不同的。

希望这个解答对您有帮助!如果您对云计算或其他相关话题有更多问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【JS进阶】你真的掌握变量类型了吗

: 2.3 复制 当我们把一个变量复制到另一个变量上时,原始类型和引用类型表现是不一样,先来看看原始类型: var name = 'ConardLi'; var name2 = name; name2...因此,我们改变其中任何一个变量另一个变量都会受到影响,这就是为什么会有深拷贝和浅拷贝原因。 2.4 比较 当我们在对两个变量进行比较时,不同类型变量表现是不同: ?...很明显,上面的执行结果'ConardLi',即函数参数仅仅是被传入变量复制一个局部变量改变这个局部变量不会对外部变量产生影响。...在原始类型中,有两个类型Null和Undefined,他们都有且仅有一个,null和undefined,并且他们都代表无和空,我一般这样区分它们: null 表示被赋值对象,刻意把一个对象赋值为null...拆箱操作:把引用类型转换为基本类型 既然原始类型不能扩展属性和方法,那么我们如何使用原始类型调用方法

3.2K30

JavaScript中基本数据类型和引用数据类型区别

基本数据类型指的是简单数据段,引用数据类型指的是有多个构成对象。   当我们把变量赋值一个变量时,解析器首先要确认就是这个基本类型还是引用类型。...obj1赋值onj2,实际上这个堆内存对象在栈内存引用地址复制了一份了obj2,   但是实际上他们共同指向了同一个堆内存对象。实际上改变堆内存对象。...c 复制变量不同 1)原始:在将一个保存着原始变量复制另一个变量时,会将原始副本赋值变量, 此后这两个变量完全独立,他们只是拥有相同value而已。...2)引用:在将一个保存着对象内存地址变量复制另一个变量时,会把这个内存地址赋值变量,     也就是说这两个变量都指向了堆内存中一个对象,他们中任何一个作出改变都会反映在另一个身上。...但是为什么涉及到原始类型与引用类型时仍然有区别?还不就是因为内存分配时差别。     1)原始:只是把变量传递给参数,之后参数和这个变量互不影响。

53710

JS进阶 你真的掌握变量类型了吗

: 2.3 复制 当我们把一个变量复制到另一个变量上时,原始类型和引用类型表现是不一样,先来看看原始类型: var name = 'ConardLi'; var name2 = name;name2...因此,我们改变其中任何一个变量另一个变量都会受到影响,这就是为什么会有深拷贝和浅拷贝原因。 2.4 比较 当我们在对两个变量进行比较时,不同类型变量表现是不同: ?...很明显,上面的执行结果'ConardLi',即函数参数仅仅是被传入变量复制一个局部变量改变这个局部变量不会对外部变量产生影响。...image 在原始类型中,有两个类型Null和Undefined,他们都有且仅有一个,null和undefined,并且他们都代表无和空,我一般这样区分它们: null 表示被赋值对象,刻意把一个对象赋值为...拆箱操作:把引用类型转换为基本类型 既然原始类型不能扩展属性和方法,那么我们如何使用原始类型调用方法

2.6K30

JavaScript 如何工作:JavaScript 共享传递和按传递

传参 在 JavaScript 中,原始类型数据传参;对象类型跟Java一样,拷贝了原来对象一份引用,对这个引用进行操作。...重新指向那个,即 [1, 2],但最后打印结果可以看出 arr1 还是原先,这是为什么?...我们返回190,把了 EAX。 mov ebp+16, eax EAX "累加器"(accumulator), 它是很多加法乘法指令缺省寄存器。 然后,恢复所有寄存器。...因此,可以正确地说在 js 中传递参数传入一份拷贝。如果被调用函数更改了参数,它不会影响原始,因为存储在其他地方,只处理一个副本。...sum 函数创建另一个对象 {number:30},存储在另一个内存地址 002231 中,并将其放在堆栈参数位置。

3.7K41

深度讲解TS:这样学TS,迟早进大厂【11】:类型断言

但是有的情况下 ApiError 和 HttpError 不是一个真正类,而只是一个 TypeScript 接口(interface),接口一个类型,不是一个真正它在编译结果中会被删除,当然就无法使用...是不是任何一个类型都可以被断言为任何另一个类型? 答案是否定——并不是任何一个类型都可以被断言为任何另一个类型。 具体来说,若 A 兼容 B,那么 A 能够被断言为 B,B 也能被断言为 A。...Animal 类型 animal 了——就像面向对象编程中我们可以将子类实例赋值类型为父类变量。...双重断言§ 既然: 任何类型都可以被断言为 any any 可以被断言为任何类型 那么我们是不是可以使用双重断言 as any as Foo 来将任何一个类型断言为任何另一个类型?...则会报错,不允许将 animal 赋值为 Cat 类型 tom。 这很容易理解,Animal 可以看作 Cat 父类,当然不能将父类实例赋值类型为子类变量

1.1K20

TypeScript学习笔记(二)—— TypeScript基础

3.1、什么任意类型 如果一个普通类型,在赋值过程中改变类型不被允许: let myFavoriteNumber: string = 'seven'; myFavoriteNumber =...但是有的情况下 ApiError 和 HttpError 不是一个真正类,而只是一个 TypeScript 接口(interface),接口一个类型,不是一个真正它在编译结果中会被删除,当然就无法使用...是不是任何一个类型都可以被断言为任何另一个类型? 答案是否定——并不是任何一个类型都可以被断言为任何另一个类型。 具体来说,若 A 兼容 B,那么 A 能够被断言为 B,B 也能被断言为 A。...9.4、双重断言 既然: 任何类型都可以被断言为 any any 可以被断言为任何类型 那么我们是不是可以使用双重断言 as any as Foo 来将任何一个类型断言为任何另一个类型?...则会报错,不允许将 animal 赋值为 Cat 类型 tom。 这很容易理解,Animal 可以看作 Cat 父类,当然不能将父类实例赋值类型为子类变量

5K20

谈一谈JavaScript内存模型

下面声明一个名为 myArray 变量并初始化为一个空数组: let myArray = \[\] 当你声明一个变量 myArray 并通过引用类型数据(比如 [])为赋值时候,在内存中操作这样...而错误根源在于,这些人认为往数组中添加元素改变。 所谓改变”,实际上指的是内存地址改变。let 声明变量允许我们修改内存地址,而 const 则不允许。...当把 100 赋值 importantID 时候,由于 100 基本类型,内存中会分配一块新空间用于存放 100。...如果我们这么做,则会报错: myArray = 3 因为 3 基本类型,这么做会在内存中分配一块新空间用于存放 3,同时会修改 myArray ,使其等于这块新空间地址。...之后我们试图把新内存地址赋值 myArray,这样显然也是会报错。 ? 对于用 const 声明对象,和数组表现也是一样。因为对象也是引用类型数据,可以添加键,更新,诸如此类。

65220

由 Go 结构体指针引发传递思考

,隐式引用转换和可寻址 Addressable 隐式引用转换 先看第一次调用 Write 地方,首先 sVals[1] 返回一个 S 类型赋值变量 s,而之所以能够在 S 类型变量 s...如果一个变量可寻址,那么你可以使用取地址操作符 & 来获取内存地址。 而临时值都是不可寻址,临时值一句话概括就是表达式中间状态,它们生命周期很短,只在表达式计算过程中存在。...临时值只有在赋值某个变量后临时值才算完成了使命,这个过程相当于一个被创建出来最终安家落户,有了自己地址,之后才能询问这个地址是多少。...事实上确实是就是这样,sVals[1] 取出来并不是原始对象,而是原对象一个重新生成副本,这就涉及到另一个概念:传递。...为什么要这样设计 为什么 map 要返回一个副本回来,而不是返回原始对象地址?这种设计选择出于安全性和一致性考虑。

17010

第4章 | 移动

在这个语义下,你可以把理解为将一个所有者移交给另一个所有者,这里重点对所有权转移,而所有权 Rust 核心概念。...那么当我们执行初始化语句 let u = s; 时会发生什么?这会将尚未初始化 s 赋 u。...变量赋值则与此略有不同,如果你将一个转移已初始化变量,那么 Rust 就会丢弃该变量先前。...for 循环内部机制会获取向量所有权并将其分解为元素。在每次迭代中,循环都会将另一个元素转移变量 s。由于 s 现在拥有字符串,因此可以在打印之前在循环体中修改。...例如,本章前半部分展示过在 C++ 中将一个变量赋值另一个变量时可能需要任意数量内存和处理器时间。Rust 一个原则是:各种开销对程序员来说应该是显而易见

5410

JavaScript-原始和引用

由于这些原始类型占据空间固定,所以可将他们存储在较小内存区域 - 栈中。这样存储便于迅速查寻变量。 2.2 引用存储在堆中 如果一个引用类型,那么存储空间将从堆中分配。...由于引用大小会改变,所以不能把放在栈中,否则会降低变量查寻的速度。相反,放在变量栈空间中该对象存储在堆中地址。地址大小固定,所以把存储在栈中对变量性能无任何负面影响。...4.4 说明 (1)原始赋值 → 其实是将拷贝一份并赋值变量,这个就是副本,他和原始互相独立改变其中一个不会影响到其他。...(2)引用赋值 → 当一个引用类型,例如一个对象,使用 = 将其赋值另一个变量,实际上其对象地址引用赋值变量,这两个变量都指向同一个地址引用,他们有相同地址。...所以若改变其中一个变量地址引用指向对象),另一个变量地址引用指向一个对象)也将改变。 ? 4.5 扩展 ?

95951

【一文秒懂】带你彻底搞懂范式与反范式数据库设计

JavaScript中数据类型 一般我们说到JS数据类型指的是原始(Primitive types)数据类型(共有6种): String Number Boolean Symbol(ES6新增)...(a); // 10 console.log(b); // 20 被重新赋值b并没有影响a。...引用传递和传递 在变量复制过程中,对象复制引用传递, 基础类型传递。...在将一个保存着原始变量复制另一个变量时,会将原始副本赋值变量,此后这两个变量完全独立,他们只是拥有相同value而已。...引用:在将一个保存着对象内存地址变量复制另一个变量时,会把这个内存地址赋值变量,也就是说这两个变量都指向了堆内存中一个对象,他们中任何一个作出改变都会反映在另一个身上。

46930

前端入门8-JavaScript语法之数据类型变量声明正文-数据类型变量

但在 JavaScript 中,声明一个变量却没有进行赋值操作的话,默认不是 null,而是 undefined。 那么,什么场景下,变量会是 null ?...举个通俗例子,对于数字类型变量,你可以用 0 表示初始;对于字符串类型变量,你可以用 "" 表示初始;那么对于对象类型,当你也需要给它一个表示空无具体含义初始时,你就可以给它赋值为...这也是为什么用 typeof 运算符获取 null 数据类型时,会发现输出 Object。因为 null 实际上个实际存在数据,只是含义意思,用于赋值对象类型变量。...那么,也就是说,不能沿用 Java 里使用 null 思维应用到 JavaScript 中了,null 可以作为初始赋值变量,但变量如果没有进行初始化,默认不再 null 了,这点 JavaScript...隐式转换 因为属性对象才有的特性,所以当对某个原始类型变量进行属性操作时,此时会临时创建一个包装对象,属性操作结束后销毁包装对象。

1.5K30

翻译连载 |《你不知道JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 6 章:不可变性

原始不可变性 原始数据类型number、string、boolean、null 和 undefined)本身就是不可变;无论如何你都没办法改变它们。...属性,因此 x.length = 4 这个赋值操作正试图添加一个属性,不过静默地失败了(也可以说是这个操作被忽略了或被抛弃了,这取决于你怎么看);变量 x 继续承载那个简单原始类型数据 ——...无论常量承载何,该变量都不能使用其他被进行重新赋值。但它与本质无关。 思考下面的代码: var x = 2; 我们刚刚讨论过,数据 2 一个不可变原始。...为了证明 const 和本质无关,思考下面的代码: const x = [ 2 ]; 这个数组一个常量吗?并不是。 x 一个常量,因为无法被重新赋值。...为什么?因为可被携带,但词法赋值并不是。你可以向函数中传入一个数组,这个数组可能会在你没意识到情况下被改变。但是你其他代码在预期之外重新变量赋值,这是不可能发生

1.2K50

js数据类型很简单,却也不简单

为什么说Symbol原始类型,而不是对象类型?因为我们知道,大部分程序员都是没有对象,那么要想找到女朋友,最快办法就是new一个。...栈内存 原始类型访问,其存储在栈内存中,所占内存大小已知或是有范围; 对基本类型变量重新赋值,其本质上进行压栈操作,写入新,并让变量指向一块栈顶元素(大概意思这样,但是v8等引擎有没有做这方面的优化...,就要细致去看了) var a = 1; // 压栈,1成为栈顶元素,其变量a a = 2; // 压栈,2成为栈顶元素,并赋值变量a(内存地址变了) 堆内存 而对象类型按引用访问,通过指针访问对象...我理解:对引用变量进行对象操作,其本质上改变引用变量所指向堆内存地址中对象本身。...此时比较变成了[] == 0。 接着,再参考比较规则,如果一个对象,另一个数字或字符串,则将对象转为原始,再进行比较。

1.3K30

TypeScript 官方手册翻译计划【二】:普通类型

当某个 any 类型时候,你可以访问任意属性(这些属性也会是 any 类型),可以将它作为函数调用,可以将它赋值任意类型(或者把任意类型赋值给它),或者任何语法上合规操作: let...对象类型 除了原始类型之外,最常见类型就是对象类型了。指的是任意包含属性 JavaScript 。要定义一个对象类型,只需要简单地列举属性和类型即可。...既然我们已经知道了如何编写基本类型时候开始用一种有趣方式将它们结合起来了。 定义一个联合类型 第一种结合类型方式就是使用联合类型。...使用联合类型 提供一个匹配联合类型非常简单 —— 只需要提供一个与联合类型某个成员相匹配类型即可。如果有一个联合类型,你要怎么使用它?...let userInput = sanitizeInput(getInput()); // 可以重新给它赋值一个字符串 userInput = "new input"; 接口 接口声明另一种命名对象类型方式

2.2K20

金九银十: 50 个JS 必须懂面试题为你助力

它是一个一元运算符,放在单个操作数之前,可以是任何类型一个字符串,表示操作数数据类型。...例子:var a =10;变量声明在代码执行之前处理。 const - 常量不能通过重新赋值改变,并且不能重新声明。...问题26:什么类型化语言 类型化语言中,关联,而不是与变量关联,它有两种类型: 动态:在这种情况下,变量可以包含多种类型,如在JS中,变量可以取number, string 类型。...提示: 请使用 isNaN() 来判断一个是否数字。原因 NaN 与所有都不相等,包括它自己。 问题 36:JS原始/对象类型如何在函数中传递?...两者之间一个区别是,原始数据类型通过传递,对象是通过引用传递传递:意味着创建原始文件副本。

6.5K31

听说你会玩 Python 系列 3

定义整数 x 并赋值 1031 x 赋予一个 1032 创建一个变量 y 并等于 x 将 y 增加 1 不可修改整数 定义整数 x 并赋值 1031 表面上敲入 x = 1031,实际发生...1 旧对象“颜色变灰退出舞台”,代表着时会被清理。...但为什么改变 y 而不是改变 x ?原因在于改变 y 时新建了一个为1033 PyObject,并将 y 指向,而 x 还是指向原来为 1032 PyObject。...虽然还没介绍列表,可把当成一个存储元素容器,创建一个存储 1, 10.31 和'Python' 列表,起名为 l,它在内存中示意图如下: [o4qp4u1p3c.png] 和上面整数变量一样,表面上敲入...但如果将整个列表重新赋值,那么要新创建一个列表赋元组第二个元素,列表地址肯定改变了,那么元组内存地址也改变了,这样就违背了元组不可修改特性,所以会报错。

57010

Python学习笔记之函数参数传递 传还是传引用

现在a盒子里放了一个整数1,当变量a赋另外一个时会替换盒子a里面的内容: a = 2; ?...如果a重新赋值,那么“标签” a 将会移动并指向另一个对象: a = 2 ?...如果我们把变量a赋另一个变量,我们只是当前内存中对象增加一个“标签”而已: b = a ? 综上所述,在Python中变量只是一个标签,一个标识符,指向内存中对象。...故变量并没有类型类型属于对象,这也是Python中变量可以被任何类型赋值原因。...示例2 list1 = [1, 2] # list1指向内存中一个list类型对象 list1[0] = 2 # 重新赋值list1中第一个元素 因为list类型可以改变,所以第一个元素变更为

1.9K30

萌新HTML5 入门指南(二)

同时不同类型变量在运算时会自动进行隐式类型转换。...: 原始类型访问 即在赋值和修改通过传递方式来完成,对变量赋值或者修改会在内存中重新分配空间。...,互不干涉,如果我们将其中任何一个变量重新改变,其他相同变量也不会受到任何影响。...其中有一个全局方法 isNaN(),作用是检查一个是否能被 Number() 成功转换。 如果能转换成功,就返回 false,否则返回 true 。...关于引用类型需要知道几个知识点: 引用类型按引用访问 在操作对象时,实际上在操作对象引用而不是实际对象。变量赋值改变对象引用关系。

44620

Java泛型深入理解「建议收藏」

我们在介绍泛型时指出向ArrayList中插入String类型对象,编译时会报错。现在为什么又可以了?...,另一个Float,所以取同一父类最小级,为Number Object o=Test.add(1, "asd");//这两个参数一个Integer,另一个String,所以取同一父类最小级...不是说泛型变量Integer会在编译时候擦除变为原始类型Object吗,为什么不能存放别的类型既然类型擦除了,如何保证我们只能使用泛型变量限定类型? java如何解决这个问题?...因为当类型擦除后,ArrayList原始类中类型变量(T)替换为Object,但Object类型不能存储double。...你可以把List, List赋值List,却不能把List赋值List。 List<?

76920
领券