JavaScript - 数据的存储和传递

76 阅读2分钟
  1. 变量在程序中就是一块内存空间,至于内存空间存的是什么取决于变量的类型:

    • 对于所有原始类型(Number、String、Null、undefined、Boolean、Symbol)赋值给变量的是什么内存空间中存的就是什么,所以原始类型也称为值类型

      var a = 1; // 定义一个变量 a,a 就是一块内存,内存里存的就是1
      

      image-20250802202806256.png

    • 除了原始类型之外还有一种类型叫做引用类型,也叫对象类型(Object、 Array、Function等),引用类型对应的内存空间中存的是地址。

      // 定义一个变量 b,首先对于右侧的大括号先开辟一块内存,内存中存的是两个原始类型,然后将这块内存的地址赋值给 b
      var b = {
          n1: 1,
          n2: 2
      } 
      

      image-20250802210505276.png

【练习题】

  1. 下面代码输出的是什么?

    var a = 1;
    var b = a;
    b++;
    console.log(a, b);
    

    答案: 1 2

    b = a 是将 a 的值复制给 b,所以 b++ 对 a 没影响。

    image-20250802212825350.png

  2. 下面代码输出的是什么?

    var a = {
        n: 1
    };
    var b = a;
    b.n++;
    console.log(a.n, b.n);
    

    答案: 2 2

    a 存的是地址,b = a 是将 a 中的地址复制给 b,然后 a、b 就指向了同一块内存,所以 b.n++ 就是 a.n++。

  3. 为什么使用下面的 swap 函数无法将 n1,n2 变量的值交换?

    function swap(a, b) {
        var temp = a;
        a = b;
        b = temp;
    };
    var n1 = 1, n2 = 2;
    swap(n1, n2);
    console.log(n1, n2); // 输出1 2
    

    答案: 形参的值交换和实参没关系,也就是说实参和形参分别对应的是两套不同的内存,形参内存中的值变化对实参内存中的值不产生影响。

  4. 实现函数 pick(),修改对象,仅保留需要的属性。

    答案:

    /**
     * @param {Object} obj 需要修改的对象
     * @param {Array<string>} keys 需要保留的属性名数组
     */
    function pick(obj, keys) {
        for (var key in obj) {
            if (!keys.includes(key)) {
                delete obj[key];
            }
        }
    };
    var obj = {
        a: 1,
        b: 2,
        c: 3,
        d: 4
    };
    pick(obj, ['a', 'c']);
    console.log(obj); // {a:1, c:3}
    
  5. 下面代码输出的是什么?

    var foo = {
        n: 0,
        k: {
            n: 0
        },
    };
    var bar = foo.k;
    bar.n++;
    bar = {
        n: 10
    };
    bar = foo;
    bar.n++;
    bar = foo.n;
    bar++;
    console.log(foo.n, foo.k.n);
    

    答案: 1 1

  6. 下面代码输出的是什么?(京东)

    var foo = {
        n: 1
    };
    var arr = [foo];
    function method1(arr) {
        var bar = arr[0];
        arr.push(bar);
        bar.n++;
        arr = [bar];
        arr.push(bar);
        arr[1].n++;
    };
    function method2(foo) {
        foo.n++;
    };
    function method3(n) {
        n++;
    };
    method1(arr);
    method2(foo);
    method3(foo.n);
    console.log(foo.n, arr.length);
    

    答案: 4 2

    image-20250802230125530.png

  7. 下面代码输出的是什么?(字节)

    var foo = { bar: 1 };
    var arr1 = [1, 2, foo];
    var arr2 = arr1.slice(1);
    arr2[0]++;
    arr2[1].bar++;
    foo.bar++;
    arr1[2].bar++;
    console.log(arr1[1] === arr2[0]);
    console.log(arr1[2] === arr2[1]);
    console.log(foo.bar);
    

    答案: false true 4

    image-20250802231446379.png

  8. 下面代码输出的是什么?

    const data = {
        user: [
            { name: '张三', age: 18 },
            { name: '李四', age: 20 }
        ]
    };
    const user = data.user[0];
    data.user[0] = null;
    console.log(user);
    const data2 = {
        user: [
            { name: '张三', age: 18 },
            { name: '李四', age: 20 }
        ]
    };
    const user2 = data2.user[0];
    user2.name = '王五';
    console.log(user2);
    

    答案:

    { name: '张三', age: 18 }

    { name: '王五', age: 18 }