js中对象进行赋值操作的几种方式

这篇具有很好参考价值的文章主要介绍了js中对象进行赋值操作的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近开发碰到多参数赋值的问题,参数之间总是互相影响,导致出现一些奇怪的bug,查阅了相关资料,全部在这里了,记录一下,希望可以帮到有需要的人

一、= 赋值

let obj1 = {name: '小明', age: 10};
let obj2 = obj1;
obj1.age = 20;
console.log(obj2.age); // 输出20

上述代码中,obj1和obj2指向了同一块内存区域,修改obj1的age属性,也会影响到obj2的age属性。这是因为obj2只是复制了obj1的引用,指向的是同一块内存地址。

二、浅拷贝

浅拷贝是指将一个对象的属性值复制到另一个对象中,如果属性值是引用类型,那么只是复制了它的引用地址,而原对象和新对象的引用指向了同一个地址。这样,在修改新对象中的属性时,原对象相应的属性也会改变。 下面是一个浅拷贝的例子:

    
const originalObj = {a:1, b:{c:2}};
const newObj = Object.assign({}, originalObj);
newObj.b.c = 3;
console.log(originalObj.b.c); // 输出 3
console.log(newObj.b.c); // 输出 3
    

在上面的例子中,我们使用了Object.assign方法对原对象进行浅拷贝,并将新对象赋值给了newObj。然后,我们修改了新对象中b属性的c值,结果发现原对象相应的属性也发生了改变。

三、深拷贝

深拷贝是指复制一个对象及其对象的所有子对象的值,并将它们都复制到一个新对象中,这样原对象和新对象没有任何关联,修改新对象中的属性不会影响原对象。 下面是一个深拷贝的例子:

    
const originalObj = {a:1, b:{c:2}};
const newObj = JSON.parse(JSON.stringify(originalObj));
newObj.b.c = 3;
console.log(originalObj.b.c); // 输出 2
console.log(newObj.b.c); // 输出 3
    

在上面的例子中,我们使用了JSON的parse和stringify方法对原对象进行深拷贝,并将新对象赋值给了newObj。然后,我们修改了新对象中b属性的c值,结果发现原对象相应的属性没有发生改变。 需要注意的是,深拷贝需要注意循环引用的问题。如果原对象中存在循环引用的情况,深拷贝会陷入死循环,需要我们自己手动处理。

四、ES6展开运算符

展开运算符可以将一个对象中的所有属性展开,并将它们作为新对象的属性,从而实现对象的赋值。 下面是一个展开运算符的例子:

    
const originalObj = {a:1, b:{c:2}};
const newObj = {...originalObj};
newObj.b.c = 3;
console.log(originalObj.b.c); // 输出 2
console.log(newObj.b.c); // 输出 3
    

在上面的例子中,我们使用了展开运算符对原对象进行了复制,并将新对象赋值给了newObj。然后,我们修改了新对象中b属性的c值,结果发现原对象相应的属性没有发生改变。 需要注意的是,展开运算符也只能实现浅拷贝,和Object.assign一样,新对象中的引用类型属性只是复制了一个引用地址。

五、结合ES6的解构赋值

结合ES6的解构赋值,我们可以快捷地对一个对象进行赋值。解构赋值可以同时为多个变量赋值,也可以为对象中的某个属性赋值。使用解构赋值,我们可以非常便捷地对一个对象进行复制或者拆分。 下面是一个解构赋值的例子:

    
const originalObj = {a:1, b:{c:2}};
const { ...newObj } = originalObj;
newObj.b.c = 3;
console.log(originalObj.b.c); // 输出 2
console.log(newObj.b.c); // 输出 3
    

在上面的例子中,我们使用了解构赋值对原对象进行了复制,并将新对象赋值给了newObj。然后,我们修改了新对象中b属性的c值,结果发现原对象相应的属性没有发生改变。

六、使用Object.getOwnPropertyDescriptors

我们还可以使用Object.getOwnPropertyDescriptors方法来拷贝对象。Object.getOwnPropertyDescriptors方法可以获取对象所有属性的描述符,包括属性方法、可枚举性、可配置性、可写性等等。 下面是一个使用Object.getOwnPropertyDescriptors方法的例子:

    
const originalObj = {a:1, b:{c:2}};
const newObj = Object.defineProperties({}, Object.getOwnPropertyDescriptors(originalObj));
newObj.b.c = 3;
console.log(originalObj.b.c); // 输出 2
console.log(newObj.b.c); // 输出 3
    

在上面的例子中,我们使用了Object.getOwnPropertyDescriptors方法和Object.defineProperties方法对原对象进行了复制,并将新对象赋值给了newObj。然后,我们修改了新对象中b属性的c值,结果发现原对象相应的属性没有发生改变。

七、结合函数实现对象的赋值

我们还可以结合函数来实现对象的赋值。函数在实现对象复制时,可以调用Object.assign或者JSON.parse(JSON.stringify())方法实现浅拷贝和深拷贝。 下面是一个结合函数实现对象赋值的例子:

    
function copyObj(obj, flag){
    if(flag){
        return JSON.parse(JSON.stringify(obj));
    }else{
        return Object.assign({}, obj);
    }
}
const originalObj = {a:1, b:{c:2}};
const newObj = copyObj(originalObj, true);
newObj.b.c = 3;
console.log(originalObj.b.c); // 输出 2
console.log(newObj.b.c); // 输出 3
    

在上面的例子中,我们通过编写copyObj函数来实现对象的复制,并将原对象和深拷贝标识传入函数中。然后,我们使用函数来复制原对象,将新对象赋值给了newObj。最后,我们修改了新对象中b属性的c值,结果发现原对象相应的属性没有发生改变。

借鉴于 JS对象赋值给另一个对象_笔记大全_设计学院文章来源地址https://www.toymoban.com/news/detail-788341.html

到了这里,关于js中对象进行赋值操作的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js删除数组的几种方式

    注意: 此方法改变数组的长度! 提示: 移除数组末尾的元素可以使用 pop() 方法。 slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。 注意: slice() 方法不会改变原始数组。 注意:这种方法会改变原始数组。 返回值 如果删除一个元素,则返回一个元素

    2024年02月16日
    浏览(40)
  • js常用的几种排序方式

    在JavaScript中,有多种排序方式可供选择。以下是几种常见的排序方式以及对应的示例: 冒泡排序(Bubble Sort): 冒泡排序是一种比较简单的排序算法,它重复地比较相邻的两个元素并交换位置,直到整个数组排序完成。 插入排序(Insertion Sort): 插入排序的思想是将数组分

    2024年02月14日
    浏览(41)
  • java中对象和Map互相转换的几种方式

    在Java中,将对象和Map相互转换是常见的操作,可以通过不同的方式实现这种转换。以下是几种常见的方法以及示例说明: 1. 使用Hutool工具类 Hutool是一个优秀的Java工具包,提供了丰富的工具方法,其中就包括对象和Map之间转换的工具方法。 示例: Hutool的 BeanUtil 提供了 bean

    2024年02月03日
    浏览(41)
  • js fetch请求中断的几种方式

    这是官方标准手段,真正意义的阻止请求(不支持ie) 后端接口设置的两秒返回数据 默认结果: 解开定时器后: 通过promise,成功用resolve返回,失败用reject返回(浏览器上,请求依然会发出,并得到响应) 第一种方法: 运行结果: 第二种方法:

    2024年02月12日
    浏览(42)
  • js判断是否为数字的几种方式

    typeof typeof 判断值是不是基本类型 number : instanceof instanceof 判断值是不是包装类 Number : Number.isInteger Number.isInteger 判断值是否是 整数 : 这几种方式的缺点,都是只能基于类型判断,无法判断字符串是否是数值。 parseInt 和 parseFloat 解析的时候遇到非法字符结束,返回解析到

    2024年02月16日
    浏览(41)
  • js去除字符串空格的几种方式

    方法1: (最常用)全部去除掉空格  var str = \\\'  abc d e f  g \\\';         function trim(str) {             var reg = /[trfns]*/g;             if (typeof str === \\\'string\\\') {                 var trimStr = str.replace(reg,\\\'\\\');             }             console.log(trimStr)         }         trim(str) 方

    2024年02月09日
    浏览(47)
  • js中追加数据到数组的几种方式

    在JavaScript中,有多种方式可以向数组中追加数据,包括: push()方法:将一个或多个元素添加到数组的末尾,并返回新数组的长度。 var arr = [1, 2, 3]; arr.push(4); console.log(arr); // [1, 2, 3, 4] unshift()方法:将一个或多个元素添加到数组的开头,并返回新数组的长度。 var arr = [2, 3, 4

    2024年02月15日
    浏览(47)
  • 【java】对ArrayList中的元素进行排序的几种方式

    一、使用Collections工具类 1、对基本类型排序 通过 Collections.sort() 对基本类型排序默认是以升序排序 2、对字符串类型排序 对字符串类型排序默认按照首字母a-z排序 3、对对象排序 如何使用Collections对对象排序呢? 其实只需要让我们的数据类型实现Comparable接口即可,下面定义

    2024年02月09日
    浏览(45)
  • 常用的将Java的String字符串转具体对象的几种方式

    Java对象以User.class为例 ,注意:代码中使用到了lombok的@Data注解 以上就是常用的几种String转具体的java对象操作

    2024年04月11日
    浏览(51)
  • js逆向·找到登录时目标网站的加密算法的几种方式

    为什么要去找到目标网站的加密密码方法: 为了要把我们的payload正确的带入目标网站的服务器进行逻辑验证,那么就需要知道对方使用的什么加密或者编码规则来处理数据的,比如说我们输入的密码被base64编码了,然后发送给后端,后端会进行解码过后再带入逻辑验证中去

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包