对象作为引用类型,工作中免不了复制对象,下面来看看克隆的方法
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。浅克隆:
const obj1 = { a: 1, b: 2, title: { name: '张三' }};const obj2 = Object.assign({}, obj1);console.log(obj2); //{ a: 1, b: 2 ,title:{name:'张三'}}obj1.title.name = '李四'; //修改obj1的值,再来打印看下obj2的值console.log(obj2) //{ a: 1, b: 2,title:{name:'李四'} }console.log(obj1) //{ a: 1, b: 2,title:{name:'李四'} }
Object深克隆的一种方式,主要方式是把对象转为JSON字符串,然后再转为对象
var cloneObj = JSON.parse(JSON.stringify(obj));
对象中有冻结,扩展,密封三大属性,freeze,seal,preventExtensions,来看看3个属性的区别
Object.freeze(obj) 方法可以冻结一个对象,不能修改,新增,删除任何属性和值
let freeze1 = { a: '1'};let freeze2 = Object.freeze(freeze1);freeze2.a = 2;console.log(freeze2) //1
Object.isFrozen(obj) 方法判断对象是否被冻结
console.log(Object.isFrozen(freeze2)) //true
Object.seal(obj) 方法封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。
let seal = {};Object.seal(seal); //封闭对象
Object.isSealed(obj) 方法判断一个对象是否被密封。
console.log(Object.isSealed({}), '------'); //falseconsole.log(Object.isSealed(seal), '------'); //true
Object.preventExtensions(obj) 方法让一个对象变的不可扩展,也就是永远不能再添加新的
Object.isExtensible(obj) 法判断一个对象是否是可扩展的是否可以在它上面添加新的属性。
对象可枚举属性和不可枚举属性,一直傻傻分不清,在javascript中,对象的属性氛围可枚举和不可枚举之分,属性的枚举性主要影响一下三个函数的结果,
for ...in Object.keys()JSON.stringify()
先看一个例子,创建一个对象
function Person() { this.name = 'KEY'}Person.prototype = { constructr: Person, jos: 'student'};var key = new Person();Object.defineProperty(key, 'sex', { value: 'female'})console.log(key.sex, '------') //female ------ 直接访问可以获取的key.sexfor (var pro in key) { //遍历无法打印不可枚举对象 console.log('pro:' + pro + ';' + key[pro])} pro:name;KEY pro:constructr;function Person(){ this.name='KEY' } pro:jos;student
obj.propertyIsEnumerable(prop) 方法返回一个布尔值,表示指定的属性是否可枚举
console.log(Number.propertyIsEnumerable('parseint')) //false
Object.defineProperties();方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
Object.defineProperties(obj, props) *obj 为源对象*props是一个对象,里面有configurable,enumerable,value,writable,get,set*configurable 属性描述符的类型可以被改变并且该属性可以从对应对象中删除。默认false*enumerable 是否为枚举属性 默认为false*value 任意值,默认undefined*writable 可以通过赋值改变 默认false*get 返回value值,默认undefinde*set 设置value值,默认undefinevar defind = {};Object.defineProperties(defind, { 'v1': { value: '12' }});console.log(defind.v1) //12
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
Object.defineProperty(obj,name, prop) *obj 为源对象 name为修改的属性名或设置,prop同上Object.defineProperty(defind, "key", { enumerable: false, configurable: false, writable: false, value: "static"});
Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组
Object.getOwnPropertyDescriptor(obj, prop) //方法返回指定对象上一个自有属性对应的属性描述符
console.log(Object.getOwnPropertyDescriptor(freeze1, 'a'));{ value: '1', writable: false,enumerable: true, configurable: false }
Object.is(value1, value2)方法判断两个值是否是相同的值。
console.log(Object.is({}, {})); //falseconsole.log(Object.is([], {})); //falseconsole.log(Object.is([], [])); //false
obj.hasOwnProperty(prop) 检查对象有没有该属性
var o = { prop: 'exists'};console.log(o.hasOwnProperty('prop')); // 返回 trueconsole.log(o.hasOwnProperty('hasOwnProperty')); // 返回 false
每天进步一点,希望大家喜欢,也希望喜欢的朋友点个赞,后续继续更新...