原始值和引用值
以往我们通常会说 基本类型值和引用类型值
原始值六种:
- Undefined
- Null
- String
- Number
- Boolean
- Symbol
引用值:对象
动态属性
对原始值添加属性没有意义,尽管不会报错. 但是可以随时给引用值添加、修改、删除属性和方法
let person = new Object();
person.name = "Nicholas";
console.log(person.name); // "Nicholas"
let name = "Nicholas";
name.age = 27;
console.log(name.age); // undefined, 这样做没有意义
let name1 = "Nicholas";
let name2 = new String("Matt"); // 注意理解基本包装类型
name1.age = 27;
name2.age = 26;
console.log(name1.age); // undefined
console.log(name2.age); // 26
console.log(typeof name1); // string
console.log(typeof name2); // object
复制值
原始值会全部复制, 引用值只会复制引用
let obj1 = new Object();
let obj2 = obj1; // 引用类型复制
obj1.name = "Nicholas";
console.log(obj2.name); // "Nicholas"
参数传递
ES中所有函数都是按值传递的
// 原始值按值传递很好理解
function addTen(num){
num += 10;
return num;
}
let count = 20;
let result = addTen(count)
console.log(count) // 20
console.log(result) // 30
// 引用类型按值传递不太好理解
function setName(obj) {
obj.name = "Nicholas";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"
function setName2(obj) {
obj.name = "Nicholas";
obj = new Object(); // 这表明函数中参数的值改变之后,原始的引用仍然没变
obj.name = "Greg";
}
let person2 = new Object();
setName2(person2);
console.log(person2.name); // "Nicholas"