Js高级程序设计里,说函数参数只能按值传递,我研究了好久,网上的解释也恍恍惚惚。不懂的是,作者为什么要把形参obj重写,然后得出结论:obj的属性的改变没有引起外部person属性的改变,所以这不是一个按引用传递。我的天!都重写了,obj在内存都已经换指向了,跟person毛关系都没有了,当然引不起person的属性改变了!这证明不了按值传递啊!难道我理解有问题吗?求大神解答!感激不尽!为此头疼一天了。
书上的代码:
function setName(obj){
obj.name="N";
obj=new Object();
obj.name="G";
}
var person=new Object();
setName(person);
alert(person.name);//"N"
那一节你没看全吧,按值传递指的是,基本类型的值指的是本省,而引用类型的值指的是内存中的地址,最明显的特征既是,形参和实参是独立的,分别举个例子:
1.值类型
function func(i) { console.log(i);//3 i = 2; } var j = 3; func(j); console.log(j);//3
func中对传入的变量j的修改并没有影响到外部
2.引用类型
就来你举的这个例子来说好了,你将一个person对象传到obj,它们便指向了相同的对象(内存中地址相同),你在方法里面对obj重新赋值(改变了内存中地址),并没有改变外部的person对象(还是原来的地址),这里我再拿C#来做个对比:
class Person { public string Name { get; set; } } static void Main(string[] args) { var person = new Person(); SetName(ref person); Console.WriteLine(person.Name);//taffy Console.ReadKey(); } static void SetName(ref Person person) { person.Name = "jello"; person = new Person(); person.Name = "taffy"; }
这里通过ref来传递person引用,我在方法中对person重新赋值,也修改了外部的实参(有那么点C/C++中二重指针的味道)