共计 1602 个字符,预计需要花费 5 分钟才能阅读完成。
初探对象
(一)定义:
- 无序的数据集合
-
声明方式:
let obj = new Object();
let obj = {};
(二)属性名
-
Object.keys (obj)
:可以得到 obj 的所有属性名 - 变量作为属性名:
let a='name'
var obj = {a: jack; // 属性名为 'a'}
var obj2 = {[a]: jack; // 属性名为 'name'}
- 对比:不加 [] 的属性名会自动变成字符串;反之则会当成变量求值;值如果不是字符串则自动转换为字符串
(三)对象的隐藏属性
- JS 中每一个对象都有一个隐藏属性
- 这个隐藏属性储存这个对象的共有属性组成的对象的地址
- 这个共有属性组成的对象就叫做原型。
- 也就是说隐藏属性储存原型的地址。
- 因为原型其实是共有属性组成的对象,所以原型也是一个对象,所以原型也有它的原型。
(四)属性的增删改查
1)删除
-
delete obj.xxx
:删除 obj 中的 xxx 属性 -
'xxx' in obj
:若 xxx 在 obj 中返回 true,否则返回 false -
obj.xxx === undefined
- 结论:不能证明 xxx 是否为 obj 的属性
- 原因:xxx 属性可能不存在,或者 xxx 属性存在但是值为 undefined
2)查看
-
Object.keys(obj)
:查看自身所有属性名-
Object.values(obj)
:查看自身所有属性值 -
Object.entries(obj)
:查看所有属性和值
-
-
console.dir(obj)
:以目录形式查看自身 + 共有属性 - 判断一个属性是否是自身的属性(非共有属性):
obj.hasOwnProperty('xxx')
-
查看属性
obj.xxx
-
obj['xxx']
:与第一种等价 -
obj[xxx]
:xxx 为变量,与上述两种完全无关
一道代码题区分开上述三种情况:
let list = ['name', 'age', 'gender']
let person = {name: 'frank', age: 18, gender: 'man'}
for (let i = 0; i < list.length; i++) {let name = list[i]
console.log(???) // 这里 ??? 替换成什么使 person 所有属性被打印出来
}
// 1.console.log(person.name) 2.console.log(person[name])
// 答案:console.log(person[name])
3)增改
- 直接赋值:
obj.name="xxx"
; - 批量赋值:
//es6 新增语法,推荐使用
Object.assign(obj,{ name: xxx, age: xxx , gender: xxx})
-
无法通过自身修改或修改原型:
- 如
obj.toString='xxx'
;只会作用在 obj 自身属性上
- 如
-
修改原型:
- 修改 obj.__proto__:不推荐
- 必须要修改可以用
Object.prototype
-
将一个对象的原型设置为另一个对象:
-
let obj2.__proto__ == obj
(不推荐) -
let obj2 == Object.create(obj)
:推荐,es6 新写法,效果等同于第一种、 - create 配合 assign 创建对象
-
4)一些问题
-
'x' in obj
和obj.hasOwnProperty('x')
的区别:-
'xxx' in obj
只能检查 xxx 是否在 obj 中而无法区分是否是自身属性 - 相反地 obj.hasOwnProperty()可以对自身属性进行区分并返回 true,非自身属性返回 false
-
- Object.create 和 new Object()的区别:
// a 中的 name 为原型中的属性
var a = Object.create ({name: 'A'});
// b 中的 name 为自身的属性
var b = new Object ({name:'A'})
正文完
发表至: javascript
2019-09-23