• js 值和引用


    js对值和引用的赋值/传递在语法上没有区别,完全根据值得类型决定

    简单值(即标量基本类型值),总是通过值复制的方式来赋值/传递,包括null,undefined,字符串,数字,布尔值和ES6中的symbol。

    复合值——对象(包括数组和封装对象)和函数,则总是通过引用复制的方式来赋值/传递。

    __________________________________

    简单值

    var a0=2;
    var b0=a0;
    b0++;
    console.log(a0);//2
    console.log(b0);//3

    简单值注意

    虽然传递的是指向数字对象的引用复本,但我们并不能通过它来更改其中的基本类型值

    function foo(x){

      x=x+1;

      console.log(x);//3

    }

    var a=2;

    var b= new Number(a);//Object(a)也一样

    foo(b);

    console.log(b);//2

    __________________________________

    数组

    var a=[1,2,3];
    var b=a;
    b.push(4);
    console.log(a); //[1,2,3,4]
    console.log(b); //[1,2,3,4]

    var c=[1,2,3];
    var d=c;
    d=[4,5,6];
    console.log(c);//[1,2,3]
    console.log(d);//[4,5,6]

    __________________________________

    对象

    var obj={a:2};

    function foo(weapper){

      wrapper.a=42;

    }

    foo(obj);

    console.log(obj.a);// 42

    _________________________________________________

     注意函数参数

    function foo(x){
      x.push(4);
      console.log(x);//[1,2,3,4]

      x=[4,5,6];
      x.push(7);
      console.log(x);//[4,5,6,7]
    }
    var e=[1,2,3];
    foo(e);
    console.log(e);//[1,2,3,4]而非[4,5,6,7]

    我们像函数传递e的时候,实际是将引用e的一个复本赋值给x,而a仍然指向[1,2,3].在函数中我们可以通过引用x来更改数组的值(push(4)之后变为[1,2,3,4]).但x=[4,5,6]并不影响e的指向,所以e仍然指向[1,2,3,4].

    不能通过引用x来更改引用e的指向,只能更改e和x的共同指向的值。

    如果要将e的值变为[4,5,6,7],必须更改x指向的数组,而不是为x赋值一个新的数组

    function foo(x){
    x.push(4);
    console.log(x);//[1,2,3,4]

    x.length=0;
    x.push(4,5,6,7);
    console.log(x);//[4,5,6,7]
    }
    var e=[1,2,3];
    foo(e);
    console.log(e);//[4,5,6,7]

  • 相关阅读:
    Python(多进程multiprocessing模块)
    Python(队列)
    Unique Paths
    Unique Paths
    Jump Game II
    Jump Game
    Path Sum II
    Path Sum
    Remove Element
    Implement strStr()
  • 原文地址:https://www.cnblogs.com/brainworld/p/6678670.html
Copyright © 2020-2023  润新知