Object 是内置的构造函数,用于创建普通对象。

    1. <script>
    2. // 通过构造函数创建普通对象
    3. let user = new Object({name: '小明', age: 15});
    4. // 这种方式声明的变量称为【字面量】
    5. let student = {name: '杜子腾', age: 21}
    6. // 对象语法简写
    7. let name = '小红';
    8. let people = {
    9. // 相当于 name: name
    10. name,
    11. // 相当于 walk: function () {}
    12. walk () {
    13. console.log('人都要走路...');
    14. }
    15. }
    16. console.log(student.constructor); // 明天讲
    17. console.log(user.constructor); // 明天讲
    18. console.log(student instanceof Object); // 明天讲
    19. </script>

    课堂代码:

    1. // Object是内置的构造函数
    2. // 1. 直接 new Object(),得到空对象
    3. // let obj1 = new Object()
    4. // // 给对象添加属性、方法;语法,还是 ”对象.属性 = 值”
    5. // obj1.uname = 'zhangsan'
    6. // obj1.age = 20
    7. // obj1.say = function () {
    8. // console.log(this.age)
    9. // }
    10. // console.log(obj1)
    11. // obj1.say()
    12. // 2. 直接 new Object({key: value, key: value})
    13. let obj2 = new Object({ uname: 'zs', age: 30 })
    14. console.log(obj2)

    下图展示了普通对象在内存中的存储方式:普通对象数据保存在堆内存之中,栈内存中保存了普通对象在堆内存的地址。

    image.png

    普能对象在赋值时(let obj2 = obj)只是复制了栈内中的地址,而非堆内存中的数据,如下图所示:

    image.png

    普通对象赋值后,无论修改哪个变量另一个对象的数据值也会相当发生改变。
    如果给 obj2 赋一个新的值(obj2 = { uname: ‘zhangsan’, age: 2000}),则 obj 和 obj2 就是完全不同的两个对象了。

    image.png

    1. // -------------------------- 原始类型 ----------------------
    2. // let a = 'hello'
    3. // let b = a // 将 a 的值 hello 赋值给了b
    4. // b = 'hahaha' // 将b的值改为 hahaha
    5. // console.log(a)
    6. // console.log(b)
    7. // ------------------------- 引用类型 -------------------------
    8. let obj = { uname: 'lisi', age: 20 }
    9. let obj2 = obj // 把obj的值,赋值给obj2
    10. obj2.age = 100 // 修改obj2的age,修改了属性,会影响另一个对象
    11. obj.uname = '老段' // 修改obj的uname,修改了属性,会影响另一个对象
    12. // 给obj2重新赋了一个新值。从此,obj和obj2就是两个不同的对象了
    13. obj2 = { uname: 'zhangsan', age: 2000 }
    14. console.log(obj)
    15. console.log(obj2)

    总结:

    1. 推荐使用字面量方式声明对象,而不是 Object 构造函数
    2. Object.assign 静态方法创建新的对象
    3. Object.keys 静态方法获取对象中所有属性
    4. Object.values 表态方法获取对象中所有属性值

    面试回答堆与栈的区别:

    1. 堆和栈是内存中的数据存储空间
    2. 简单类型的数据保存在内存的栈空间中
    3. 引用类型的数据保存在内存的堆空间中,栈内存中存取的是引用类型的地址(房间号)