每日一题(开开森森学前端之Object系列)

栏目: JavaScript · 发布时间: 5年前

内容简介:大家好,本人来在掘金待了有3个多月了,决定跟随前端大佬们的步伐,故决定每天一题记录自己的成长轨迹,由于水平有限,对于文章中出现的问题还请大佬们指正。我们先来看看这个方法,这个方法其实是可以将两个对象进行合并操作 我们来看一个例子:但这里要注意的是如果对象中存在重名的键,后面值的会把前面的覆盖掉

大家好,本人来在掘金待了有3个多月了,决定跟随前端大佬们的步伐,故决定每天一题记录自己的成长轨迹,由于水平有限,对于文章中出现的问题还请大佬们指正。

今天要巩固的是Object常用方法

首先我们来看一下Object都有哪些常用方法呢

1.Object.assign(target, sources)
2.Object.entries()
3.Object.keys()
4.Object.values()
复制代码
每日一题(开开森森学前端之Object系列)

我的天,原来Object有这么多常用的方法。不知道的童鞋跟着我一起来学习下他们正确的使用姿势吧

Object.assign()

我们先来看看这个方法,这个方法其实是可以将两个对象进行合并操作 我们来看一个例子:

var target  = { a: "掘金"  }
var source1 = { b: "掘金1" };
var source2 = { c: "掘友2" };
Object.assign(target,source1,source2);
我们会发现这个得到的结果将是:
target = { a: "掘金",b: "掘金1",c: "掘友2" }
所以我们总结:目标对象自身也会改变。
如果我们用变量接收:
let returnedTarget = Object.assign(target,source1,source2);
那么returnedTarget 也是 { a: "掘金",b: "掘金1",c: "掘友2" }
复制代码

但这里要注意的是如果对象中存在重名的键,后面值的会把前面的覆盖掉

当然啦,Object.assign还可以复制一个对象

const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
复制代码

注意啦,这里有同学可能听过深拷贝和浅拷贝,那么我们来看下Object.assign到底是深拷贝还是浅拷贝呢?

let obj1 = { a: 0 , b: {c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: {c: 0}} 
复制代码

这里我们看到我们复制出了一个obj2这么一个新对象,大家应该也都知道,如果是浅拷贝的话,拷贝的其实是内存地址,那这里的assign方法如果是浅拷贝的话,理论上咱们改变obj1的值,那么拷贝出来的obj2的值也会跟着变。咱们来做一个实验。

obj1.a = 1; 
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} 
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}} 
复制代码

我们可以看到改变了obj1里a的值之后obj2里a的的值并没有发生改变。我们再来做一个实验

obj2.a = 2; 
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}} 
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
复制代码

可以看到改变了obj2(拷贝出来的对象)里a的值,影响obj1(源对象)里a的值没有发生变化

那么有童鞋肯定会说那按照这样看assign方法他就是深拷贝喽。其实不然,咱们再来做个小实验。咱们这次去尝试改一下obj.b.c的值来看看结果如何?

obj2.b.c = 3; 
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}} 
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}} 
复制代码

很明显刚刚的结论被推翻了,这里obj2.b.c的值发生了改变

所以我们做出如下总结:Object.assign方法他的拷贝规则是:他拷贝的是属性值,假如源对象(obj1)的属性值是一个对象类型,那么拷贝出来的obj2(新对象)并不会直接拷贝值,而是拷贝的源对象的内存地址。

所以既然拷贝的是引用那自然而然就是浅拷贝喽。

Object.entries()

废话不多说咱们先看代码:

const object1 = { foo: 'bar', baz: 42 };
console.log(Object.entries(object1));
输出结果:[["foo", "bar"],["baz", 42]]
可以看到这里是一个二维数组,他的第一个数组里放了咱们的键,第二个数组里放着咱们的值
那咱们想拿到键该怎么拿呢?很简单!
console.log(Object.entries(object1)[0]);
输出结果:["foo", "bar"]
那么同理:拿到值就是
console.log(Object.entries(object1)[1]);
输出结果:["baz", 42]
复制代码

Object.keys()

概念: Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面的属性。这些属性的顺序与手动遍历该对象属性时的一致。

var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // ['0', '1', '2']
这是一个数组,那么使用object遍历时则是输出他对应的索引
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // ['0', '1', '2']
这是一个对象,同样也是输出索引
var obj2 = { foo: 'bar', baz: 42 };
console.log(Object.keys(obj2)); // ['foo', baz]
这是一个对象,那么他的键是foo和baz所以他就会输出foo,baz
复制代码

Object.values()

有了上面的Object.keys的经验,我们大概都可以猜出来values是干啥的了。

var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
他输出了我们对象的值
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
他也输出了我们对象的值
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能商业

智能商业

曾鸣 / 中信出版集团 / 2018-11 / 68.00

《智能商业》由马云作序推荐。《智能商业》是阿里巴巴集团前总参谋长曾鸣,对互联网时代的重要趋势做出革命性解读的作品,披露了其对于未来商业模式的思考和判断。 2006年,曾鸣教授加入阿里巴巴集团,参与阿里巴巴集团及各重要业务线,如淘宝、支付宝、阿里云计算、菜鸟等的发展,被业界称为阿里的“军师”。 基于在阿里巴巴集团十几年的实践经验,以及对互联网、大数据和人工智能的深入思考,曾鸣教授在《智能......一起来看看 《智能商业》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具