[仅个人学习使用,文章有引用借鉴别人的部分]
JS对象操作方法
1、Object.assign(复制)
方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target,source);
// target 会发生改变 source 不会发生改变
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
2、Object.create(创建一个新对象)
方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
const person = {
isHuman: false,
printIntroduction: function () {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};
const me = Object.create(person);
me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten
me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"
3、Object.defineProperties(定义、修改属性)
方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
语法 Object.defineProperties(obj, props) obj在其上定义或修改属性的对象。 props要定义其可枚举属性或修改的属性描述符的对象。 对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty())。 描述符具有以下键:configurabletrue 当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。 默认为 falseenumerabletrue 当且仅当在枚举相应对象上的属性时该属性显现。 默认为 falsevalue与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。 默认为 undefined.writabletrue当且仅当与该属性相关联的值可以用assignment operator改变时。 默认为 falseget作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。 默认为 undefinedset作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。 默认为 undefined返回值节 传递给函数的对象。
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
// etc. etc.
});
console.log('defineProperties',obj)
console.log('defineProperties')
4、Object.defineProperty(定义、修改属性)
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 语法 Object.defineProperty(obj, prop, descriptor) obj要在其上定义属性的对象。 prop要定义或修改的属性的名称。descriptor将被定义或修改的属性描述符。 返回值节被传递给函数的对象。 在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同, 而Object.defineProperty 是定义key为Symbol的属性的方法之一。
5、Object.entries(枚举)
方法返回一个给定对象自身可枚举属性的键值对数组, 其排列与使用 for…in 循环遍历该对象时返回的顺序一致 (区别在于 for-in循环也枚举原型链中的属性)
const object1 = { foo: 'bar', baz: 42 };
console.log(Object.entries(object1)[1]);
// expected output: Array ["baz", 42]
const object2 = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(object2)[2]);
// expected output: Array ["2", "c"]
const result = Object.entries(object2).sort((a, b) => a - b);
console.log('result',result);
console.log(Object.entries(result)[1]);
6、Object.freeze(冻结一个对象)
方法可以冻结一个对象。 一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,
不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。
此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
const object_freeze_1 = {
property1: 42
};
const object_freeze_2 = Object.freeze(object_freeze_1);
object_freeze_2.property1 = 33;
// Throws an error in strict mode 在严格模式下抛出错误
console.log(object_freeze_2.property1);
// expected output: 42 预期产量:42
7、Object.fromEntries(转换)
把键值对列表转换为一个对象。 Map 转化为 Object
//通过 Object.fromEntries, 可以将 Map 转化为 Object:
const map_fromEntries = new Map([ ['foo', 'bar'], ['baz', 42] ]);
const obj_fromEntries = Object.fromEntries(map_fromEntries);
console.log(obj); // { foo: "bar", baz: 42 }
// Array 转化为 Object
// 通过 Object.fromEntries, 可以将 Array 转化为 Object:
const arr_fromEntries_1 = [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ];
const obj_fromEntries_1 = Object.fromEntries(arr_fromEntries_1);
console.log(obj_fromEntries_1); // { 0: "a", 1: "b", 2: "c" }
// 对象转换为Object
// Object.fromEntries 是 Object.entries() 的反转函数, 借用 array manipulation methods 可以转换对象,如下:
const object_fromEntries_1 = { a: 1, b: 2, c: 3 };
const object_fromEntries_2 = Object.fromEntries(
Object.entries(object_fromEntries_1)
.map(([ key, val ]) => [ key, val * 2 ])
);
console.log(object_fromEntries_2);
// { a: 2, b: 4, c: 6 }
8、Object.is(判断)
方法判断两个值是否是相同的值
Object.is('foo', 'foo'); // true
Object.is(window, window); // true
Object.is('foo', 'bar'); // false
Object.is([], []); // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(null, null); // true
// 特例
Object.is(0, -0); // false
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true
9、Object.isFrozen(判断冻结)
方法判断一个对象是否被冻结
使用Object.freeze是冻结一个对象最方便的方法.
var frozen = { 1: 81 };
Object.isFrozen(frozen) //=== false
Object.freeze(frozen);
Object.isFrozen(frozen) //=== true
// 一个冻结对象也是一个密封对象.
Object.isSealed(frozen) //=== true
// 当然,更是一个不可扩展的对象.
Object.isExtensible(frozen) //=== false
// 在 ES5 中,如果参数不是一个对象类型,将抛出一个TypeError异常。在 ES2015 中,非对象参数将被视为一个冻结的普通对象,因此会返回true。
Object.isFrozen(1);
// TypeError: 1 is not an object (ES5 code) TypeError:1不是对象(ES5代码)
Object.isFrozen(1);
// true (ES2015 code)
10、Object.keys(枚举)
方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致
。
// simple array 简单数组
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
// array like object 类数组对象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']
// array like object with random key ordering 具有随机键序的类数组对象
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']
// getFoo is a property which isn't enumerable getFoo是一个不可枚举的属性
var myObj = Object.create({}, {
getFoo: {
value: function () { return this.foo; }
}
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']
11、Object.values(枚举)
方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同 ( 区别在于 for-in
循环枚举原型链中的属性 )。
var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
// array like object 类数组对象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
// array like object with random key ordering 具有随机键序的类数组对象
// when we use numeric keys, the value returned in a numerical order according to the keys 当我们使用数字键时,根据键以数字顺序返回的值
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']
// getFoo is property which isn't enumerable getFoo是不可枚举的属性
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = 'bar';
console.log(Object.values(my_obj)); // ['bar']
// non-object argument will be coerced to an object 非对象参数将强制为对象