JavaScript 对象基本用法

139 阅读3分钟

1. 基本写法

对象是无序的数据集合,是键值对的集合。

// 两种声明语法
let obj = {'name': 'frank', 'age': 18}
let obj = new Object({'name': 'lanny'})
console.log({'name': 'lanny', 'age': 18})

对象的键名是字符串,若省略引号则只能按照标识符规则来写。极个别情况下可使用 symbol 作为属性名(ES6)。

let obj = {
    1e2: '100'
}
// 不加引号,JS 会先计算出 1e2 === 100,然后把 100 变成字符串,相当于以下代码
let obj = {
    100: '100'
}
let obj = {
    1e-2: true
}
// 相当于
let obj = {
    0.01: true
}

使用变量的值作为对象属性名需要加中括号。

let a = '123';
let obj = {
    [a]: 1111
}
// 相当于以下
let obj = {
    '123': 1111
}

symbol 作为属性名。

let a = Symbol();
let obj = {
    [a]: 'Hello'
}

2. 隐藏属性和原型

JavaScript 中每个对象都有一个隐藏属性(通常为 __proto__),这个隐藏属性储存着共有属性组成的对象的地址,这个共有属性组成的对象叫做原型(即隐藏属性储存着原型的地址)。原型也是一个对象,所以原型也有原型。

obj = {} 的原型为所有对象的原型,这个原型含有所有对象的共有属性,是对象的根。这个原型也有原型,是 null。原型对象可以减少内存的消耗(共有属性节省内存)。

let obj = {}
obj.toString()
// 不会报错,是因为 obj 的隐藏属性 __proto__ 对应的对象(即原型)上有 toString()

3. 对象属性的增删改查

3.1 删除属性

  • delete obj.name 或 dalete obj['name']:属性名和属性值都删除了
  • obj.name = undefined:仅删除了属性值

3.2 查看属性

  • obj['name'] 或 obj.name:查看 name 属性,name是字符串
  • 'name' in obj:判断 'name' 是否是 obj 的属性,不区别属性是自身的还是共有的
  • 'name' in obj && obj.anme === undefined:判断 obj 是否有属性 'name' 且属性值为 undefined
  • obj.hasOwnProperty('toString'):判断 toString 属是自身的还是共有的
  • Object.keys(obj):查看 obj 自身所有属性
  • Object.values(obj):查看 obj 自身所有属性的值
  • Object.entries(obj):查看 obj 自身所有属性名和属性值
let obj = {'name': 'lanny', 'age': 18}
Object.entries(obj);

Object.entries

  • console.dir(obj):查看自身和共有属性
  • obj.__proto__:查看共有属性

3.3 修改或增加属性

  • obj[name] = 'lanny':报错 obj is not defined。因为 name 变量不确定。
  • let key = 'name'; obj[key] = 'lanny':改为这样可以执行
  • obj['na'+'me'] = 'lanny':会先计算中括号内,obj['name'] = 'lanny'
  • Object.assign(obj, {'age': 18, 'gender': 'man'}):批量赋值
  • Object.prototype.toString = 'xxx':改共有属性 toString
  • obj.__proto__.toString = 'xxx':改共有属性 toString
  • obj.__proto__ = common:改原型
  • 所有__proto__代码都不推荐写

对象无法直接通过自身修改或增加共有属性。如 obj.toString = 'xxx' 只会在 obj 自身添加一个 toString 属性,共有属性 toString 未变化。

一般不要修改原型,会引起很多问题。如果一定要修改或增加原型上的属性,推荐采用以下方法:

let common = {kind: 'human'}
let obj = Object.create(common);
Object.assign(obj, {name: 'lanny', age: 18, gender: 'man'});

要改原型,建议一开始创建对象的时候就修改,不要后来再改。