抖音资讯

douyinzx

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

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

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

相关文章

搬运视频怎么剪辑不违规教程(短视频搬运神器推荐)

搬运视频怎么剪辑不违规教程(短视频搬运神器推荐)

刚开始做视频剪辑的朋友,是不是经常会遇到视频违规的问题?比如系统提示:"视频与封面不符″,"视频内容与已有内容高度相似″等。这就是视频违规了。   前文已经讲过,视频的表现形式分两种,一种是真人出镜,一种就是视频剪辑。然而,视频剪辑是我们创作者,在做视频的过程中...

抖音如何置顶视频作品(抖音把喜欢的置顶步骤)

抖音如何置顶视频作品(抖音把喜欢的置顶步骤)

抖音上优质作品,你会利用置顶功能吗? 你会利用作品置顶功能吗?置顶功能会拉伸作品的数据,可惜这个细节一般人不会注意。作品刚刚发出去,赶紧把这个作品置顶,这样其他作品带来的流量就会助推这个作品。 当你发现之前发出作品的流量较好,也要将它置顶,会获得二次加热的机会。看看怎么操作。...

不同行业在快手平台的经营模式是什么?

不同行业在快手平台的经营模式是什么?

一、快手广告投放平台:电商行业 大声量:“爱DOU星发现”助力 大权益:品牌权益覆盖直播全程好物分享区专属定制 大转化:品牌商家分享超多惊喜好物 大互动:互动不断,点燃粉达热情 二、快手广告投放平台:食品饮料行业 君乐宝x为歌而赞:全新模式强强联手制造流行:一档用社交系数作为评判标准...

怎样让抖音退出还能播放(抖音app切出去继续播放的设置)

怎样让抖音退出还能播放(抖音app切出去继续播放的设置)

据 Tech 星球报道,抖音正在小范围测试“自动播放下一个视频”的功能,该功能可以让用户在刷短视频的时候,不再像以前那样的重复播放当前观看的短视频内容,而是在当前视频内容结束后,自动跳转到下一个视频。 从报道中网友提供的测试截图中可以看到,抖音 App 的“设置”内增加有“自动播放”功能的...

抖音小店个体工商户入驻流程

抖音小店个体工商户入驻流程

    如今,卖货已经成为抖音的一大趋势,那么想要在抖音上进行卖货,没有第三方店铺的话,那么需要开通“抖音小店”来进行货品销售,我们该如何入驻抖音小店呢?下面我们将进行详细的研究;       01  ...

360推广创意战略五:单脑思考

360推广创意战略五:单脑思考

好的360推广创意需要单脑思维,本文从核心途径、外围途径、ELM模型开始,讲解了相关性决定思考模式,不同套路效果不一,两种路径一个定律三个方法,分分钟助你成为创意大神! 我们都知道人类的脑子是分左脑和右脑,在解释这个方法之前我们先看看我们最重要的人类器官中,左脑和右脑的作用分别是什么。以及它们有...

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

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