JS中对象常用方法及对象拷贝
在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));
**
- js数组对象常用方法小结
- JS中String对象常用的方法
- js克隆对象、数组的常用方法【clone】
- js数组Array对象常用方法总结
- js字符串,数组,对象,正则,canvas,json常用方法
- js中String常用方法详解及String对象方法扩展
- JS数组、对象常用方法
- JS常用对象跟方法
- 原生 JS DOM对象 & JQuery对象 常用属性及方法对比(图)
- JS中 Object 对象常用方法
- js常用内置方法和对象
- JS中常用操作技巧(页面动态增加div,contain方法扩展,JSON对象鱼字符串转换)
- js基础之DOM中document对象的常用属性方法详解
- 强化基础-JS对象中数组常用的属性和方法
- js 数组常用方法,数组的拷贝(不影响原数组),数组相等
- JS中创建对象的几种常用方法
- js对象深拷贝的方法
- 【JS】window对象常用属性和方法
- 对象(Object)常用方法、对象拷贝
- 原生js深入理解系列(四)--- 多个实例深入理解js的深拷贝和浅拷贝,多种方法实现对象的深拷贝