javascript 所有对象属性的解构

eyh26e7m  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(158)

是否有可能在不指定所有属性的情况下对对象进行析构化赋值,以便在不访问对象的情况下所有属性都可用。let props = {one: "property1", two: "property2"};
以便将属性带到控制台console.log(one);
类似于let {...} = props;

fjnneemd

fjnneemd1#

动态命名变量本身就有风险,不推荐使用。问题是你接受了一些对象,并相信它会覆盖任何现有的变量(包括像console.log这样的变量)。如果你对自己的代码很有信心,而你只是在偷懒,我仍然建议你使用verbose和enumerating all propertiesproperty names,或者把它赋给一个名字更短的变量。
也就是说,这里有我知道的方法来做到这一点。..

分配全局window作用域

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

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(...)中创建新变量的唯一方法是在全局范围内,因此它不是自包含的。然而,它只包含对象的own properties,这意味着不会从原型中复制任何东西。MDN还详细说明了使用此功能的问题。

相关问题