原始值和引用值

以往我们通常会说 基本类型值和引用类型值

原始值六种:

  • Undefined
  • Null
  • String
  • Number
  • Boolean
  • Symbol

引用值:对象

动态属性

对原始值添加属性没有意义,尽管不会报错. 但是可以随时给引用值添加、修改、删除属性和方法

  1. let person = new Object();
  2. person.name = "Nicholas";
  3. console.log(person.name); // "Nicholas"
  4. let name = "Nicholas";
  5. name.age = 27;
  6. console.log(name.age); // undefined, 这样做没有意义
  7. let name1 = "Nicholas";
  8. let name2 = new String("Matt"); // 注意理解基本包装类型
  9. name1.age = 27;
  10. name2.age = 26;
  11. console.log(name1.age); // undefined
  12. console.log(name2.age); // 26
  13. console.log(typeof name1); // string
  14. console.log(typeof name2); // object

复制值

原始值会全部复制, 引用值只会复制引用

  1. let obj1 = new Object();
  2. let obj2 = obj1; // 引用类型复制
  3. obj1.name = "Nicholas";
  4. console.log(obj2.name); // "Nicholas"

参数传递

ES中所有函数都是按值传递的

  1. // 原始值按值传递很好理解
  2. function addTen(num){
  3. num += 10;
  4. return num;
  5. }
  6. let count = 20;
  7. let result = addTen(count)
  8. console.log(count) // 20
  9. console.log(result) // 30
  10. // 引用类型按值传递不太好理解
  11. function setName(obj) {
  12. obj.name = "Nicholas";
  13. }
  14. let person = new Object();
  15. setName(person);
  16. console.log(person.name); // "Nicholas"
  17. function setName2(obj) {
  18. obj.name = "Nicholas";
  19. obj = new Object(); // 这表明函数中参数的值改变之后,原始的引用仍然没变
  20. obj.name = "Greg";
  21. }
  22. let person2 = new Object();
  23. setName2(person2);
  24. console.log(person2.name); // "Nicholas"