您的位置:首页 > Web前端 > JavaScript

JS中对象常用方法及对象拷贝

2019-05-29 20:22 211 查看

在JS中,对象的常用方法有Object.assign、Object.create、Object.defineProperty、Object.keys、Object.values、Object.entries、hasOwnProperty、 Object.getOwnPropertyDescriptor、Object.getOwnPropertyDescriptors、Object.getOwnPropertyNames、Object.getPrototypeOf、isPrototypeOf、Object.is等

1.Object.assign(newobj,obj)是把obj的可枚举属性拷贝给newobj,参数可以多个;但这种拷贝只具有一层赋值,地址是发生改变的,但如果obj里还包括其他引用类型,则地址不变;

var obj = {
a: {
"name": 'Tom',
"age": 20
},
b: [1, 2, 3],
c: 666
};
var newobj = {};
Object.assign(newobj, obj);//把obj赋值给newobj,newobj的地址与obj的地址不同了
console.log(newobj);//newobj={a: {"name": 'Tom',"age": 20},b: [1, 2, 3],c: 666}
obj.d=521;
//给obj添加一个属性d:521
console.log(obj,newobj)//obj={a: {name: "Tom", age: 20},b: (3) [1, 2, 3],c: 666,d: 521 }      newobj依然是newobj={a: {"name": 'Tom',"age": 20},b: [1, 2, 3],c: 666}
obj.b.push(4)//给obj的b属性添加一个元素,则newobj.b也会改变
console.log(obj.b,newobj.b)//obj.b=[1,2,3,4]   newobj.b=[1,2,3,4] 也就是说obj与newobj的b属性地址还是一样的

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)

3.Object.defineProperty(obj,props)直接在一个对象上定义新的属性或修改现有属性,并返回该对象

var obj = {};
Object.defineProperty(obj,
{
'shuxing1': {
value: 1,  //value为属性值
writable: true ,//true可写的,false不可写
enumerable:true,//true可枚举的,false不可枚举
configurable:true,//true不可修改或者删除,false可修改
},
'shuxing2': {
value: 'Hello',
writable: false
}  /
});
console.log(obj)   // {property1: true, property2: "Hello"}

4.Object.keys(obj)返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)

var obj={a:1,b:2,c:3};
var arr=["a","b","c","d"];
console.log(Object.keys(obj));// 输出一个数组 ["a","b","c"]
console.log(Object.keys(arr));//数组也可以用这个方法,但输出的数组是对应的索引 [0,1,2,3]

5.Object.values(obj)方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )Object.values会过滤属性名为 Symbol 值的属性。用法基本与Object.keys(obj)一样

var obj1={a:1,b:2,c:3};
var obj2={c:3,b:2,a:1};
console.log(Object.keys(obj1));// 输出一个数组 ["1","2","3"],
console.log(Object.keys(obj2));//注意for-in的遍历顺序,输出一个数组["1","2","3"]

6.Object.entries(obj)返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)

var newobj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(newobj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

7.obj.hasOwnProperty() 判断对象自身属性中是否具有指定的属性,参数为属性名

var obj ={'a','b','c'}
console.log(obj.hasOwnProperty('name'))//obj中没有name属性返回false

8.Object.getOwnPropertyDescriptor(obj)返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性).如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。

var obj = {"name":'Tom',"age":20} ;
console.log(Object.getOwnPropertyDescriptor(obj))// undefined

9.Object.getOwnPropertyDescriptors(obj)获取一个对象所有自身属性的详细描述

var obj = {
name : 'js',
age : 20
}
console.log(Object.getOwnPropertyDescriptors(obj));

10.Object.getOwnPropertyNames()返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
11.Object.getOwnPropertySymbols()返回一个给定对象自身的所有 Symbol 属性的数组
12.Object.getPrototypeOf()返回指定对象的原型(内部[[Prototype]]属性的值,即__proto__,而非对象的prototype)

13.isPrototypeOf()判断一个对象是否存在于另一个对象的原型链上
14.Object.is(obj1,obj2)判断两个值是否相同。

如果下列任何一项成立,则两个值相同:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且
  • 都是正零 +0
  • 都是负零 -0
  • 都是 NaN
  • 都是除零和 NaN 外的其它同一个数字
    **

最后是浅拷贝和深拷贝

浅拷贝:引用类型直接赋值(地址不变)
深拷贝:引用类型内部值的复制,与地址无关

我们曾经封装过一个deepCopy方法用来深拷贝:

function deepCopy(obj){
if(Array.isArray(obj)){
var newobj=[];
}else{
var newobj={};
}
for(var i in obj){
if(typeof obj[i]=="object"){
newobj[i]=deepCopy(obj[i]);
}else{
newobj[i]=obj[i];
}
}
return newobj;
}
var obj={a:1,b:2,c:3};
var obj1=deepCopy(obj);//完成了对obj的拷贝,而且newobj与obj之间互不影响(深拷贝完成)

//我们还可以用一个JSON小技巧来完成深拷贝
var obja={a:[1,2,3],b:666};
var objb=JSON.parse(JSON.stringify(obja));

**

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: