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]

 

posted @ 2017-04-07 16:14  善未易明  阅读(567)  评论(0编辑  收藏  举报