Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

学习总结の参数按值传递 #4

Open
AngellinaZ opened this issue Feb 9, 2018 · 0 comments
Open

学习总结の参数按值传递 #4

AngellinaZ opened this issue Feb 9, 2018 · 0 comments

Comments

@AngellinaZ
Copy link
Owner

AngellinaZ commented Feb 9, 2018

参考: JavaScript深入之参数按值传递, by冴羽;Neal_yang

变量可分为什么类型?

基本类型: 存储简单的数据段,一般为Number, String, Boolean, undefined, null

引用类型: 由多个键值对构成的对象, Object

传递方式

按值传递

在《JavaScript高级程序设计》第三版 4.1.3,讲到传递参数:

ECMAScript中所有函数的参数都是按值传递的。

var value = 1;
function foo(v) {
    v = 2;
    console.log(v); //2
}
foo(value);
console.log(value) // 1

理解: 当传递 value 到 函数 foo 中时,相当于拷贝了一份 value, 函数修改的是拷贝值,不改变原来的value

引用传递

传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象。(我的理解是 传递的是个地址)

var obj = {
    value: 1
};
function foo(o) {
    o.value = 2;  //修改对象 o 中 value 的值
    console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2

共享传递

按共享传递是传递对象的引用的副本

var obj = {
    value: 1
};
function foo(o) {
    o = 2;  //直接修改了o的指向
    console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1

总结:

参数如果是 基本类型 是按值传递,如果是 引用类型 按共享传递。

例子:

function setName(obj) {
  obj.name = "Neal";  //1. 内部局部变量obj存的是person的内存地址,通过这个地址可以找到`person对象本身`并对其进行修改
  obj = new Object(); //2. 用一个新的对象的内存地址赋值给obj, obj失去对person的引用, 但person对象本身已存有键值对
  obj.name = "yang";
}
var person = new Object();
setName(person);
console.log(person.name); //Neal
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant