属性的简洁表示法
const foo = 'bar'
const baz = {foo} // 等同于{foo:foo}
function getPoint(){
const x = 1
const y = 10
return {x,y}
}
getPoint() // {x:1,y:10}
const foo = 'bar'
const baz = {foo} // 等同于{foo:foo}
function getPoint(){
const x = 1
const y = 10
return {x,y}
}
getPoint() // {x:1,y:10}
属性名表达式
// 定义对象的两种方法
obj.foo = true // 标识符作为属性名
obj['a'+'bc'] = 123 // 表达式作为属性名
// ES6支持使用字面量方式定义对象的时候使用表达式作为对象的属性名
let propKey = 'foo'
let obj = {
[propKey]: true,
['a'+'bc']: 123
}
// 定义对象的两种方法
obj.foo = true // 标识符作为属性名
obj['a'+'bc'] = 123 // 表达式作为属性名
// ES6支持使用字面量方式定义对象的时候使用表达式作为对象的属性名
let propKey = 'foo'
let obj = {
[propKey]: true,
['a'+'bc']: 123
}
Object.is()
用来比较两个值是否严格相等,与运算符(===)基本一致,不同之处在于:+0
不等于-0
,NaN
等于自身
Object.is(+0,-0) // false
Object.is(NaN,NaN) // true
Object.is(+0,-0) // false
Object.is(NaN,NaN) // true
Object.assign()
用于对象的合并,将源对象的所有可枚举属性,复制到目标对象
const target = {a:1}
const source1 = {b:2}
const source2 = {c:3}
Object.assign(target,source1,source2)
target // {a:1,b:2,c:3}
typeof Object.assign(2) // 'object' 如果参数不是对象则会转成对象并返回
// undefined和null无法转成对象,直接报错
Object.assign(undefined) // 报错
Object.assign(null) // 报错
let obj = {a:1}
// 若是非源对象位置,则会跳过,不会报错
Object.assign(obj,undefined) === obj // true
Object.assign(obj,null) === obj // true
const target = {a:1}
const source1 = {b:2}
const source2 = {c:3}
Object.assign(target,source1,source2)
target // {a:1,b:2,c:3}
typeof Object.assign(2) // 'object' 如果参数不是对象则会转成对象并返回
// undefined和null无法转成对象,直接报错
Object.assign(undefined) // 报错
Object.assign(null) // 报错
let obj = {a:1}
// 若是非源对象位置,则会跳过,不会报错
Object.assign(obj,undefined) === obj // true
Object.assign(obj,null) === obj // true
常见用途
// 为对象添加属性
class Point {
constructor(x,y){
Object.assign(this,{x,y})
}
}
// 为对象添加方法
Object.assign(SomeClass.prototype,{
someMethod(arg1,arg2){...}
})
// 克隆对象
function clone(origin){
return Object.assign({},origin)
}
// 合并多个对象
const merge = (target,...sources) => Object.assign(target,...sources)
// 为属性指定默认值
const DEFAULTS = {
logLevel: 0,
outputFormat: 'html'
}
function processContent(options){
options.Object.assign({},DEFUALTS,options) // 用户提供参数options覆盖DEFAULTS中同名参数的属性值
}
// 为对象添加属性
class Point {
constructor(x,y){
Object.assign(this,{x,y})
}
}
// 为对象添加方法
Object.assign(SomeClass.prototype,{
someMethod(arg1,arg2){...}
})
// 克隆对象
function clone(origin){
return Object.assign({},origin)
}
// 合并多个对象
const merge = (target,...sources) => Object.assign(target,...sources)
// 为属性指定默认值
const DEFAULTS = {
logLevel: 0,
outputFormat: 'html'
}
function processContent(options){
options.Object.assign({},DEFUALTS,options) // 用户提供参数options覆盖DEFAULTS中同名参数的属性值
}
Object.setPrototypeOf()
用来设置一个对象的prototype
对象,返回参数对象本身
Object.setPrototypeOf(object,prototype) // 格式
let proto = {}
let obj = {x: 10}
Object.setPrototypeOf(obj,proto)
proto.y = 20
proto.z = 40
obj.x // 10
obj.y // 20
obj.z // 40
Object.setPrototypeOf(object,prototype) // 格式
let proto = {}
let obj = {x: 10}
Object.setPrototypeOf(obj,proto)
proto.y = 20
proto.z = 40
obj.x // 10
obj.y // 20
obj.z // 40
Object.getPrototypeOf()
与Object.setPrototypeOf
方法配套,用于读取一个对象的原型对象
Object.getPrototypeOf(obj) // 格式
Object.getPrototypeOf(obj) // 格式
super关键字
this
关键字总是指向函数所在的当前对象,ES6新增的关键字super
指向当前对象的原型对象
const proto = {
x: 'hello',
foo(){
console.log(this.x)
}
}
const obj = {
x: 'world',
foo(){
super.foo()
}
}
Object.setPrototypeOf(obj,proto)
obj.foo() // 'world'
const proto = {
x: 'hello',
foo(){
console.log(this.x)
}
}
const obj = {
x: 'world',
foo(){
super.foo()
}
}
Object.setPrototypeOf(obj,proto)
obj.foo() // 'world'
Object.keys()
ES5中引入的Object.keys
方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名
var obj = {foo:'bar',baz:412}
Object.keys(obj) // ['foo','baz']
var obj = {foo:'bar',baz:412}
Object.keys(obj) // ['foo','baz']
Object.values()
Object.values
方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值
const obj = {foo: 'bar',baz:42}
Object.values(obj) // ['bar',42]
const obj = {foo: 'bar',baz:42}
Object.values(obj) // ['bar',42]
Object.entries()
Object.entries
方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组
const obj = {foo:'bar',baz:42}
Object.entries(obj) // [['foo','bar'],['baz',42]]
const obj = {foo:'bar',baz:42}
Object.entries(obj) // [['foo','bar'],['baz',42]]
对象的拓展运算符
ES2017 将...
拓展运算符引入了对象
Null 传导运算符
读取对象内部某个属性时,往往要判断该对象是否存在该属性。
// 安全写法
const firstName = (message && message.body && message.body.user && message.body.user.firstName) || 'default'
// 引入传导运算符写法
const firstName = message?.body?.user?.firstName || 'default'
// 上面三个? 只要其中一个返回null或undefined 就不再继续运算 返回undefined
// 安全写法
const firstName = (message && message.body && message.body.user && message.body.user.firstName) || 'default'
// 引入传导运算符写法
const firstName = message?.body?.user?.firstName || 'default'
// 上面三个? 只要其中一个返回null或undefined 就不再继续运算 返回undefined
Null传导运算符的四种写法
-
obj?.prop
// 读取对象属性 -
obj?.[expr]
// 同上 -
func?.(...args)
// 函数或对象方法的调用 -
new C?.(...args)
// 构造函数的调用