值传递or引用传递

javascript都是按值传递

javascript的函数的参数传递,传递的都是值,参数是 Object 类型的也一样,也是值,只不过这个值是地址值。

function setName(obj){
    // 这里 obj 和 person 指向内存中的同一块地址,a 地址
    obj.name="Nicholas";

    // 这里 obj 指向了新对象所在的地址( b 地址),切断了和 a 地址的联系
    obj=new Object();
    obj.name="Greg";
    console.log(obj.name);  //输出Greg
}
var person =new Object();
setName(person);
alert(person.name);  //弹出Nicholas

以上例子:如果函数的参数是按引用传递的话, person 也会指向地址 b , 然而事实上 person 指向的是地址 a 。

例子

再用一个具体的例子说明:

var arr = [1, 2, 3, 4]
var str = '1234'

function guangboticao7 (input) {
  input = input + '5678'
  console.log('时代在召(zhaò)唤', input)
  return input;
}

function guangboticao8 (input) {
  return input.push([5, 6, 7, 8])
}

function guangboticao9 (input) {
  input = '2234'
  return [input].concat([5, 6, 7, 8])
}

console.log('第七套广播体操', guangboticao7(str), str)
// 做完 第七套广播体操 是怎样一种体验?

console.log('第八套广播体操', guangboticao8(arr), arr)
// 做完 第八套广播体操 是怎样一种体验?

console.log('第九套广播体操', guangboticao9(arr), arr)
// 做完 第九套广播体操 是怎样一种体验?

结果为

第七套广播体操,12345678,1234
//因为元数据类型Primitive data type ( number, string, boolean, null, undefined )传递是值传递,不会影响本身

第八套广播体操,5,[1,2,3,4,[5,6,7,8]]
//传入的是数组arr指向的地址,并在这个地址上修改了其属性,因此会对外部arr造成影响

第九套广播体操,[2234,5,6,7,8],[1,2,3,4,[5,6,7,8]]
//虽然传入了数组arr指向的地址,但是重新赋值后,input指向一个新地址,切断了和arr的关系,因此不会对外部arr造成影响

参考资料和案例来源:

  1. 知乎问答
  2. 知乎专栏文章

你可能感兴趣的:(值传递or引用传递)