Object 是内置的构造函数,用于创建普通对象。
<script>// 通过构造函数创建普通对象let user = new Object({name: '小明', age: 15});// 这种方式声明的变量称为【字面量】let student = {name: '杜子腾', age: 21}// 对象语法简写let name = '小红';let people = {// 相当于 name: namename,// 相当于 walk: function () {}walk () {console.log('人都要走路...');}}console.log(student.constructor); // 明天讲console.log(user.constructor); // 明天讲console.log(student instanceof Object); // 明天讲</script>
课堂代码:
// Object是内置的构造函数// 1. 直接 new Object(),得到空对象// let obj1 = new Object()// // 给对象添加属性、方法;语法,还是 ”对象.属性 = 值”// obj1.uname = 'zhangsan'// obj1.age = 20// obj1.say = function () {// console.log(this.age)// }// console.log(obj1)// obj1.say()// 2. 直接 new Object({key: value, key: value})let obj2 = new Object({ uname: 'zs', age: 30 })console.log(obj2)
下图展示了普通对象在内存中的存储方式:普通对象数据保存在堆内存之中,栈内存中保存了普通对象在堆内存的地址。

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

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

// -------------------------- 原始类型 ----------------------// let a = 'hello'// let b = a // 将 a 的值 hello 赋值给了b// b = 'hahaha' // 将b的值改为 hahaha// console.log(a)// console.log(b)// ------------------------- 引用类型 -------------------------let obj = { uname: 'lisi', age: 20 }let obj2 = obj // 把obj的值,赋值给obj2obj2.age = 100 // 修改obj2的age,修改了属性,会影响另一个对象obj.uname = '老段' // 修改obj的uname,修改了属性,会影响另一个对象// 给obj2重新赋了一个新值。从此,obj和obj2就是两个不同的对象了obj2 = { uname: 'zhangsan', age: 2000 }console.log(obj)console.log(obj2)
总结:
- 推荐使用字面量方式声明对象,而不是
Object构造函数 Object.assign静态方法创建新的对象Object.keys静态方法获取对象中所有属性Object.values表态方法获取对象中所有属性值
面试回答堆与栈的区别:
- 堆和栈是内存中的数据存储空间
- 简单类型的数据保存在内存的栈空间中
- 引用类型的数据保存在内存的堆空间中,栈内存中存取的是引用类型的地址(房间号)
