JS 对象基本用法

197 阅读3分钟

什么是对象(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 来判断这个对象是否包含某个属性,注意,它无法过滤原型上的属性,比如 toStringObject 原型上的属性,使用 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 只有在查找属性的时候才有这种顺网砍的功能,修改自己的属性时,只会在自己对象内进行修改创建或删除。


声明:本文为个人原创笔记,著作权归本人和饥人谷所有,转载务必注明来源