Es6新增对象方法

本文深入探讨ES6中新增的Object.is方法,解析其在判断值相等性方面的独特优势,尤其是在处理NaN和-0的情况;同时,全面解析Object.assign方法在对象合并、属性拷贝中的应用技巧,包括其对不同数据类型和属性的处理方式,以及浅拷贝的局限性;并介绍Object.getOwnPropertyDescriptors、Object.setPrototypeOf、Object.getPrototypeOf、Object.keys、Object.values和Object.entries等方法的使用场景和细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object.is

这个方法用来判断两个值是否相等
在Es5中我们使用 = = ( 相 等 运 算 符 ) \color{red}{==(相等运算符)} == = = = ( 严 格 相 等 运 算 法 ) \color{#c7254e}{===(严格相等运算法)} === 这两个来比较,相等运算符会自动转换类型而严格相等运算符不会
红色文字

		console.log('1'==1);
		console.log('1'===1);
		console.log(NaN == NaN);
		console.log(NaN === NaN);
		console.log(-0 === 0);
		console.log('------------------------');
		
		console.log(Object.is('1',1));
		console.log(Object.is(1,1));
		console.log(Object.is(NaN,NaN));
		console.log(Object.is(-0,0));

Object.is与 ===判断符只有两个差别

  • Object.is判断NaN等于 NaN 而===判断为false
  • Object.is判断 -0和0 是不相等的 而 === 判断 -0和0 是相等的

Object.assign

Object.assign()方法用于对象合并
定义:Object.assign(target,obj1,obj2…)
第一个参数是目标对象
第二个参数开始为 要合并的对象

		let obj = {
			name:'zhangsan'
		}
		let obj2 = {
			age:18
		}
		let obj3 = {
			job:'Programer'
		}
		Object.assign(obj,obj2,obj3)
		console.log(obj); //{name: "zhangsan", age: 18, job: "Programer"}

Object.assign方法首参数不能接受null和undefined值并且当参数不是对象是会转换成对象

		console.log(Object.assign(1));  //Number {1}
		console.log(Object.assign(obj,null)); //{name: "zhangsan", age: 18, job: "Programer"}
		console.log(Object.assign(obj,undefined)); //{name: "zhangsan", age: 18, job: "Programer"}
		console.log(Object.assign(null)); //报错
		console.log(Object.assign(undefined)); //报错

注意在Object.assign拷贝对象是浅拷贝不是深拷贝
浅拷贝:新对象是对旧对象的一个引用,并且对新对象上的操作会反应到旧对象上反之对旧对象操作也会反应到新对象上
深拷贝:把原本的旧对象拷贝新的一份放在内存中,新旧对象的操作互不影响

Object.assign非首参数对于 布尔值和空字符串数字都是跳过处理只有字符串会处理

		console.log(Object.assign({},true,'',1,'a')); //{0: "a"}
		let obj = {
			name:'zhangsan'
		}
		let obj2 = {
			age:18
		}
		let obj3 = {
			name:'lisi',
			job:'Programer'
		}
		Object.assign(obj,obj2,obj3); //后续的属性会覆盖前面的属性
		console.log(obj);//{name: "lisi", age: 18, job: "Programer"}

Object.assign无法拷贝不可枚举类型的属性

		let obj = {
			name:'zhangsan'
		}
		
		Object.assign(obj,Object.defineProperty({},'job',{
			enumrable:false,
			value:'Programer'
		})); //Object.assign无法拷贝不可枚举类型的属性
		console.log(obj);//{name: "zhangsan"}

Object.assign方法的用途

  • 添加属性
  • 克隆对象
  • 合并对象
		let obj = {
			name:'zhangsan'
		}
		let obj2 = {
			job:'Programer'
		}
		Object.assign(obj,{age:18}); //添加属性
		Object.assign(obj,obj2); //合并对象
		function clone(obj){
			return Object.assign({},obj);//克隆对象
		}

Object.getOwnPropertyDescriptors()

在Es5引入了Object.getOwnPropertyDescriptors()用于获取某个对象的属性某数在es6引入Object.getOwnPropertyDescriptors()

		let obj = {
			name:'zhangsan',
			age:'18'
		}
		console.log(Object.getOwnPropertyDescriptors(obj));

在这里插入图片描述

操作原型的方法

  • Object.setPrototypeOf() 用来设置原型对象
  • Object.getPrototypeOf() 用来获取原型对象
  • Object.create()

Object.setPrototypeOf(obj, prototype)
参数:
Obj要设置原型的对象
prototype 新的原型对象

设置前**proto**指向Object

在这里插入图片描述
设置后**proto指向 新的原型 新的原型又有proto**指向Object
在这里插入图片描述
Object.getPrototypeOf(obj);
参数:
obj获取原型的对象
返回值:
原型对象

		let obj = {
			name:'zhangsan',
			age:'18',
			func:function(){
				console.log(test);
			},
			set foo(value) {
			    console.log(value);
			  }
		}
		let obj2 = {
			name:'lisi',
			age:20
		}
	
		Object.setPrototypeOf(obj,obj2)
		console.log(obj);
		console.log(Object.getPrototypeOf(obj));

可以看出获取到了原型对象
在这里插入图片描述

Object.keys、Object.values、Object.entries

  • Object.keys 获取所有可遍历(可枚举)的属性键值
  • Object.values 获取所有可遍历(可枚举)的属性值
  • Object.entries 上面两个方法的合并,获取所有可遍历的属性简直及属性值
		let obj = {
			name:'zhangsan',
			age:'18',
			func:function(){
				console.log(test);
			},
			set foo(value) {
			    console.log(value);
			  }
		}
		let obj2 = {
			name:'lisi',
			age:20
		}
	
		console.log(Object.keys(obj)); //["name", "age", "func", "foo"]
		console.log(Object.values(obj)); //["zhangsan", "18", ƒ, undefined]
		console.log(Object.entries(obj)); //[Array(2), Array(2), Array(2), Array(2)]

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值