目录
对象
无序的数据集合 键值对的集合
写法
let obj = { '属性名(key)': '属性值(value)', 'age': 18 }
console.log({ 'name': 'frank, 'age': 18 })
let obj = new Object({'name': 'frank'})
注意:
键名是字符串,不是标识符,可以包含任意字符 引号可省略,省略之后就只能写标识符 就算引号省略了,键名也还是字符串(重要)
属性名:每个key都是对象的属性名(property)
属性值:每个value都是对象的属性值
属性名
会变的属性名
所有属性名会自动变成字符串
0bject.keys (obj)可以得到obj 的所有key
Object.keys(yyy) 可以查看yyy对象的键名
变量作属性名
不加[ ]的属性名会自动变成字符串,加了[ ]则会当做变量求值
值如果不是字符串,则会自动变成字符串
除了字符串,symbol 也能做属性名
let a = Symbol()
let obj = { [a]: 'Hello'}·这有什么用呢?「迭代」时会用到
对象的隐藏属性
JS 中每一个对象都有一个隐藏属性,这个隐藏属性储存着其共有属性组成的对象的地址这个共有属性组成的对象叫做原型,也就是说,隐藏属性储存着原型的地址
var obj = {}
obj.toString)//居然不报错,为什么呢?
因为obj 的隐藏属性对应的对象上有toString
下面有一些图,可以让我们更好的理解这个抽象的概念
增删改查(成对象的属性)
删除属性
delete obj. xxx或delete obj['xxx ']即可删除obj的xxx属性
- 请区分「属性值为undefined」和「不含属性名」
- 判断是否含属性名:'xxx' in obj == ture/false
- 含有属性名,但是值为undefined:'xxx' in obj &&obj.xxx ===undefined
- obj.xxx==undefined不能断定‘xxx’是否为obj 的属性只能用in
- 没有就是没有,undefined就是undefined
查看属性
读属性
- Object.keys (obj) (查看自身所有属性)
- console.dir(obj) (查看自身+共有属性)
- obj.hasOwnProperty ('toString ') (判断一个属性是自身的还是共有的)
- 依次用0bject.keys打印出obj.__proto_ (查看共有属性,不推荐)
原型
每个对象都有原型,原型里存着对象的共有属性。比如obj的原型就是一个对象,obj.__proto__存着这个对象的地址,这个对象里有toString / constructor / value0f等属性
对象的原型也是对象,所以对象的原型也有原型,obj = {}}的原型即为所有对象的原型
这个原型包含所有对象的共有属性,是对象的根。这个原型也有原型,是 null(为null就到顶层了)
查看属性
- obj[' key']
- obj. key
注意:
- obj.name等价于obj[' name']
- obj.name不等价于obj[name]
- 因为name是字符串,而不是变量,obj[name]这样不加''表示变量!!!
- let name='frank'
- obj [ name ]等价于obj[ ' frank ' ],obj[name]这样不加''表示变量!!!
- obj [ ' name ' ]和 obj . name别记错啦!!!
- name表示变量,'name'表示字符串
批量赋值:Object.assign(obj,{name:'pig',age:20})
无法通过自身修改或增加共有属性
let obj ={};let obj2 = {}//共有toString ,obj.toString = 'xxx’只会在改obj自身属性,obj2.toString还是在原型上
偏要修改或增加原型上的属性
obj. __proto__.toString = 'xxx’//不推荐用_proto__
0bject.prototype.toString = 'xxx'
一般来说,不要修改原型,会引起很多问题
修改隐藏属性
- 不推荐使用__proto__
- 推荐使用Object. create
规范大概的意思是,要改就一开始就改,别后来再改
总结
删
delete obj[' name ']
'name' in obj // false 看是否有这个属性
obj.hasOwnProperty ( ' name ') // false 看自身是否有这个属性
查
Object.keys (obj) (查看自身所有属性)
console.dir (obj) (查看自身+共有属性)
obj['name'] (查看name属性)
obj.name // 这里的name是字符串 (查看name属性)
obj[name] //这里的 name是变量
改
改自身obj[' name '] = 'jack'
批量改自身 Object.assign(obj,{name:'pig',age:20})
改共有属性obj._proto__[ 'toString'] = 'xxx '
改共有属性 0bject.prototype['toString'] = 'xxx'
改原型obj._proto__ = common
改原型 let obj = 0bject.create (common)
所有__proto__代码都是强烈不推荐写的
增
已有属性则改,没有属性则增。
本文为$Iron的原创文章,著作权归本人和饥人谷所有,转载务必注明来源