Object
是内置的构造函数,用于创建普通对象。
<script>
// 通过构造函数创建普通对象
let user = new Object({name: '小明', age: 15});
// 这种方式声明的变量称为【字面量】
let student = {name: '杜子腾', age: 21}
// 对象语法简写
let name = '小红';
let people = {
// 相当于 name: name
name,
// 相当于 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的值,赋值给obj2
obj2.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
表态方法获取对象中所有属性值
面试回答堆与栈的区别:
- 堆和栈是内存中的数据存储空间
- 简单类型的数据保存在内存的栈空间中
- 引用类型的数据保存在内存的堆空间中,栈内存中存取的是引用类型的地址(房间号)