JavaScript引用赋值与传值赋值总结

目录
  • 前言
  • 基本数据类型
  • 复合数据类型

前言

在JavaScript中基本数据类型都是传值赋值,复合数据类型都是引用赋值(传地址)也叫引用传址

基本数据类型的变量名和数据是直接存在"快速内存"(栈内存)中。

基本的数据类型有:undefined,boolean,number,string,null。 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值。

而复合数据类型(对象和数组)的存储分两个部分:

  • ①具体的数据存在“慢速内存”“堆内存”中;
  • ②将变量名和数据地址存在“快速内存”“栈内存”中。

复合数据类型可以拥有属性和方法,并且我们可以修改其属性和方法。

引用传址:将一个变量的数据地址,“拷贝”一份,传给另了另一个变量。这两个变量,指向“同一个地址”。

大家共享同一份数据。

如果其中一个变量的值发生了改变,那么,另一个变量的值也得变。要变一起变。

举例:

基本数据类型

    var a=1;
    var b=a;
    a=2;
    console.log(b);  // 打印输出结果: 1

当基本类型的数据赋值时,赋得是实际的值,a和b是没有关联关系的,b由a复制得到,相互独立。

复合数据类型

    let a_arr=[1,2,3,4,5];
    let b_arr=a_arr;
    a_arr[0]=10;
    console.log(b_arr); // 打印输出结果: (5) [10, 2, 3, 4, 5]

对象(包括数组)使用的是引用赋值。当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在堆中的地址,而不是堆中的数据。也就是将一个变量的数据地址,“拷贝”一份,传给另了另一个变量。这两个变量,指向“同一个地址”。因此,两个对象是联动的。

那么问题来了,如何让 b_arr 的值不要因a_arr的改变而改变呢?也就数说,b_arr打印输出结果为 (5) [1, 2, 3, 4, 5]

解决办法:

    let a_arr=[1,2,3,4,5];
    let b_arr=a_arr.concat();
    a_arr[0]=10;
    console.log(b_arr); // 打印输出结果: (5) [1, 2, 3, 4, 5]

concat() 方法用于连接两个或多个数组。
concat() 方法不会更改现有数组,而是返回一个新数组,其中包含已连接数组的值。

到此这篇关于JavaScript引用赋值与传值赋值总结的文章就介绍到这了,更多相关js 赋值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript对象引用与赋值实例详解

    本文实例讲述了JavaScript对象引用与赋值.分享给大家供大家参考,具体如下: <script type="text/javascript"> //例子一: 引用 var myArrayRef = new Array(0,1,2); //创建数组对象 var mySeconArrayRef = myArrayRef; // 对象复制. myArrayRef[0] = 100; // 修改元素值 alert(mySeconArrayRef[0]); /** * 输出 10

  • JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题

    在自己做东西时,遇见了一个问题.就拿博客园的首页右边的搜索举例吧,用控制台操作. 现在我需要从另外一个地方将数据传给input,让其在一刷新的时候就显示数据. 这不难啊,于是我按照我的理解做了 代码如下: 此时,id为zzk_q的值应该为  测试  ,即input框内应该显示 测试 .但结果.. 咦,为什么没有变呢,不对啊,又来来回回变着法子试一下,还是不行,当然代码基本还是那样子的.突然想起我以前遇见过这样子的问题,仔细回想当时解决的方法(看样子当时没理解透,只是找到方法就过去了),想起来了,

  • javascript引用赋值(地址传值)用法实例

    本文实例讲述了javascript引用赋值(地址传值)用法.分享给大家供大家参考.具体如下: javascript在默认情况下,数组.对象和函数是引用赋值,如下代码所示: 复制代码 代码如下: <html> <head> <script type="text/javascript"> var a={age:20,height:175}; var b = a; alert(b.age); b.age = 25; alert(a.age); </s

  • ExtJs异步无法向外传值和赋值的完美解决办法

    1.Ext.data.Store.load();方法是异步的,下面的方式获得的reCount始终是0,因为还没等后台的方法执行完就赋值了,此时store的record还没获得值. var testStore = new Ext.data.GroupingStore({ proxy : new Ext.data.HttpProxy({ url : '' }), reader : new Ext.data.JsonReader({ root : 'hstamcx', totalProperty :

  • JavaScript引用赋值与传值赋值总结

    目录 前言 基本数据类型 复合数据类型 前言 在JavaScript中基本数据类型都是传值赋值,复合数据类型都是引用赋值(传地址)也叫引用传址 基本数据类型的变量名和数据是直接存在"快速内存"(栈内存)中. 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值. 而复合数据类型(对象和数组)的存储分两个部分: ①具体的数据存在“慢速内存”“堆内存”中: ②将变量名和数据

  • php传值赋值和传地址赋值用法实例分析

    本文实例讲述了php传值赋值和传地址赋值用法.分享给大家供大家参考.具体如下: <?php $name = 'Simon'; //对变量$name进行赋值(传值赋值) $name_b = $name; //对变量$name_b进行赋值(传值赋值) $addr = &$name; //对变量$addr进行赋值(传地址赋值) $name = "Elaine"; //改变$name的值 echo $name; //输出$name,会发现$name的值发生了变化 echo $na

  • php 传值赋值与引用赋值的区别

    传值赋值:当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋予到目标变量.这意味着,例如,当一个变量的值赋予另一个变量时,改变其中一个变量的值,将不会影响到另一个变量. 复制代码 代码如下: <?php <?php $a=123; $a=123; $b=$a; $b=&$a; $a=321; $a=321; Echo"$a,$b";//显示"321,123" Echo"$a,$b";//显示"321,321&q

  • 详解PHP变量传值赋值和引用赋值变量销毁

    本文实例为大家分享了PHP变量传值赋值和引用赋值变量销毁的具体代码,供大家参考,具体内容如下 <?php $a = 100; $b = 200; var_dump($a,$b); //int(100) int(200) ?> php中,上面的代码,变量是怎么存放的呢? 上面的代码变动下,将变量b赋值给变量a,会发生什么? <?php $a = 100; $b = 200; $a = $b;/*多了这个*/ var_dump($a,$b); //int(200) int(200) ?>

  • 详解JavaScript的内存空间、赋值和深浅拷贝

    JavaScript的内存空间 在JavaScript中,每一个数据都需要一个内存空间.内存空间分为两种,栈内存(stack)与堆内存(heap) 栈是系统自动分配的内存空间,由系统自动释放,堆则是动态分配的内存,大小不定不会自动释放. 基础数据类型 JavaScript中的基础数据类型,这些值都有固定的大小,保存在栈内存中,由系统自动分配存储空间在栈内存空间的值,我们可以直接进行操作,因此基础数据类型都是按照值访问 在栈内存中的数据发生复制的行为时,系统会自动为新变量开辟一个新的内存空间,当复

  • 浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号

    1 C,C++,Java,PHP都能容忍末尾的逗号 C,C++,Java中对数组赋值时,最后一个元素末尾的逗号可有可无.下面两行代码对这些语言来说是等效的. int a[] = {1,2,3}; /* 正确 */ int a[] = {1,2,3,}; /* 正确 */ PHP这一点也继承了C的特点,下面的两行代码等效. $a = array(1,2,3); /* 正确 */ $a = array(1,2,3,); /* 正确 */ 2 JavaScript视末尾逗号为语法错误! 然而到了Jav

  • 浅谈js中的引用和复制(传值和传址)

    好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西 先讲一下很基础的东西,看看js中几种数据类型分别传的什么 引用:对象.数组.函数 复制:数字.布尔 字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)但是用于比较的时候显然是属于传值比较(稍后具体说比较的事) 下面讲一下在使用中的具体体现 最普通的使用就是赋值了 var a = 1; var b = a; //赋的是a的复制值 b ++; aler

  • C++赋值函数+移动赋值函数+移动构造函数详解

    目录 左值引用和右值引用 左值与右值 左右值的切换 左值引用:将左值绑定在引用上 常量左值引用和非常量左值引用 右值引用:将右值绑定在引用上 常量右值引用和非常量右值引用 移动构造函数 赋值和移动赋值函数 左值引用和右值引用 左值与右值 左值:在内存中占有确定位置的对象,即左值占有内存.换句话来说,就是有地址,有值. 右值:不占内存(科学地讲是临时寄存器),仅有值,为临时变量. 左右值的切换 右值->左值:用*符号. int a=10; int* b=&a;// b为右值. *b=20;//

  • JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享

    对于"JavaScript 函数参数是传值(byVal)还是传址(byRef)"这个问题,普遍存在一个误区:number,string等"简单类型"是传值,Number, String, Object, Array等"复杂类型"是传址.这样不对吗?为什么会有这样的误区?看一下这两段代码: 复制代码 代码如下: //造成传值假象的代码function modifyLikeByVal(x){  x = 1;  console.log('x = %d'

随机推荐