定义:

无序的数据集合
键值对的集合

声明写法(2种):

  1. let obj1 = {'name':'frank' , 'age':18}
  2. let obj2 = new Object({'name':'frank','age':18})
  3. console.log({'name':'frank','age':18}) // 匿名对象写法

键名细节:

Object.keys(对象)可以查看该对象的所有key
键名(key)就是每个对象的属性名(property)
键名是字符串,不是标识符,可以包含任何字符
就算引号省略了,键名依旧是字符串

如果键名为 1e2 或者1e-2,但并未加上引号,会先通过运算成100和-100,再变成字符串
如果键名是十六进制的数,但并未加上引号,会先转化成十进制,再变成字符串,如0xFF就是’255’

变量做属性名:

如果变量名不加[],不加[]的属性名会自动变成字符串
加了[]则会当做是引用变量的值来当属性名
如果变量的值不是字符串,会自动变成字符串

对象的隐藏属性:

JS中的每一个对象都有一个隐藏属性
这个隐藏属性储存着其共有属性组成的对象地址
这个共有属性组成的对象就是原型
也就是说,隐藏属性储存着原型的地址

属性名的增删改查:

删除属性:

delete obj.xxx 或 delete obj[‘xxx’]
即可删除obj的xxx属性
注:请区分属性值为undifined和不含属性名

一个对象是否有属性名

‘xxx’ in obj 可以判断 obj有没有xxx的属性

含有属性名,但是值为undefined
‘xxx’ in obj && obj.xxx === undefined的值为true

注意: obj.xxx===undefined 不能确定’xxx’是否为obj的属性,因为当obj没有xxx属性是,该值仍然为true

查看所有属性(读属性)

查看自身属性:

Object.keys(obj)

查看自身+共有属性:

console.dir(obj)

判断一个属性是共有的还是自身的:

obj.hasOwnProperty(‘toString’)

查看属性值:

obj[‘属性名’]或obj.属性名或obj[变量名]
注意:obj[key]和obj[‘key’]不是同一个东西

修改或增加属性

直接赋值:

let obj = {‘name’: ‘frank’}
let obj[‘age’] = 18

修改属性:

obj[‘name’] = ‘bruce’

批量赋值:

Object.assign(obj,{‘gender’:’man’ ,’age’: 18})

改共有属性:

obj.proto[‘toString’]=’xxx’
Object.prototype[‘toString’]=’xxx’

原型:

  • 每个对象都有原型,原型里存着对象的共有属性
  • 比如obj的原型就是一个对象,obj.proto这个属性里存着这个这个对象的地址
  • 这个对象里有toString/constructor/valueOf等属性
  • 对象的原型也是对象
  • 所有对象的原型也有原型
  • obj={}的原型即为所有对象的原型
  • 这个原型所包含的对象的的共有属性,是对象的根
  • 这个原型也有原型,是null

    改原型:

    不推荐使用proto
    1. let obj = {'name':'frank'}
    2. let obj2 = {'name': 'jack'}
    3. let common = {'kind': 'human'}
    4. obj.__proto__ = common
    5. obj2.__proto__ = common
    推荐使用Object.create ```javascript let obj = Object.create(common) obj.name = ‘frank’ let obj2 = Object.create(common) obj2.name = ‘jack’

``` 注:所有proto代码都是强烈不推荐写的

‘name’ in obj 和 obj.hasOwnProperty(‘name’)区别

name’ in obj 查看’name’属性是否存在于obj对象里
obj.hasOwnProperty(‘name’) 查看’name’属性是否为obj对象私有的