2018/08/07
先说说我对这两个传递的理解吧
- 值传递
将变量的值重新复制到另外一个变量上,两者之间并没有其他任何的关联 - 引用传递
将变量指向堆内存中的指针复制到另外一个变量上,简单的说就是其中一个值发生了改变,另外一个也改变了。(这只是我个人浅浅的理解)
- 值传递
在JavaScript中5种基本数据类型都是按值传递的。
let foo = 1
let bar = foo
bar = 2
console.log(foo) // foo = 1
- 引用传递
那么还有一个Object的数据类型肯定是按照引用传递的了
let foo = {
message: 'i am message'
}
let bar = foo
bar.message = 'no, i am text'
console.log(foo) // foo = {message: "no, i am text"}
//我女朋友看小说把眼睛都看花了真的拼啊 2018/08/07 23:19
2018/08/08
继续昨天的说:
在我刚刚看到引用传递时,我以为是如下这个例子的
let foo = {
message: 'i am message'
}
let bar = foo
bar = 'no, i am text'
// [我以为它会变成'no, i am text']
//结果显然我是错的
console.log(foo) // foo = {message: 'i am message'}
console.log(bar) // bar ='no, i am text'
感觉就是当bar被重新赋值时,原来指向foo的指针就断开了。 我对这个的理解非常差,希望有大神看到的时候可以指正我。
参数传递
红宝书中说到: ECMAScript中所有函数的参数都是按值传递的。
参数传递可以传递基本数据类型和引用数据类型。
- 传递基本数据类型时,是将被传递的值复制给了一个局部变量。
- 传递引用数据类型是,是将被传递的值在内存中的地址复制给了局部变量
常见的Demo就不记录了, 记录一个红宝书中的例子
function setName(object) {
object.name = 'Jack'
object = new Object() //我感觉在此处与上文相似,指向原object的指针断开了,指向了新的元素
object.name = 'Owen'
}
let person = new Object()
setName(person)
console.log(person.name)
//我女朋友又不睡觉,太可恶了每天都要我监督她 2018/08/08 23:30