【问题标题】:Destructuring an object without specifying its properties在不指定其属性的情况下解构对象
【发布时间】:2016-08-16 07:17:01
【问题描述】:

有没有一种优雅的解决方案来解构对象而不指定对象的所有属性?

我想知道是否可以使用扩展运算符,但似乎不可能,因为对象不是数组!

我想盲目地声明变量可能被认为是一个坏主意,但我认为这对于非常大的对象很有用。

【问题讨论】:

  • 您到底想做什么? with 构造可以做到这一点,但出于各种原因,我真的不推荐它。部分实施解构以解决with 问题。否则,在 ES7 中有一个 Object spread/rest 提议:github.com/sebmarkbage/ecmascript-rest-spread 但是传播不是解构。
  • 考虑一下你用这个实现了什么,以及你认为你“节省”了什么。您会得到很多可以在下面使用的变量,但是您“保存”了声明。那有什么用?当您开始使用它们时,将属性添加到解构赋值中不是更好吗?您的代码看起来会更干净,并且不会声明无用的变量。此外,如果您有非常大的对象需要在代码中读取/改变许多属性,这对我来说是一种气味。

标签: javascript ecmascript-6 destructuring


【解决方案1】:

这是 with(){} 构造所允许的:

var obj = {a: 1};
with (obj) {
  console.log(a);
}

然而,这种构造严重不鼓励并且基本上不推荐使用(它在严格模式下会引发错误),因为它有一些主要缺点:

  • 您的代码很难阅读,因为无法区分 1) 来自外部作用域的变量 2) 局部变量 3) 来自对象的属性。

  • 您的代码无法优化,因为 JavaScript 引擎无法判断变量的来源。

  • 你的代码更难重构,因为如果你给obj引入一个属性,它可能会影响一些现有的局部变量,例如:


var obj = {};
var a = 1;
addSomeProperties(obj);
with (obj) {
  console.log(a); // the result here depends on whether or not "addSomeProperties" puts a property named "a" on "obj"
}

TL;DR 版本:你真的不想要这个,它会让你的代码变得脆弱,难以阅读和重构。只需使用“正常”解构语法挑选您想要分开的部分。

【讨论】:

  • “然而,这种结构被严重劝阻,基本上已弃用”它也会在严格模式下抛出错误。
猜你喜欢
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2017-01-24
  • 2018-12-06
  • 2013-05-10
  • 1970-01-01
相关资源
最近更新 更多