所有对象属性的解构

问题描述 投票:0回答:1

是否有可能在不指定所有属性的情况下对对象进行解构赋值,以便所有属性在不访问对象的情况下变得可用。

let props = {one: "property1", two: "property2"};

这样你就可以把属性带到控制台

console.log(one);

有点像

let {...} = props;

javascript destructuring
1个回答
0
投票

动态命名变量本质上是有风险的,不推荐。问题是你正在获取一些对象并相信它会覆盖任何现有变量(包括像

console.log
这样的东西)。如果您对自己的代码有信心并且只是懒惰,我仍然建议您使用冗长的代码并枚举所有属性属性名称,或者将其分配给名称较短的变量。

就是说,这是我知道的方法...

分配到全球
window
范围

这特别适用于网络浏览器,是唯一安全的方法。在写入某个属性以获得某种保护之前,您应该始终先检查该属性是否存在。它仍然容易出错,因为它仍然会影响其他代码,并且很难使用仅在运行时已知的变量名进行编码。然而,它有效地让你做你所要求的,有一些额外的代码:

let props = {one: "property1", two: "property2"};
for (p in props) {
    if (!(p in window)) {
        window[p] = props[p];
    }
}
console.log(one); // property1
console.log(two); // property2

with(...)
声明

这是一种古老的方法,使用起来很简单。它添加到块内的范围以包括对象的所有属性。这包括原型函数和一切。代码最终看起来像这样:

let props = {one: "property1", two: "property2"};
with (props) {
    console.log(one); // property1
    console.log(two); // property2
}

一个很大的问题是,如果对象来自其他地方,比如函数参数,那么它可能会覆盖您硬编码的局部变量的范围。链接文档列出了许多使用此功能的问题。

eval(...)
解构

这可能是您更多的想法。您可以手动创建一个属性列表以分配为变量,然后将其放入

eval(...)
内的析构分配中。这最终看起来像这样:

let props = {one: "property1", two: "property2"};
eval(`var {${Object.keys(props).join()}}=props`)
console.log(one); // property1
console.log(two); // property2

这在两个方面是不同的。在

eval(...)
中创建新变量的唯一方法是在全局范围内,因此它不是独立的。然而它只包括对象的自己的属性,这意味着不会从原型复制任何东西。 MDN 还详细说明了使用它的问题。

© www.soinside.com 2019 - 2024. All rights reserved.