tofacebook.com -专业IT技术社区 JS学习之赋值与赋引用 Web程序【tofacebook.com】 - tofacebook.com-专业IT技术社区
147°

JS学习之赋值与赋引用 Web程序【tofacebook.com】

标签:不同   空间   boolean   结果   注意   str   foo   因此   bsp   

1、基本类型

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

技术分享图片

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

技术分享图片

技术分享图片


2、引用类型(对象)引用对象存放的方式是:在栈中存放对象变量标示和该对象在堆中的存放地址,在堆中存放数据。即名称和地址

对象使用的是引用赋值。当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在堆中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

 技术分享图片

技术分享图片

技术分享图片

function test(x){ x.push(4); x=[4,5,6]; //x重新被赋值,开辟了一块新空间与原空间不同
                    x.push(7); //操作的是新空间的数据
                    console.log(x);// [4,5,6,7]
 } var a=[1,2,3]; test(a); // [4,5,6,7]
     /* 步骤: 1 定义数组[1,2,3]并赋值给a,a指向该数1组 2、调用函数执行的操作过程是 1)向原数组插入数字4,原数组变成[1,2,3,4] 2)定义新数组并赋值给a,此时变量指向了新数组,原数组[1,2,3,4]不变 3)向新数组中插入7,改变了新数组 4)执行console.log操作,显示的是这个最新的数组,即[4,5,6,7] 3、函数外执行console.log操作。由于函数中,只有第一步操作改变了原数组,后续操作改变的是新赋值的数组[4,5,6](新赋值之后,变量a指向了该新数组,所有后续操作,都是针对的新数组),所以该步操作的结果显示的是[1,2,3,4]。 */
function test(x) { x.push(4); x.length = 0; //清空当前引用数组的数据
                x.push(4, 5, 6, 7); console.log(x); // [4,5,6,7]
 } var a = [1, 2, 3]; test(a); console.log(a); // [4,5,6,7]
    /* 定义数组[1,2,3]并赋值给变量a,a指向该数组。 调用函数foo(a),执行的操作是: 1、向原数组中插入数字4,原数组变成[1,2,3,4]; 2、清空数组。由于此时变量仍然指向原数组,所以此处操作针对的是原数组,即清空原数组; 3、向数组中插入数字4,5,6,7。(注意并不是从新赋值)由于没有重新赋值操作,变量仍然指向原数组,所以原数组变为新数组[4,5,6,7]; 4、执行console.log操作,显示的是这个最新的数组,即[4,5,6,7]。 函数外执行console.log操作,由于函数中变量都没有重新赋值,所以每一步操作针对的都是原数组,最终原数组变成了这个最新的数组,即[4,5,6,7]

 

JS学习之赋值与赋引用

标签:不同   空间   boolean   结果   注意   str   foo   因此   bsp   

原文地址:https://www.cnblogs.com/xubj/p/9884882.html


本文由百家号/熊掌号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。

已有 0 条评论

    我有话说: