1.取值函数,存值函数
const obj = {
get foo(){},
set foo(x){}
}
const descriptor = Object.getOwnPropertyDescriptor(obj,'foo');
console.log(descriptor.get.name,descriptor.set.name);
2.Object.is()
ES5比较相等只用两个运算符"=="和"==="
前者会自动转换数据类型
后者NaN不等于NaN,以及+0等于-0
ES6提出了同值相等算法
console.log(Object.is(+0,-0),(+0 === -0),Object.is(NaN,NaN),(NaN === NaN));
3.Object.assign()
用于将源对象的所有可枚举属性复制到目标对象
PS:
1.只复制源数据的自身属性(不包括继承的属性)
2.也不复制不可枚举的属性(emumerable:false)
3.实行的是浅复制
let target = {a : 1},
source1 = {b : 2},
source2 = {c : 3}
console.log(Object.assign(target,source1,source2),target);
4.对象的引用
let tar1 = {
a:{
b : 'c',
d : 'e'
}},
sou1 = {
a:{
b : 'hello'
}
};
console.info(Object.assign(tar1,sou1));
常见用途:
1.为对象添加属性
2.为对象添加方法
3.克隆对象
4.合并多个对象
5.为属性指定默认值
class Point{
constructor(x,y){
Object.assign(this,{x,y});
}
}
Object.assign(SomeClass.prototype,{
someMethod(arg1,arg2){
...
},
anothorMethod(...args){
...
}
});
function clone(origin){
let originProto = Object.getPrototypeOf(origin);
return Object.assign(Object.create(originProto),origin);
}
const merge1 = (target,...sources) => Object.assign(target,...sources);
const merge2 = (...sources) => Object.assign({},...sources);
描述对象的enumerable 属性称为“ 可枚举性 ”
如果该属性为false, 就表示某些操作会忽略当前属性。
ESS有3 个操作会忽略enumerable为false的属性。
1.for ... in循环: 只遍历对象自身的和继承的可枚举属性。
2.Object. keys (): 返回对象自身的所有可枚举属性的键名。
3.JSON. stringify (): 只串行化对象自身的可枚举属性。
5.属性的遍历
for...in
Object.keys(obj)
Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols(obj)
Reflect.ownKeys(obj)
6.__proto__属性
let obj = Object.create(someOtherObj);
obj.method = function(){...};
let obj = {
method : function(){...};
};
obj.__proto__ = someOtherObj;
let proto = {};
let obj = { x : 10 };
Object.setPrototypeOf(obj,proto);
proto.y = 20;
proto.z = 40;
console.log(obj.x,obj.y,obj.z,obj.__proto__);
7.Object.keys() Object.values() Object.entries()
let { keys,values,entries } = Object;
let obj1 = {'a' : 1,'b' : '3','c' : 2};
for(key of keys(obj1)){
console.log(key);
}
for(value of values(obj1)){
console.log(value);
}
for(entry of entries(obj1)){
console.log(entry);
}
let obj2 = { foo : 'bar',baz : 42 };
let map1 = new Map(entries(obj2));
console.log(map1)
let arr1 = [1,2,3,4,5];
for(let i in arr1){
console.log(arr1[i])
}
for(let i of arr1){
console.log(i)
}
8.Object.getOwnPropertyDescriptors()
console.log("ES5",Object.getOwnPropertyDescriptor(obj2,'foo'));
console.log("ES6",Object.getOwnPropertyDescriptors(obj2,));
9.Null传导运算符 ?.
const firstName = (message
&& message.body
&& message.body.user
&& message.body.user.firstName) || 'default';
const firstName = message?.body?.user?.firstName || 'default';