js对象增删查改

82 阅读1分钟

定义

无序的数据集合

键值对的集合

写法:let obj = {'name': 'frank','age':18}

属性名

奇怪的属性名

所有属性名会自动变成字符串

let obj = {
    1:'a',
    3.2: 'b',
    le2:true,
    le-2:true,
    .234:true,
    0xFF:true
}
Object.keys(obj) 为 ["1","100","255","3.2","0.01","0.234"]

Object.keys(obj)可以得到obj的所有key

变量用作属性名

let p1='name'
let obj = {p1:'frank'};//属性名为'p1'
let obj = {[p1]:'frank'};//属性名为'name'

对比

不加[]的属性名会自动变成字符串

加了[]则会当作变量求值

值如果不是字符串,则会自动变成字符串

对象的增删查改

删除属性

delet obj.xxx 或者 delete obj[xxx]

即可删除obj的xxx属性

区分:

let obj = {name:'frank',age:18}

let obj.name=undefine

delete obj.name

设置属性值设为undefined,属性名还是存在对象中

用delete删除,对象中不含有属性名

检测对象是否含有属性名

'xxx' in obj === false

含有属性名,但是值为undefined

'xxx' in obj && obj.xxx === undefined

注意 obj.xxx === undefined;不能断定'xxx'是否为obj的属性

查看属性

  • Object.keys(obj)
  • console.dir(obj) 或者 依次用Object.keys打印出obj.proto

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

obj.hasOwnProperty('toString')

<'xxx' in obj与obj.hasOwnProperty('xxx')的区别

'xxx' in obj检测obj使用检索到xxx属性,包括自己的属性和共有属性;

obj.hasOwnProperty('xxx')自检测自己有没有xxx属性,不包括共有属性

访问单个属性值

obj['key']

obj.key

obj.[key]

修改或增加属性(写属性)

  • 直接赋值
let obj={name:'frank'} //name是字符串
obj.name='frank'//name是字符串
obj['name']='frank'//name是字符串
obj['na'+'me']='frank'
let key='name';obj[key]='frank'//key是变量
  • 批量赋值
Object.assign(obj,{age:18,gender:'man'})

  • 修改或增加共有属性

无法通过自身修改或增加共有属性

例如

let obj={},obj2={}//共有toString
obj.toString='xxx'//只会改obj的自身属性
obj2.toString 还是在原型上
  • 如何修改或增加原型上的属性
obj.__proto__.toString = 'xxx' //不推荐使用__proto__
Object.prototype.toString='xxx'
  • 修改隐藏属性

不推荐使用__proto__

例如


let obj={name:'frank'}
let obj2={nmae:'jack'}
let common={kind:'human'}

obj.__proto__=common
obj2.__proto__=common

内存图

推荐使用Object.create

 let obj=Object.create(common) //以common为原型创建对象