JS对象用法的注意点

268 阅读2分钟

对象声明

键名/属性名:字符串类型,不是标识符,可以包含任意字符

所有的属性名都会自动转化为字符串

常量(字符串类型)与变量(类型与值都不确定)作属性名区别:

let p = 'name'
let obj = {'p':'chili'}     //属性名为'p'
let obj2 = {[p]:'chili'}    //属性名为'name'

注意:

  1. 变量值不为字符串时,属性名会自动转化为字符串
let obj = {[1+2+3]:'chili'}     //属性名为'6'
  1. 加了[]会当成变量求值
  2. 不加则自动变成字符串

原型:共有属性组成的对象

每一个对象都有隐藏属性,隐藏属性储存着共有属性组成的对象的地址,即隐藏属性储存原先的地址。

查看对象的属性

  1. obj['key']
  2. obj.key

注意:

obj[key]中key为变量 不等价于obj.key以及obj['key']

let p = 'name'      //obj[p]等价于obj['name']

'xxx' in obj和obj.hasOwnProperty('xxx') 的区别

obj.hasOwnProperty('xxx')      //可判断一个属性是自身属性还是共有属性 返回true即为自身属性
'xxx' in obj                 //查看对象是否有这个属性 但无法判断属性是自身属性还是共有属性

修改对象的属性

修改自身属性--------------- 可直接赋值

obj.name = 'chili'
obj['name'] = 'chili'

obj[name] = 'chili'         //错误 name为变量 不确定的值

修改共有属性

obj.toString='xxx'    //toString属性是obj对象的自身属性且值为'xxx', 也是共有属性但是值不变,并且读取这个属性时默认先读取自身的属性。
obj2.toString === 'xxx'   //返回false  因此不能通过这种方式修改共有属性
  • 可通过以下方法修改原型属性
obj.__proto__.toString = 'xxx'      //非常不推荐
Object.prototype.toString = 'xxx'
  • 可使用Object.create 将一个对象包装为原型
let commom = {style:'huamn'}
let obj = Object.create(common)
obj.name = 'chili'
let obj2 = Object.create(common)
obj.name = 'tom'

不含属性名与属性值为undefined的区别

  • 不含属性名
'xxx' in obj        //返回false
  • 存在属性名且属性值为undefined
'xxx' in obj && obj.xxx     //返回undefined  
  • obj.xxx === undefined 不能确定'xxx'是否为obj的属性
let obj = {}
let obj1 = {xxx:undefined}
obj.xxx === obj1.xxx        //返回true