定义
对象是一种基本数据类型(其他基本数据类型:字符串、布尔值、数字、null、undefined),由键值对组成 =》属性名和属性值组成,可通过属性值访问到属性值。属性名是 字符串,可以看成是从字符串到值的映射。
针对工作中常用的场景做了该篇总结。内容主要是 对象遍历、原型链、深浅拷贝以及es6的新特性。
1.对象的创建
1.1对象直接量:直接创建一个json对象
let object = {a: 1, b: 2}
1.2 new关键字创建类
let object = new Object()
let dataObject = new Date() (这也是对象)
2.对象的元素的增 删 改
2.1 对已经声明的对象,直接定义
let object = new Object()
object[a] = 'sunjing' // object = {a: 'sunjing'}
2.2 如果属性名和属性值的变量名一直,可以直接省略为一个名字。所以在前端定义变量时,可尽量和后台接口变量名保持一致。
const foo = 'bar'
const baz = {foo}
baz // {foo: "bar"}
// 等同于
const baz = {foo: foo}
2.3 修改元素
给已有元素直接赋值就会覆盖原有元素
2.4 删除元素
直接使用delete关键字删除对象元素
let object = {a: 1, b: 2}
delete object.a
object // {b: 2}
3.对象元素的获取
(主要针对对象的自有属性。继承属性、不可枚举属性的获取不常用,暂不列举)
3.1 根据属性名直接获取
let object = {a: 1, b: 2}
object[a] 或者 object.a // 1
两种方式都一样,但是如果属性名是变量或者表达式,不是确定的字符串常量时,只能通过[]获取
3.2 属性遍历
1)for…in
2)
-
Object.keys(obj) 返回一个数组,包含所有对象自身可枚举 属性的键名。
-
Object.values(obj) 返回一个数组,包含所有对象自身可枚举 属性值。
-
Object.entries(obj) 返回一个数组,包含所有对象自身可枚举 键值对数组。
eg:let object = {a: 1, b: 2} for(let key of Object.keys(obj)) { console.log(key) // 'a', 'b' } for(let value of Object.values(obj)) { console.log(value) // 1, 2 } for(let [key, value] of entries(obj)) { console.log([key, value]) // ['a', 1],['b', 2] }
Object.entries方法的另一个用处是,将对象转为真正的Map结构(es6中Map数据结构也是由键值对构成,使用起来比Object更加灵活一点)。
eg:
const obj = { foo: 'bar', baz: 42 }
const map = new Map(Object.entries(obj))
map // Map { foo: "bar", baz: 42 }
4.Object.assign() 对象浅拷贝
两个对象的合并 (只拷贝自身属性,不拷贝继承属性和不可枚举属性)
将源对象的所有可枚举属性复制到目标对象中。如果源对象与目标对象有同名属性,则同源对象的属性值会覆盖目标对象的值。
const target = { a:1, b:1}
const surce1 = { b:2, c:2}
const source2 = { c:3}
Object.assign(targe,source1,source2)
targe // {a:1,b:2,c:3}
目标对象=》第一个参数,一定是对象否则就报错,源对象不是对象会转化为对象,不能转化就会直接跳过。数组会转化为对象,字符串会被当做数组转化为对象
(如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。源对象 的对象改变会对应的影响到 被拷贝的对象值)
eg:
const v1 = 'abc'
const v2 = true;
const v3 = 10;
const obj = Object.assign({}, v1, v2, v3);
console.log(obj); // { "0": "a", "1": "b", "2": "c" }
对于数组的处理:会把数组视为属性名为其数字下标(0、1、2…)的对象,因此如果都是数组的话会按照其数字下标覆盖。
eg:
Object.assign([1,2,3],[4,5])
// [4,5,3]
4,5 把 1,2覆盖了
这种方式也常用于克隆对象。避免引用对象出现赋值互相影响。
let origin = {a:1,b:2}
Object.assign({}, origin) // {a:1,b:2}
5.对象的继承
Object.setPrototypeOf(object, prototype) 该方法用来设置对象的原型对象, 也就是 把prototype设置为object的原型对象。
eg:
let proto = {}
let obj = { x: 10 }
Object.setPrototypeOf(obj, proto)
proto.y = 20
proto.z = 40
obj.x // 10
obj.y // 20
obj.z // 40
proto对象设为obj对象的原型,所以obj对象可以读取proto对象的属性。
Object.getPrototypeOf()该方法和Object.setPrototypeOf()相对应,用于获取一个对象的原型对象。