咱们都知道,对象通常是类的实例,如 Java,Python 等这类面向对象语言,而 JavaScript 中没有类,所以 JavaScript 中的对象不是类的实例,而是基于原型的对象。es6
JavaScript 中的对象 Object 是 7 种内置类型(number, string, null, undefined, boolean, object, symbol)之一,是由 key 和 value 组成,value 能够是任意数据类型。数组
JavaScript 能够用 声明形式 和 构造形式 的方式建立对象函数
let obj = {
name: 'Jon',
age: 18,
say: () => {
console.log('hello')
}
}
复制代码
这种方式建立的对象须要注意点是,按照命名规范命名的 key 加不加引号均可以,不符合命名规范的 key 要加引号,如:ui
let obj = {
'first_name': 'Jon',
}
复制代码
let obj = new Object()
obj.name = 'Jon'
obj.age = 18
obj.say = () => {
console.log('hello')
}
复制代码
给构造器生成的对象添加属性须要一个一个添加this
访问一个对象的属性值能够经过 . 操做符 和 [] 操做符 进行访问,举个粟子:spa
. 操做符:要求属性名知足标识符的命名规范code
[] 操做符:能够接受任意 UTF-8/Unicode 字符串做为属性名对象
let obj = {
'first_name': 'Jon',
age: 18,
say: () => {
console.log('hello')
}
}
obj.age // 经过 .运算符 访问,18
obj['age'] // 经过 []操做符 访问,18
obj['first_name'] // 经过 []操做符 访问,Jon
复制代码
let person = {
_age: 18,
get age () {
return this._age
}
}
person.age // Jon's age: 18
复制代码
let play = {
game: [],
set current (name) {
this.game.push(name)
}
}
play.current = 'dota2'
play.game // ['dota2']
复制代码
涉及 getter 和 setter 的 Object.create()、object.defineProperty()、object.defineProperties() 后待补充继承
let name = 'Jon'
let person = {name}
// 等同于
let person = {name: name}
复制代码
let person = {
say () {
console.log('hello')
}
}
// 等同于
let person = {
say: function () {
console.log('hello')
}
}
复制代码
属性,方法名,getter 和 setter 都支持ip
let firstName = 'first name'
let age = 'age'
let current = 'current'
let person = {
[firstName] : 'Jon',
get [age] () {
return 18
},
set [current] (name) {
this[firstName] = name
}
}
person['first name'] // 'Jon'
person.age // 18
person.current = 'karon'
person['first name'] // 'karon'
复制代码
注意:属性表达式和简写不能同时使用,好比:
let firstName = 'first name'
// 报错
let person = {
[firstName]
}
复制代码
ES6 一共有 5 种方法能够遍历对象的属性。
for...in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
Object.keys(obj) 返回一个数组,包括对象自身的(不含继承的)全部可枚举属性(不含 Symbol 属性)的键名。
Object.getOwnPropertyNames(obj) 返回一个数组,包含对象自身的全部属性(不含 Symbol 属性,可是包括不可枚举属性)的键名。
Object.getOwnPropertySymbols(obj) 返回一个数组,包含对象自身的全部 Symbol 属性的键名。
Reflect.ownKeys(obj) 返回一个数组,包含对象自身的全部键名,无论键名是 Symbol 或字符串,也无论是否可枚举。
以上的 5 种方法遍历对象的键名,都遵照一样的属性遍历的次序规则。
首先遍历全部数值键,按照数值升序排列。 其次遍历全部字符串键,按照加入时间升序排列。 最后遍历全部 Symbol 键,按照加入时间升序排列。
let person = {
name: 'Jon',
age: 18,
say () {
console.log('hello')
}
}
let {name, age, say} = person
复制代码
要求等号右边必须是一个对象,不然会报错,如:
let {a} = undefined // 报错
let {a} = null // 报错
复制代码
并无拷贝到原型对象上的属性
let name = {name: 'Jon'}
let person = {age: 18}
person.__proto__ = name
let {...a} = person
a.name // undefined
复制代码
若是属性对象,只是拷贝引用
let person = { habit: {name: 'play game' }}
let {...a} = person
person.habit.name = 'study'
a.habit.name // study
复制代码
展开
let obj = {
name: 'Jon',
age: 18
}
let person = {...obj}
person // { name: 'Jon', age: 18 }
复制代码
利用展开能够用来合并对象
let gift = { skill: 'faster' }
let person = {
name: 'barry'
}
let flash = {...person, ...gift}
flash // {name: 'barry', skill: 'faster'}
复制代码
【es6】Object.is(..)
比较两个值是否相同,与 === 严格比较的区别在 +0 与-0,NaN 与 NaN
+0 === -0 // true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
复制代码
【es6】Object.assign(..)
对象合并,将后面的对象的属性复制给第一个参数,也就是目标对象,需注意:可复制的属性为自身属性和可枚举的属性,继承而来的属性没法被复制,若是是相同属性,后面的会覆盖前面的,举个栗子:
let person = { name: 'barry', skill: 'run' }
let superSkill = {skill: 'flash'}
Object.assign({}, person, superSkill) // {name: 'barry', skill: 'flash'}
复制代码
也能够用来处理数组,以下,b 把 a 引索为 0 和 1 的覆盖了
let a = [1, 2, 3]
let b = [4, 5]
Object.assign([], a, b) // [4, 5, 3]
复制代码
【es6】Object.keys(..)
遍历自身属性,不含继承属性和 Symbol 属性
let person = { name: 'barry', skill: 'run', [Symbol('skill')]: 'run flash'}
Object.keys(person) // ['name', 'skill']
复制代码
【es6】Object.getOwnPropertySymbols(..)
let person = {
[Symbol('skill')]: 'run flash'
}
Object.getOwnPropertySymbols(person) // [Symbol(skill)]
复制代码
【es7】Object.values(..)
遍历自身属性,不含继承属性和 Symbol 属性
let person = { name: 'barry', skill: 'run', [Symbol('skill')]: 'run flash'}
Object.values(person) // ['barry', 'run']
复制代码
【es7】Object.entries(..)
遍历自身属性,不含继承属性和 Symbol 属性
let person = { name: 'barry', skill: 'run', [Symbol('skill')]: 'run flash'}
Object.entries(person) // [['name', 'barry'], ['skill', 'run']]
复制代码
将对象转为 Map 对象:
let person = { name: 'barry', skill: 'run', [Symbol('skill')]: 'run flash'}
let personArr = Object.entries(person) // [['name', 'barry'], ['skill', 'run']]
let personMap = new Map(personArr) // Map { name: 'barry', skill: 'run' }
复制代码
【es7】Object.fromEntries(..)
为 Object.entries()的逆操做,用于将一个键值对数组转为对象。
let person = [['name', 'barry'], ['skill', 'run']]
Object.fromEntries(person) // { name: 'barry', skill: 'run' }
复制代码
【es7】Object.getOwnPropertyDescriptors(..) 获取对象全部自身的属性描述符
let barry = { name: 'barry', skill: 'run' }
Object.getOwnPropertyDescriptors(barry)
/* { name: { value: "barry", configurable: true, enumerable: true, writable: true }, skill: { value: "run", configurable: true, enumerable: true, writable: true } } */
复制代码
对应的有:【ES5】的 Object.getOwnPropertyDescriptor(..)