抖音资讯

douyinzx

js字符串转对象有什么要求(根据字符串获取js对象属性)

iseeyu2年前 (2024-05-07)抖音资讯125

Javascript 是我最喜欢的编程语言,它有些古怪已经不是什么新闻了。 其中之一就是对象复制的方式。 看看下面的代码片段:

let myObj = {
  name: 'James'
}
let secObj = myObj;
myObj.name = 'John'
console.log(secObj.name) // John

在这里更改 myObj.name 的值也会导致 secObj.name 的值更改。 这是一种奇怪的行为,但是这是正常的,因为 javascript 通过引用传递对象。 这意味着在第二个代码块中,创建 myObj 时,javascript 在内存中为对象创建一个位置,而 myObj 包含对创建的对象的引用。 因此,在第4行中,当 secObj 被创建并设置为 myObj 值时,secObj 现在被传递到对象的引用。 在此过程中不会创建任何新对象。 和 secObj 都引用同一个对象。 因此,编辑 myObj.x 会更改 x 的值,而且由于 secObj 引用了同一个对象,所以 secObj.x 也会被更改。

 

这意味着在 javascript 中复制对象是行不通的。 因为更改一个对象的属性值会反映在另一个对象中,所以,我们如何创建对象的副本呢?

 

对象扩展

 

展开操作符... 是 ES6语言的新特征之一。 使用它来复制对象可能是复制对象最简单的方法。

let myObj = {
  name: 'James'
}
// copy myObj using spread syntax
let secObj = {...myObj};
myObj.name = 'John'
console.log(secObj.name) // James

但是应该注意的是,这种复制对象的方法只能作用在一个嵌套级别上。 因此,spread 语法对对象进行一层复制。

let myObj = {
  name: 'James',
  school: {
    name: 'monef',
    class: 'ss3'
  }
}
let secObj = {...myObj};
myObj.school.class = 'jss2'
myObj.name = 'John';

console.log(secObj) // {name:'James',school:{name:'monef',class:'jss2'}}

从上面的片段可以看出,虽然 secObj.name 的值即使在修改 myObj.name 之后也不会发生变化,但 myObj.school.class 中的变化导致了对象 secobj.school.class.so 的变化,而这个变化是有效的,它只是做了一个对象的浅拷贝。 如果确定对象的内容不是嵌套的,那么可以使用展开操作符。

 

Object.assign

在 MDN 上定义的 Object.assign 方法用于将可枚举属性的所有值从一个或多个源对象复制到目标对象。 看看下面的代码片段,

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target); // { a: 1, b: 4, c: 5 }
console.log(returnedTarget); //{ a: 1, b: 4, c: 5 }

分配复制源的内容并将其与目标的内容合并,将合并后的对象存储在目标中并返回,因此 returnedTarget 包含相同的对象。要使用这个对象复制对象,我们可以用对象{}替换目标,然后返回一个包含源对象所有值的新对象:

let myObj = {
  name: 'James'
}

let secObj = Object.assign({}, myObj);

myObj.name = 'John';
console.log(secObj.name); // James

如上面的代码片段所示,secObj 是使用 Object.assign 创建的,但使用一个空对象作为目标,将 myObj 中的所有属性复制到该对象中。

 

虽然这看起来是一个复制对象的智能解决方案,但它也做了对象的浅拷贝,因此,嵌套对象不会被复制,而是通过引用传递。

 

JSON.stringify and JSON.parse

上面提到的所有复制对象的方法都是对对象的浅拷贝。 把 JSON.stringify 和 JSON.parse 结合起来似乎可以做到深拷贝: JSON.stringify 将 javascript 对象转换为 JSON 字符串,而 JSON.parse 将 JSON 字符串转换为 javascript 对象。 可以智能地将这些组合起来,以提供可以对对象进行深度复制的解决方案。 如果我们 JSON.stringify 一个对象,它会变成一个新的字符串,并失去对其父对象的引用。 因此,解析这个新字符串将创建一个与其根失去所有联系的对象,因此,它是一个独立的对象。

let myObj = {
  name: 'James',
  school: {
    name: 'monef',
    class: 'ss3'
  }
}
let secObj = JSON.parse(JSON.stringify(myObj));
myObj.school.class = 'jss2'
myObj.name = 'okoro';
console.log(secObj) // { name: 'James', school: { name: 'monef', class: 'ss3' } }

如上所述,即使更改了 myObj,secObj 的属性仍然保持不变。但是应该注意的是,如果源对象(在本例中为 myObj)包含一个方法,那么该方法将不会被复制。

let myObj = {
  name: 'James',
  school: {
    name: 'monef',
    class: 'ss3'
  },
  dance() {
    console.log('dance')
  }
}
let secObj = JSON.parse(JSON.stringify(myObj));
myObj.school.class = 'jss2'
myObj.name = 'okoro';

// secObj does not contain the dance function.
console.log(secObj) // { name: 'James', school: { name: 'monef', class: 'ss3' } }

对于源对象中值为未定义或符号的属性,此方法也执行类似的操作。 这是因为 JSON.stringify 将对象转换为字符串,但这些对象不能表示为字符串。

 

使用第三方库或手动实现深拷贝方法

 

除了上面提到的方法,还有其他第三方库提供的解决方案,比如 lodash,underline。你也可以自己完成一个深拷贝方法,手写深拷贝方法经常在面试中考到。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/42860.html

相关文章

抖音分身怎么弄(抖音分身双开的技巧)

抖音分身怎么弄(抖音分身双开的技巧)

抖音一打开,很多人都看到过分身定格的特效,就是讲一个人的画面从身体中移到其他位置。而抖音分身定格视频是怎么拍摄出来的呢?一起来详细了解下吧。 抖音拍摄分身定格视频的步骤 1、倘若想要拍摄“分身定格”的特效视频,推荐大家先在抖音里面搜索“分身定格”的关键词,然后点击右下角按钮,进入拍同款的...

cad阵列窗口怎么调出来(cad环形阵列命令的使用)

cad阵列窗口怎么调出来(cad环形阵列命令的使用)

很多人在安装CAD高版本之后,想使用:AR 阵列的时候会发现没有对话框了,会在命令栏出现以下对话框,很多人用不习惯,下面就介绍以下怎么把阵列对话框调出来:   1,我们在菜单栏点开工具,自定义,编辑程序参数   2,我们找到如图...

哔哩哔哩视频推广费用,bilibili广告投放价格

B站成为链接年轻一代的首选。俗话说:酒香不怕巷子深。但如今商业环境,再好的视频没有推送也起不来量的。一条优质如何成为爆款内容?B站起飞流量工具正是撬动品牌传播的杠杆。B站起飞分为两种:一种是内容起飞,另一种是商业起飞。2021年11月29日,B站正式上线了商业起飞。B站商业...

直播间卖的翡翠是真的吗

直播间卖的翡翠是真的吗

随着网络越来越发达,直播大肆兴起了,很多人在观看到直播卖翡翠,那么直播间卖的翡翠是真的吗   我个人认为是假货。理由是:   一,缅甸政府每年进行翡翠公盘。进入市场的原料数量是有限的。   二,翡翠赌性...

视频号直播间如何从零流量快速实现破万 | 微信视频号直播推广

视频号直播间如何从零流量快速实现破万 | 微信视频号直播推广

一、微信视频号直播推广市场概览及行业扶持政策了解 微信视频号从2020年1月22日开始宣布内测,截止目前已经运作2年多的时间,伴随者微信本身庞大的用户基数等优势,吸引了越多越多的商家、内容作者加入。2020年突如其来的疫情打乱了人们过往的生活节奏,由于线下人员、物资等流通受到诸多限制,...

快手视频直播怎么开(新手开直播的步骤分享)

快手视频直播怎么开(新手开直播的步骤分享)

今年是直播带货奇迹的一年,该行业的暴利被主播们展现的淋漓尽致,更涌现了李佳琦、薇娅、辛巴等直播带货的神话般人物。“钱途”一片光明的直播行业让无数人看到了赚钱的可能,渐渐地直播带货技术也正式走上舞台。   随着电商直播带货的兴起,各种直播平台已经成...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片