用来解决在ES5中 两种相等运算符的缺点。用来比较两个值是否严格相等,行为和(===)基本一致。前端
在ES5中判断两个值是否相等,只能用(==)相等运算符和(===)严格相等运算符,可是这两货都有缺点,前者 两边的值都会转换数据类型,后者 NaN不等于自身还有 +0 == -0。es6
Object.is('foo', 'foo') // true
Object.is({}, {}) // false
// 在 Object.is()
+0 === -0 // true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
复制代码
用于对象的合并,将源对象的全部可枚举属性,复制到目标对象,如今经常使用来进行浅拷贝。segmentfault
const t = {a: 1}
const s1 = {b: 2}
const s2= {c: 3}
Object.assign(t, s2, s2)
// t {a:1, b:2, c:3}
// 在上面中第一个参数t是目标对象,s1 s2是源对象
复制代码
注意:若是目标对象和源对象有同名属性,或者多个同名,那么在后面的属性会将前面的覆盖。数组
const t = {a: 1, b: 2}
const s1 = {b: 3, c: 4}
const s2 = {c: 5}
Object.assign(t, s1, s2)
t // {a:1, b:3, c:5}
复制代码
若是Object.assign的参数只有一个,那么就返回该参数,另外若是该参数不是对象,那么Object.assign会将其转为对象在返回数据结构
const t = {a: 2}
Object.assign(t)
t // {a: 2}
Object.assigin(2)
// "object"
复制代码
另外因为null 和 undefined 没法转换位对象,那么若是他们做为第一个参数就会报错,若是不是在第一个参数则不会有这个问题函数
Object.assign(undefined) // 报错
Object.assign(null) //报错
这样就不会报错:以下
const t = {a: 2}
Object.assign(t, undefined) // true
Object.assign(t, null) // true
复制代码
其余(数值,字符串,布尔值)数值再也不第一个也不会报错,可是字符串会以数组的形式被拷入目标对象,两外两个则不会作任何操做。post
const a = 'abc'
const b = true
const c = 12
const o = Object.assign({}, a, b, c)
o // {"0": "a", "1": "b", "2": "c"}
// 由于布尔值number 的原始值都在对象的内部属性[[PrimitiveValue]]
上面,这个属性不能别Object.assign拷贝
复制代码
Obeject.assign 拷贝的属性是有限制的,只能拷贝源对象的自身属性,也不能拷贝不可枚举的属性,另外 Symbol值的属性也能被拷贝es5
Object.assign 实现的是浅拷贝,也就是说若是源对象的某个属性值是对象,那么目标对象拷贝获得的是这个对象的引用spa
若是遇到同名属性,那Object.assign的处理方法是替换还不是追加prototype
在处理数组的时候,Object.assign是将其是为对象来处理,若是下标相同则是覆盖而不是追加
Object.assign([1, 2, 3], [4, 5])
// [4, 5, 3]
复制代码
Object.assign 只能进行值的复制,若是复制的值是一个函数,那么就等函数求值执行完在进行值的复制
1. 为对象添加属性
2. 为对象添加方法
3. 克隆对象
4. 合并多个对象
5. 为属性指定默认值
复制代码
用来返回指定对象全部自身属性(非继承属性)的描述对象
const o = {
left: 123,
top() {
return 'new'
}
}
Object.getOwnPropertyDescriptors(o)
// {
left:{
configurable: true
enumerable: true
value: 123
writable: true
},
top: {
configurable: true
enumerable: true
value: ƒ top()
writable: true
}
}
Object.getOwnPropertyDescriptors() 返回一个对象,全部原对象的属性名都是该
对象的属性名,对应的属性值就是该属性的描述对象。
复制代码
用来读取或设置当前对象的prototype对象,另外这是一个内部属性。__proto__是调用的 Object.prototype.proto 方法
//es5 写法
const o = {
method: function() {}
}
o.__proto__ = someOtherObj
//es6 写法
var o = Object.create(someOtherObj)
o.method = function(){}
复制代码
做用和 __proto__相同,用来设置一个对象的prototype对象,返回参数自己
// 格式
Object.setPrototypeOf(object, prototype)
// 用法
const o = Object.setPrototypeOf({}, null)
=== 如下写法
function setPrototyoeOf(obj, proto) {
obj.__proto__ = proto
return obj
}
// 例子
let proto = {}
let o = {
x: 10
}
Object.setPrototypeOf(o, proto)
proto.y = 20
proto.z = 40
o.x // 10
o.y // 20
o.z // 40
// 上面 将proto设为 o 对象的原型,因此能够从o 中读取proto 的属性
复制代码
注意:若是第一参数不是对象,将自动转换为对象,因为返回的仍是第一个参数,因此这个操做不会产生任何效果,另外因为 undefined 和 null 没法转换为对象,因此第一个参数若是是这两个则会报错
Object.setPrototypeOf(1, {}) === 1 // true
Object.setPrototypeOf('foo', {}) === 'foo' // true
Object.setPrototypeOf(true, {}) === true // true
Object.setPrototypeOf(undefined, {})
// TypeError: Object.setPrototypeOf called on null or undefined
Object.setPrototypeOf(null, {})
// TypeError: Object.setPrototypeOf called on null or undefined
复制代码
用于读取一个对象的原型对象和Object.setPrototypeOf 配套使用。全部的特性也和 上面同样,第一个参数若是不是对象将转换为对象,undefined和null 会报错
用于返回一个数组,成员的参数是对象自身的全部可遍历属性的键名
let obj = {
x: 1,
y: 'b'
}
Object.keys(obj)
// ["x", "y"]
复制代码
返回值是一个数组,成员是对象自身的(不含继承的)全部可遍历属性的值。Objet.values只返回对象自身的可遍历属性。
let obj = {
x: 1,
y: 'b'
}
Object.keys(obj)
// [1, "b"]
复制代码
另外Object.values遍历的时候若是遇到属性名为数值的属性,那么将按照数值大小,从小到大遍历,以下:
const obj = { 100: 'a', 2: 'b', 7: 'c' };
Object.values(obj)
// ["b", "c", "a"]
复制代码
注意:Object.values 会过滤属性名为 Symbol的属性
Object.values({ [Symbol()]: 123, foo: 'abc' });
// ['abc']
复制代码
若是Object.values的参数是一个字符串 那么将返回字符串拆解的数组
Object.values('symbol')
["s", "y", "m", "b", "o", "l"]
复制代码
注意: 若是Object.values 的参数为boolean值或者number,那么返回值是一个空数组,
Object.values(true)
[]
Object.values(2,null)
[]
复制代码
返回一个数组,成员是对象自身(不含继承的)全部可遍历属性的键值对数组,一样 Symbol 属性的值会被过滤。
const p = { f: 'b', az: 22 };
Object.entries(p)
// [ ["f", "b"], ["az", 22] ]
Object.entries({ [Symbol()]: 456, o: 'c' });
// [ [ 'o', 'c'] ]
复制代码
Object.entries 能够用来遍历对象的属性
Object.entries 将对象转为真正的Map结构
const obj = { foo: 'bar', baz: 42 };
const map = new Map(Object.entries(obj));
map // Map { foo: "bar", baz: 42 }
复制代码
是Object.entries 的逆操做,将一个键值对数组转为对象。主要是将键值对的数据结构还原为对象,适用于将Map结构转为对象
Object.fromEntries([
['foo', 'bar'],
['baz', 42]
])
// { foo: "bar", baz: 42 }
// 例二 将Map结构转为对象
const map = new Map().set('foo', true).set('bar', false);
Object.fromEntries(map)
// { foo: true, bar: false }
复制代码
欢迎关注 公众号【小夭同窗】
ES6入门系列
Git教程