← 输入框|github.com|刷新
Skip to content

第16期(2019-5-23):浅克隆 #18

Open

Description

@AMY-Y
        基础篇
        难度 ★
        
        //浅拷贝
        请写出下列代码的输出结果,为什么?

        //1.
        var a = 2 ;
        var a_copy = a ;
        a_copy  = 3;
        console.log(a);//?

        //2.数组1
        var arr = [1,2,3,4];
        var arr_copy = arr ;
        arr_copy.push(5);
        console.log(arr);//?
        //3.数组2
        var arr = [1,2,3,4];
        var arr_copy = arr ;
        arr_copy = [1,2,3,4,5];
        console.log(arr);//?
        console.log(arr_copy);//?

        //4.对象1
        var obj = {
            name:'sunshine',
            age:18
        };
        var obj_copy = obj ;
        obj_copy.name = '过客';
        console.log(obj.name);//?

        //5.对象2
        var obj = {
            name:'sunshine',
            age:18
        };
        var obj_copy = obj ;
        obj_copy = {
            name:'过客',
            age:18
        };
        console.log(obj.name);//?
        console.log(obj_copy.name);//?

Activity

  1. changed the title [-]第16期(5月23号)浅克隆[/-] [+]第16期(2019-5-23)浅克隆[/+] on May 23, 2019
  2. changed the title [-]第16期(2019-5-23)浅克隆[/-] [+]第16期(2019-5-23):浅克隆[/+] on May 23, 2019
  3. wingmeng commented on May 23, 2019

    @wingmeng
    Collaborator

    这道题涉及 javascript 的数据类型,主要分两类:

    1. 基本数据类型: Number、String、Boolean、Null、 Undefined、Symbol(ES6)
    2. 引用数据类型: Object(除基本数据类型外的都是对象,Array、Function、RegExp等)

    基本数据类型是直接按值存放在内存中的简单数据段,可以直接保存变量中的实际值,所以第 1 题控制台输出 2,a 是基本数据类型。

    引用数据类型是存放在内存中的对象,其变量其实是一个指针,保存了指向内存对象的引用地址,所以第 2 题的 arr 变量其实只是将引用地址复制了一份给了 arr_copy 变量,实际上它们共同指向同一个 [1,2,3,4] 内存对象,所以 arr_copy push 了一项,是对 [1,2,3,4] 的修改,因此 arr 变量的值也跟着变为了 [1,2,3,4,5],第 4 题也是同样的道理。

    第 3 题和第 5 题有所不同,虽然是引用数据类型,但代码中对 copy 的变量进行了重新赋值,相当于在内存中创建并指向了一个新的内存对象,因此对 copy 变量的修改不会影响到原先变量的值。

    总结一下答案:

    1. 输出:2
    2. 输出:[1,2,3,4,5]
    3. 输出:[1,2,3,4] 和 [1,2,3,4,5]
    4. 输出:过客
    5. 输出:sunshine 和 过客
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions