首页
学习
活动
专区
工具
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)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。

    60910

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

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

    2.7K30

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

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

    3.8K41

    深度讲解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.3K20

    【TypeScript】007-类型断言

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

    3600

    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 的父类,当然不能将父类的实例赋值给类型为子类的变量。

    5.1K20

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

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

    23910

    谈一谈JavaScript的内存模型

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

    69220

    第4章 | 移动

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

    7710

    JavaScript-原始值和引用值

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

    1K51

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

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

    49030

    前端入门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.3K20

    【前端】JavaScript 变量引用、内存与数组赋值:深入解析三种情景

    引用与赋值的基本概念 在 JavaScript 中,基本数据类型(如 number、string 等)是按值传递的,而复杂数据类型(如数组、对象)是按引用传递的。...在代码中,var arr = [1, 2, 3] 创建了一个数组 [1, 2, 3],并且将其引用赋值给变量 arr。此时,arr 保存的是数组在内存中的引用(地址),而不是数组的值本身。...关键总结 在 JavaScript 中,给一个变量赋予一个新的数组时,并不会改变原来的数组,而是创建了一个新的引用。如果希望改变所有引用同一数组的变量,那么需要对数组本身进行修改,而不是重新赋值。...对象引用与原始数据的区别 在 JavaScript 中,对象、数组等复杂数据类型的变量并不直接保存数据的值,而是保存引用。当我们对变量重新赋值时,我们只是改变了它指向的内存地址,而原来的引用仍然有效。...这些类型的数据是按引用传递的,变量保存的是对象的内存地址,而不是对象本身。 对于基本数据类型,变量赋值是直接复制值的副本,因此两个变量之间不会互相影响。

    12300

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

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

    6.6K31

    听说你会玩 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] 和上面整数变量一样,表面上是敲入...但如果将整个列表重新赋值,那么要新创建一个列表赋给元组第二个元素,列表的地址肯定改变了,那么元组的内存地址也改变了,这样就违背了元组不可修改的特性,所以会报错。

    58810
    领券