什么是对象(Object)?
对象是一组无序的数据集合,在对象中这种数据被称为属性,它一般由键值对组成 { 'keys': value },所以我们也会将键称作属性名,值称为属性值
关于键值对的一些细节
- 属性名是字符串类型的,正常情况下我们可以省略字符串的引号,但如果是由数字开头的尽量用引号包裹,JS 可能会认为这个数字是 8 进制或 16 进制,使用引号可以避免很多细节上的错误。
obj[key]与obj['key']其实是不一样的,前者的key代表的是一个变量,后者是直接查询obj中的key属性- 属性名必须是字符串,不能是标识符,可以包含任意字符
对象的隐藏属性 __proto__ 是什么?
- 每一个对象都有一个原型
- 对象中有一个隐藏属性
__proto__指向的就是这个原型 - 原型也是一个对象
- 所有对象的最终原型是
Object.prototype Object.prototype是原型也是对象,但它的__proto__指向的是null
如何创建一个对象
let obj = {}let obj = new Object()
let obj1 = {};
let obj2 = new Object()
对象的增删改查
给对象添加属性
- 直接添加
let obj = {}
// 直接添加属性 obj.keys = value
obj.abc = 'Hello World!';
// 上面的变种
obj['bcd'] = '你好,世界!'
- 通过变量添加属性
// 之前有说过 [] 中不加引号表示变量
let keys = 'aaa'
obj[keys] = '我的属性名是一个变量'
- 使用
Object.assign给对象批量添加属性
let obj = {}
Object.assign(obj,{ 'ab': 'Hello', 'cd': 'World!' })
删除对象上的属性
- 使用
delete删除对象上的属性,需要注意是当我们使用delete删除不存在的属性时,浏览器依然会返回true
let obj = {
'aaa': 'Hello',
'bbb': 'World',
'ccc': '你好',
'ddd': '世界'
}
// 使用 delete 进行删除操作
delete obj.aaa // true
delete obj['bbb'] // true
let f = 'ccc';
delete obj[f]; // true
修改对象上的属性
- 直接修改
let obj = { 'a': 1, 'b': 2 }
obj.a = 3;
obj['b'] = 4;
查看对象上的属性
console.dir()可以查看对象的属性结构,包括隐藏属性
let obj = {
'a': 3,
'b': 4
}
console.dir(obj)
- 直接查看对象上的某个属性
- obj.key
- obj['key']
- obj[key] : PS.通过变量查询
let obj = {
'a': 123,
'b': 456,
'c': 789
}
console.log(obj.a) // 123
console.log(obj['b']) // 456
let
- 通过
Object.keys查看对象上所有的属性,Object.keys会将对象上的属性放在一个数组中并返回
let obj = {
'a': 123,
'b': 456,
'c': 789
}
Object.keys(obj)
- 使用
in来判断这个对象是否包含某个属性,注意,它无法过滤原型上的属性,比如toString是Object原型上的属性,使用in判断时依然会返回true
let obj = {
'a': 123,
'b': 456,
'c': 789
}
console.log( 'd' in obj ); // true
console.log( 'toString' in obj ); // true
hasOwnProperty判断这个属性是否是对象自己的
let obj = {
'a': 123,
'b': 456,
'c': 789
}
console.log( obj.hasOwnProperty('b') ) // true
console.log( obj.hasOwnProperty('toString') ) // false
关于 JS 原型的一些补充
为什么我们创建对象时明明什么属性都没添加,但却又
toString等功能?
因为当 JS 在查找对象的某个属性的时候,它在找完对象内部没有发下这个属性,它就会顺着对象的隐藏属性 __proto__ 前往这个对象的原型上查找,而 toString 就是对象的最顶级原型 Object.prototype 中的属性
我们可以在自己创建的对象上,修改这个对象原型上的属性吗?
不可以,JS 只有在查找属性的时候才有这种顺网砍的功能,修改自己的属性时,只会在自己对象内进行修改创建或删除。