是否有可能在不指定所有属性的情况下对对象进行解构赋值,以便所有属性在不访问对象的情况下变得可用。
let props = {one: "property1", two: "property2"};
这样你就可以把属性带到控制台
console.log(one);
有点像
let {...} = props;
动态命名变量本质上是有风险的,不推荐。问题是你正在获取一些对象并相信它会覆盖任何现有变量(包括像
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 还详细说明了使用它的问题。