js 中的值传递和引用传递
js 函数传参的时候,如果是基本类型,则按值传递,如果是引用类型,则是引用传递(按地址传递)
var num = 1
function foo(num) {
num = num + 1
return num
}
foo(num) // 2
num // 1
function changeAgeImpure(person) {
person.age = 25;
return person;
}
var alex = {
name: "Alex",
age: 30
};
var changedAlex = changeAgeImpure(alex);
console.log(alex); // { name: 'Alex', age: 25 }
console.log(changedAlex); // { name: 'Alex', age: 25 }
function changeAgeAndReference(person) {
person.age = 25; // 按址传递,会修改对象
// 一个新对象,指向另一个内存地址
person = {
name: "John",
age: 50
};
return person;
}
var personObj1 = {
name: "Alex",
age: 30
};
var personObj2 = changeAgeAndReference(personObj1);
console.log(personObj1); // {name: "Alex", age: 25}
console.log(personObj2); // {name: "John", age: 50}
js 基础类型的属性赋值问题
在 js 中,变量的类型一旦被声明为基础类型,如果再为基础类型的变量添加属性,则其新建的属性不可存储,会自动销毁。
流程如下:
- 首先将基础类型临时转换为 Object 类型,并备份好基础类型的值;
- 为 Object 类型添加属性;
- 属性赋值完成后,再将 Object 转换为基本类型,并恢复为原值,并将临时对象销毁;
let num = 1
let obj = Object(num)
obj.a = 1
Number(obj) // 1
let num = 1
num.name = '123'
console.log(num.name) // undefined
var b = 10;
(function b(b) {
b.b = 20;
console.log(b) // 10
})(b)
来源:CSDN
作者:无语听梧桐
链接:https://blog.csdn.net/weixin_36894745/article/details/103612394