对象

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

对象的学习可以概括为增、删、改、查。

如何创建对象?

  1. 使用字面量("{}"
let obj = { name: 'zhangsan', age: 18 }
  1. new Object()
let obj = new Object({'name':'张三','age':18})

注意:对象内的键名是字符串,可以是任意字符,它不是标识符(关于标识符的内容可以看这里)。键名的字符串引号可以省略,但是省略后就要遵守标识符规则了。但是就算引号省略了,键名还是字符串,这是一定的。

知道了键名一定是字符串,现在来看看一些特殊的地方。如果我们在创建对象的时候给键名加上了引号,那么里面的内容数字有多长都不会影响最终结果

如何创建对象图1

那要是在写的时候不在键名上加上引号呢?会发生什么?

如何创建对象图2

正如图中显示的,没有加上引号的键名会被优化成科学计数法的方式来显示。为了不让产生非预期结果,在创建对象时,键名最好加上引号。

使用常量做键名已经了解了,那变量是否可以用作键名呢?答案是可以的。

let person = 'xm'
let obj = { person: 'xiaoming', age: 18 } // person就是属性名,虽然没写引号,但它就是字符串
let obj1 = { [person]: 'xiaoming', age: 18 } // [person]的值才是属性名

如何创建对象图3

如何删除对象的属性

使用关键字delete

通过在中的查找对象属性的方法可以以不同方式去删除对象中的特定属性和对应的属性值。

let obj = { name: 'zhangsan', age: 18 }
delete obj['name']

如何查看对象的属性

使用 Object.keys()方法可以查询到一个对象中的所有键的集合。

let obj = {'name':'zhangsan','age':18}
Object.keys(obj)

有三种方式可以查看某个键名对应的值:

  • obj[‘key’]:括号内是字符串,加了引号的。
  • obj.key:使用点的方式,key 虽然没有加引号,但它就是字符串。
  • obj[key]:这种方式是需要注意的,key 是变量。

通过 in 关键字和 obj.hasOwnProperty(keyname)可以知道某个键名是否存在于这个对象中。

如何修改或增加对象的属性

要对对象进行修改或是增加属性时,如果对象内有要被修改的键名,那么就是修改,没有要被修改的键名,那会被自动添加到对象内。

要修改那么就要需要查,通过“查”中的方式找到这个属性即可开始修改。obj[‘key’]查询方式中的字符串还可以使用字符串拼接来拼接成一个键名字符串,即obj['k'+'ey']

在 es6 中提供了新的方法Object.assign()可以快速将一个对象值赋值到某个对象内。

let obj
Object.assign(obj, { name: 'zhangsan', age: 18 })

某些情况下还想修改到共有属性,怎么办呢?

首先要知道无法通过自身去修改或增加共有属性的。如上面所说,如果对象内没有某个属性,我们直接给这个属性赋值,那么会为这个对象增加一个键值对,它并不会影响到其他对象的共有属性。比如修改 obj.toString = 'newKey',本身 obj 没有 toString 这个属性,我们这么写了,那么就会新增这个属性,原来的共有属性未发生变化。

对象修改图1

想要修改共有属性并影响到所有其他对象,那么需要操作Object.prototype.toString才行。(属性查找规则是先看对象自身有没有这个属性,没有就去原型对象上找,没有就继续向上找,直到 null)

注意:不要去操作对象上的__proto__,尽管它指向构造函数的原型对象。要修改公共方法操作的是构造函数中的原型对象(prototype)。

想要修改对象中的隐藏属性proto,推荐使用 Object.create() let obj = Object.create(obj2)

更多

上面有说到'name' in obj和obj.hasOwnProperty('name')那它们的区别是什么呢?

in 关键字是查找 obj 对象以及 obj 对象的原型对象内是否含有'name'

hasOwnProperty方法是仅查找对象自身是否包含'name'属性。