当前位置:   article > 正文

前端JavaScript篇之object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别、如何判断一个对象是空对象

前端JavaScript篇之object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别、如何判断一个对象是空对象


object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别

Object.assign 和扩展运算符(spread operator)都属于浅拷贝。

浅拷贝的概念

浅拷贝是指创建一个新的对象或数组,新对象的属性值或新数组的元素值是对原始对象或数组中的值的引用。这意味着如果原始对象或数组的属性值或元素值是对象或数组,那么新对象或数组中的这些值仍然会指向相同的内存地址。

Object.assign 的浅拷贝

Object.assign 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,并返回目标对象。它只会拷贝对象自身的可枚举属性,不会拷贝继承的属性,而且对于嵌套对象,它只会进行浅拷贝。

let source = { a: 1, b: { c: 2 } }
let target = Object.assign({}, source)
source.b.c = 3
console.log(target.b.c) // 输出 3,因为是浅拷贝,target.b 与 source.b 指向同一对象
  • 1
  • 2
  • 3
  • 4

扩展运算符的浅拷贝

扩展运算符(spread operator)用于将可迭代对象(比如数组、字符串等)展开为单独的元素。在对象上使用扩展运算符时,也会进行浅拷贝。

let source = { a: 1, b: { c: 2 } }
let target = { ...source }
source.b.c = 3
console.log(target.b.c) // 输出 3,因为是浅拷贝,target.b 与 source.b 指向同一对象
  • 1
  • 2
  • 3
  • 4

浅拷贝的区别

浅拷贝会复制对象或数组本身以及它们的第一层属性或元素,但对于嵌套的对象或数组,它们仍然会被共享,即新对象或数组的嵌套对象或数组与原始对象或数组中的嵌套对象或数组指向同一内存地址。

总结

Object.assign 和扩展运算符都执行浅拷贝,这意味着它们只会复制对象或数组本身以及它们的第一层属性或元素,而对于嵌套的对象或数组,仍然会共享相同的内存地址。要实现深拷贝(完全独立的拷贝),需要使用其他方法或工具来处理。

如何判断一个对象是空对象

要判断一个对象是否为空对象,可以使用以下方法:

通过对象的属性数量来判断

通俗地说,如果对象中没有任何属性,那么我们可以认为这个对象是空对象。

// 定义一个空对象
let emptyObject = {}

// 判断对象是否为空
function isObjectEmpty(obj) {
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      return false // 只要发现有属性,就不是空对象
    }
  }
  return true // 没有任何属性,是空对象
}

console.log(isObjectEmpty(emptyObject)) // 输出 true,表示对象是空对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. 遍历对象的所有属性。
  2. 如果发现对象拥有自身的属性,则该对象不是空对象。
  3. 如果遍历完对象后都没有发现任何属性,那么可以确定这个对象是空对象。

通过 JSON.stringify 方法来判断

使用 JSON.stringify 方法可以将对象转换为字符串,如果对象是空对象,转换后的字符串将是 "{}"。因此,我们可以通过判断转换后的字符串是否为 "{}" 来确定对象是否为空对象。

// 定义一个空对象
let emptyObject = {}

// 判断对象是否为空
function isObjectEmpty(obj) {
  return JSON.stringify(obj) === '{}'
}

console.log(isObjectEmpty(emptyObject)) // 输出 true,表示对象是空对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

通过 Object.keys() 方法来判断

使用 Object.keys() 方法可以获取对象自身可枚举属性的键组成的数组。如果对象是空对象,那么该数组将为空数组,因此我们可以通过判断数组的长度是否为 0 来确定对象是否为空对象。

// 定义一个空对象
let emptyObject = {}

// 判断对象是否为空
function isObjectEmpty(obj) {
  return Object.keys(obj).length === 0
}

console.log(isObjectEmpty(emptyObject)) // 输出 true,表示对象是空对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 使用 JSON.stringify 将对象转换为字符串,然后判断字符串是否为 "{}"
  2. 使用 Object.keys() 获取对象的可枚举属性组成的数组,然后判断数组的长度是否为 0。

总结

通过检查对象的属性数量,我们可以判断一个对象是否为空对象。如果对象中没有任何属性,那么它就个空对象。通过 JSON.stringifyObject.keys() 方法,我们也可以判断一个对象是否为空对象。

持续学习总结记录中,回顾一下上面的内容:
object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别
Object.assign 和扩展运算符都执行浅拷贝,这意味着它们只会复制对象或数组本身以及它们的第一层属性或元素,而对于嵌套的对象或数组,仍然会共享相同的内存地址。要实现深拷贝(完全独立的拷贝),需要使用其他方法或工具来处理。
如何判断一个对象是空对象 :
通过检查对象的属性数量,我们可以判断一个对象是否为空对象。如果对象中没有任何属性,那么它就个空对象。通过 JSON.stringifyObject.keys() 方法,我们也可以判断一个对象是否为空对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/68272
推荐阅读
相关标签
  

闽ICP备14008679号