一、声明对象的两种语法
- 写法
1. let obj = {'name': 'frank', 'age': 18}
2. let obj = new Object({'name': 'frank', 'age': 18})
第1种为简单写法,和代码块不一样,但写法相似。
第2种为正规写法。
- 细节
键名必须是字符串,不是标识符,可以包含任意字符。
引号可以省略,省略之后只能写标识符。
就算引号省略了,键名也还是字符串。(重要)
二、如何删除对象属性
-
删除属性
delete obj.xxx或delete obj['xxx']
即可删除obj的xxx属性
注:要区分[属性值为undefined] 和 [不含属性名] -
不含属性名
'xxx' in obj && obj.xxx === undefined -
含有属性名,但是值为
undefined'xxx' in obj && obj.xxx === undefined -
另外,
obj.xxx === undefined不能判断'XXX'是否为obj的属性。
如下图所示:
三、如何查看对象的属性
- 查看自身所有 属性名 / 属性值 / 属性名和值:
Object.keys(obj)/Object.value(obj)/Object.entries(obj) - 查看自身属性和共有属性:
console.dir(obj)- 或者自己依次用
Object.keys打印出obj.__proto__
- 判断一个属性是自身的还是共有的:
obj.hasOwnProperty('toString') - 查看属性写法 两种方法
- 中括号语法:
obj['key'] - 点语法:
boj.key优先使用中括号语法,点语法会误导新人认为key不是字符串。等熟练区分了再改用点语法。
obj.name等价于obj['name']
obj.name不等价于obj[name]
在这里name是字符串,而不是变量。
四、如何修改或增加对象的属性
- 直接赋值
let obj = {name: 'frank' } // name是字符串
obj.name = 'frank' // name是字符串
obj['name'] = 'frank' // name是字符串
// 错,name值不确定obj[name] = 'frank'
obj['na' + 'me'] = 'frank'
let key = 'name'; obj[key]= 'frank'
// 错let key = 'name'; obj.key = 'frank'
因为obj.key 等价于 obj['key']
-
批量赋值
Object.assign(obj, {age: 18, gender: 'man'}) -
改/增 已有属性则改,没有属性则增
改自身 obj['name'] = 'jack'
批量改自身 Object.assign(obj, {age: 18, ...})
改共有属性 obj.__proto__['toString'] = 'xxx'
改共有属性 Object.prototype['toString'] = 'xxx'
改原型 obj.__proto__ = common
改原型 let obj = Object.create(common)
注:所有__proto__代码都是强烈不推荐写的
一些区别
- 例子:
'name' in obj和obj.hasOwnProperty('name')的区别in是查看是否是拥有属性
hasOwnProperty是判断一个属性是自身(true)的还是共有(false)的。
如图所示,'name' 是自身属性,'toString' 是共有属性不是自身属性。
©转载声明