JavaScript笔记(1)
  1. 基本数据类型(值类型):

    • NumberStringBooleanNullUndefinedSymbolBigInt

    • 直接存储在栈内存中

    • 不可以动态地添加属性:

      let name = "bob"
      name.age = 22 // Cannot create property 'age' on string 'bob'
      console.log(name.age) // undefined
      
    • 复制时拷贝的是值,所以复制前后的两个变量彼此独立:

      let n1 = 5;
      let n2 = n1;
      n1 = 6;
      console.log(n2); // 5
      
  2. 引用数据类型

    • Object(包括数组、函数、日期等)

    • 值存储在堆内存中,栈内存存储指向堆内存的引用地址

    • 可以动态地添加属性

    • 由于实际操作的是栈上的指针变量,所以复制指针拷贝了地址只是浅拷贝:

      let o1 = { "name": "bob" }
      let o2 = o1;
      o2.name = "amy";
      console.log(o1); // amy
      console.log(o2); // amy
      

      可以通过深拷贝解决:

      let o1 = { "name": "bob" }
      let o2 = deepCopy(o1);
      o2.name = "amy";
      console.log(o1); // bob
      console.log(o2); // amy// DFS地递归深拷贝
      function deepCopy(obj, hash = new WeakMap()) {// bound// 如果不是有效的对象类型,则浅拷贝就是深拷贝if (obj === null || typeof (obj) !== 'object') {return obj;}// body// 求hash来处理循环引用if (hash.has(obj)) {return hash.get(obj);}const copy = Array.isArray(obj) ? [] : {};hash.set(obj, copy);for (const key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = deepCopy(obj[key], hash);}}return copy;
      }