Object 常用方法总结:
1.Object.assign(target,source1,source2,...)
该方法主要用于对象的合并, 将源对象 source 的所有可枚举属性合并到目标对象 target 上, 此方法只拷贝源对象的自身属性, 不拷贝继承的属性.
Object.assign 方法实行的是浅拷贝, 而不是深拷贝. 也就是说, 如果源对象某个属性的值是对象, 那么目标对象拷贝得到的是这个对象的引用. 同名属性会替换.
Object.assign 只能进行值的复制, 如果要复制的值是一个取值函数, 那么将求值后再复制.
Object.assign 可以用来处理数组, 但是会把数组视为对象.
- const target = { x : 0,y : 1};
- const source = { x : 1,z : 2 ,fn : {number : 1}};
- console.log(Object.assign(target, source));
- // target {x : 1, y : 1, z : 2, fn : {number : 1}} // 同名属性会被覆盖
- target.fn.number = 2;
- console.log(source)// source {x : 1, z : 2, fn : {number : 2}} // 拷贝为对象引用
- function Person(){
- this.name = 1
- };
- Person.prototype.country = 'china';
- var student = new Person();
- student.age = 29 ;
- const young = {name : 'zhang'};
- Object.assign(young,student);
- // young {name : 'zhang', age : 29} // 只能拷贝自身的属性, 不能拷贝 prototype
- Object.assign([1, 2, 3], [4, 5]) // 把数组当作对象来处理
- // [4, 5, 3]
- 2.Object.create(prototype,[propertiesObject])
使用指定的原型对象及其属性去创建一个新的对象
- var parent = { x : 1,y : 1}
- var child = Object.create(parent,{
- z : { // z 会成为创建对象的属性
- writable:true,
- configurable:true,
- value: "newAdd"
- }
- });
- console.log(child) //{z:"newAdd"}
- console.log(child.x) //1
- 3.Object.defineProperties(obj,props)
直接在一个对象上定义新的属性或修改现有属性, 并返回该对象.
- var obj = {};
- Object.defineProperties(obj, {
- 'property1': {
- value: true,
- writable: true
- },
- 'property2': {
- value: 'Hello',
- writable: false
- }
- });
- console.log(obj) // {property1: true, property2: "Hello"}
- 4.Object.defineProperty(obj,prop,descriptor)
在一个对象上定义一个新属性, 或者修改一个对象的现有属性, 并返回这个对象.
- Object.defineProperty(Object, 'is', {
- value: function(x, y) {
- if (x === y) {
- // 针对 + 0 不等于 -0 的情况
- return x !== 0 || 1 / x === 1 / y;
- }
- // 针对 NaN 的情况
- return x !== x && y !== y;
- },
- configurable: true,
- enumerable: false,
- writable: true
- });
- // 注意不能同时设置(writable,value) 和 get,set 方法, 否则浏览器会报错 : Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
- 5.Object.keys(obj)
返回一个由一个给定对象的自身可枚举属性组成的数组, 数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性).
- var arr = ["a", "b", "c"];
- console.log(Object.keys(arr));
- // ['0', '1', '2']
- /* Object 对象 */
- var obj = { foo: "bar", baz: 42 },
- keys = Object.keys(obj);
- console.log(keys);
- // ["foo","baz"]
- 6.Object.values()
方法返回一个给定对象自己的所有可枚举属性值的数组, 值的顺序与使用 for...in 循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 ).
Object.values 会过滤属性名为 Symbol 值的属性.
- var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
- console.log(Object.values(an_obj)); // ['b', 'c', 'a']
- var obj = { 0: 'a', 1: 'b', 2: 'c' };
- console.log(Object.values(obj)); // ['a', 'b', 'c']
- 7.Object.entries()
返回一个给定对象自身可枚举属性的键值对数组, 其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性).
- const obj = { foo: 'bar', baz: 42 };
- console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
- const simuArray = { 0: 'a', 1: 'b', 2: 'c' };
- console.log(Object.entries(simuArray)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]
- 8.hasOwnProperty()
判断对象自身属性中是否具有指定的属性.
- obj.hasOwnProperty('name')
- 9.Object.getOwnPropertyNames()
返回一个由指定对象的所有自身属性的属性名 (包括不可枚举属性但不包括 Symbol 值作为名称的属性) 组成的数组.
- var obj = { 0: "a", 1: "b", 2: "c"};
- Object.getOwnPropertyNames(obj).forEach(function(val) {
- console.log(val);
- });
- var obj = {
- x : 1,
- y : 2
- }
- Object.defineProperty(obj,'z',{
- enumerable : false
- })
- console.log(Object.getOwnPropertyNames(obj)) // ["x", "y", "z"] 包含不可枚举属性 .
- console.log(Object.keys(obj)) // ["x", "y"] 只包含可枚举属性 .
- 10.isPrototypeOf()
判断一个对象是否存在于另一个对象的原型链上.
11.Object.setPrototypeOf(obj,prototype)
设置对象的原型对象
12.Object.is()
判断两个值是否相同.
如果下列任何一项成立, 则两个值相同:
两个值都是 undefined
两个值都是 null
两个值都是 true 或者都是 false
两个值是由相同个数的字符按照相同的顺序组成的字符串
两个值指向同一个对象
两个值都是数字并且
都是正零 +0
都是负零 -0
都是 NaN
都是除零和 NaN 外的其它同一个数字
- Object.is('foo', 'foo'); // true
- Object.is(window, window); // true
- Object.is('foo', 'bar'); // false
- Object.is([], []); // false
- var test = { a: 1 };
- Object.is(test, test); // true
- Object.is(null, null); // true
- // 特例
- Object.is(0, -0); // false
- Object.is(-0, -0); // true
- Object.is(NaN, 0/0); // true
- 13.Object.freeze()
冻结一个对象, 冻结指的是不能向这个对象添加新的属性, 不能修改其已有属性的值, 不能删除已有属性, 以及不能修改该对象已有属性的可枚举性, 可配置性, 可写性. 也就是说, 这个对象永远是不可变的. 该方法返回被冻结的对象.
- var obj = {
- prop: function() {},
- foo: 'bar'
- };
- // 新的属性会被添加, 已存在的属性可能
- // 会被修改或移除
- obj.foo = 'baz';
- obj.lumpy = 'woof';
- delete obj.prop;
- // 作为参数传递的对象与返回的对象都被冻结
- // 所以不必保存返回的对象(因为两个对象全等)
- var o = Object.freeze(obj);
- o === obj; // true
- Object.isFrozen(obj); // === true
- // 现在任何改变都会失效
- obj.foo = 'quux'; // 静默地不做任何事
- // 静默地不添加此属性
- obj.quaxxor = 'the friendly duck';
- console.log(obj)
- 14.Object.isFrozen()
判断一个对象是否被冻结 .
15.Object.preventExtensions()
对象不能再添加新的属性. 可修改, 删除现有属性, 不能添加新属性.
- var obj = {
- name :'lilei',
- age : 30 ,
- sex : 'male'
- }
- obj = Object.preventExtensions(obj);
- console.log(obj); // {name: "lilei", age: 30, sex: "male"}
- obj.name = 'haha';
- console.log(obj) // {name: "haha", age: 30, sex: "male"}
- delete obj.sex ;
- console.log(obj); // {name: "haha", age: 30}
- obj.address = 'china';
- console.log(obj) // {name: "haha", age: 30}
参考连接: https://www.cnblogs.com/mopagunda/p/8328084.html
来源: http://www.bubuko.com/infodetail-2635876.html