js的实参是按值传递还是按引用传递

1.如果是基本类型,则是按值传递

var str = 'one';
function f(string) {
    string = 'two';
}
f(str);
console.log(str); // 仍为one, 未受string = 'two'赋值所影响

2.如果是引用类型,则是按共享传递 call by sharing,并不是按引用传递,也不是按值传递。叫按对象传递、按对象共享传递.最早由Barbara Liskov. 在1974年的GLU语言中提出。该求值策略被用于Python、Java、Ruby、JS等多种语言。

var obj = {};
function f(o) {
    o.name = 'li';
}
f(obj);
console.log(obj.name); //li  被修改了

var obj = {};
function f(o) {
 //   o = 'li';

   o = [];
}
f(obj);
console.log(obj); //{}  没有修改

重点:调用函数传参时,函数接受对象实参引用的副本(既不是按值传递的对象副本,也不是按引用传递的隐式引用)。 它和按引用传递的不同在于:在共享传递中对函数形参的赋值,不会影响实参的值。如下面例子中,不可以通过修改形参o的值,来修改obj的值。也就是说不可以改变引用类型的指针,只可以改变这个对象的属性。

通常基本类型是不可变的,例如:number  string  boolean等

var str = "abc";

str[0]  // a

str[0] = 'b'

str     //abc

注意:很多时候我们会str = "gg"  通常会误解这不是会变吗,但是变得是str这个变量,被重新赋值了,而不是 'abc' 变化了。

上一篇:RAID5和RAID10,哪种RAID更适合你(上)


下一篇:BZOJ4144 [AMPPZ2014]Petrol 【最短路 + 最小生成树】