ES6入门之对象的新增方法
栏目: JavaScript · 发布时间: 6年前
内容简介:# 1. Object.is()用来解决在ES5中 两种相等运算符的缺点。用来比较两个值是否严格相等,行为和(===)基本一致。在ES5中判断两个值是否相等,只能用(==)相等运算符和(===)严格相等运算符,但是这两货都有缺点,前者 两边的值都会转换数据类型,后者 NaN不等于自身还有 +0 == -0。
# 1. Object.is()
用来解决在ES5中 两种相等运算符的缺点。用来比较两个值是否严格相等,行为和(===)基本一致。
在ES5中判断两个值是否相等,只能用(==)相等运算符和(===)严格相等运算符,但是这两货都有缺点,前者 两边的值都会转换数据类型,后者 NaN不等于自身还有 +0 == -0。
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
复制代码
2. Object.assign()
用于对象的合并,将源对象的所有可枚举属性,复制到目标对象,现在常用来进行浅拷贝。
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
复制代码
其他(数值,字符串,布尔值)数值不再第一个也不会报错,但是字符串会以数组的形式被拷入目标对象,两外两个则不会做任何操作。
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值的属性也能被拷贝
注意点:
1. 浅拷贝
Object.assign 实现的是浅拷贝,也就是说如果源对象的某个属性值是对象,那么目标对象拷贝得到的是这个对象的引用
2. 同名属性的替换
如果遇到同名属性,那Object.assign的处理方法是替换还不是追加
3. 数组的处理
在处理数组的时候,Object.assign是将其是为对象来处理,如果下标相同则是覆盖而不是追加
Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3] 复制代码
4. 取值函数的处理
Object.assign 只能进行值的复制,如果复制的值是一个函数,那么就等函数求值执行完在进行值的复制
常见用途:
1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 复制代码
3. Object.getOwnPropertyDescriptors()
用来返回指定对象所有自身属性(非继承属性)的描述对象
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() 返回一个对象,所有原对象的属性名都是该
对象的属性名,对应的属性值就是该属性的描述对象。
复制代码
4. __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()
4.1. __proto__属性
用来读取或设置当前对象的prototype对象,另外这是一个内部属性。__proto__是调用的 Object.prototype. proto 方法
//es5 写法
const o = {
method: function() {}
}
o.__proto__ = someOtherObj
//es6 写法
var o = Object.create(someOtherObj)
o.method = function(){}
复制代码
4.2 Object.setPrototypeOf()
作用和 __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
复制代码
4.3 Object.getPrototypeOf()
用于读取一个对象的原型对象和Object.setPrototypeOf 配套使用。所有的特性也和 上面一样,第一个参数如果不是对象将转换为对象,undefined和null 会报错
5. Object.keys(),Object.values(),Object.entries()
5.1 Object.keys()
用于返回一个数组,成员的参数是对象自身的所有可遍历属性的键名
let obj = {
x: 1,
y: 'b'
}
Object.keys(obj)
// ["x", "y"]
复制代码
5.2 Object.values()
返回值是一个数组,成员是对象自身的(不含继承的)所有可遍历属性的值。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) [] 复制代码
5.3 Object.entries()
返回一个数组,成员是对象自身(不含继承的)所有可遍历属性的键值对数组,同样 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 }
复制代码
6. Object.fromEntries()
是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教程
以上所述就是小编给大家介绍的《ES6入门之对象的新增方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Black Box Society
Frank Pasquale / Harvard University Press / 2015-1-5 / USD 35.00
Every day, corporations are connecting the dots about our personal behavior—silently scrutinizing clues left behind by our work habits and Internet use. The data compiled and portraits created are inc......一起来看看 《The Black Box Society》 这本书的介绍吧!