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' 变化了。