对象是无序的数据集合,是键值对的合集。 它的键值对数量不固定,所以存储在堆内存中,方便增删改查。
声明对象的两种语法😊
let obj = new Object{}规范的写法let obj = {}简写
属性名(property)和属性值(value)
属性名采用 'name': chypre这样的写法。
要注意属性名无论何时都是一段字符串!
如果键值不是字符串,会发生什么?会进行运算,再把运算结果转成字符串。
(在很少的情况下,Symbol也可作为属性名,在迭代时可以用到)
let obj = new Object();
obj.name = 'Alice'; // let obj['name'] = 'Alice';
obj[name] = 'Alice';
// name here is a variable
// error: name is not defined
隐藏属性与原型
每个对象都有一个隐藏属性__proto__,这个隐藏属性储存着所有对象的共有属性的地址,称为原型。
删除属性的方法
delete obj.namedelete obj['name']obj.name = undefined;此操作不会删除属性,而是将属性设置为undefined。- 注:使用
delete关键词删除,无论该属性是否存在都不会报错。
查看obj属性的方法
Object.keys(obj)Object.values(obj)Object.entries(obj)console.dir(obj)可以以目录的形式打印obj.__proto__不推荐该用法,__proto__是隐藏属性,不要这样调用。 查看属性是否存在的方法:toSring in obj属性只要存在就为trueobj.hasOwnProperty('toSting')隐藏属性不算哦~
增加或修改属性的方法
Object.assign(obj, {k1: v1, k2: v2 ...})批量赋值属性Object.prototype.toString = 'new function'直接修改原型
以obj为原型创建对象
let obj = new Object({k1: v1, k2: v2})
let obj2 = Object.create(obj)
obj2的隐藏属性__proto__就会指向obj,obj的隐藏属性__proto__就会指向Object.prototype。这就是原型链。请在生成时就决定好原型链,而不是在使用中随意修改,以免影响性能。