是否有可能在不指定所有属性的情况下对对象进行析构化赋值,以便在不访问对象的情况下所有属性都可用。let props = {one: "property1", two: "property2"};以便将属性带到控制台console.log(one);类似于let {...} = props;
let props = {one: "property1", two: "property2"};
console.log(one);
let {...} = props;
fjnneemd1#
动态命名变量本身就有风险,不推荐使用。问题是你接受了一些对象,并相信它会覆盖任何现有的变量(包括像console.log这样的变量)。如果你对自己的代码很有信心,而你只是在偷懒,我仍然建议你使用verbose和enumerating all properties,property names,或者把它赋给一个名字更短的变量。也就是说,这里有我知道的方法来做到这一点。..
console.log
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还详细说明了使用此功能的问题。
1条答案
按热度按时间fjnneemd1#
动态命名变量本身就有风险,不推荐使用。问题是你接受了一些对象,并相信它会覆盖任何现有的变量(包括像
console.log
这样的变量)。如果你对自己的代码很有信心,而你只是在偷懒,我仍然建议你使用verbose和enumerating all properties,property names,或者把它赋给一个名字更短的变量。也就是说,这里有我知道的方法来做到这一点。..
分配全局
window
作用域这在Web浏览器中特别有效,是唯一安全的方法。在写入某个属性之前,应始终检查该属性是否存在,以获得某种保护。它仍然容易出错,因为它仍然会影响其他代码,并且很难使用仅在运行时已知的变量名进行编码。然而,它有效地让你做你想要的,一些额外的代码:
with(...)
语句这是一种古老的方法,使用起来很简单。它添加到块内的范围以包括对象的所有属性。这包括原型函数和所有内容。代码最终看起来像这样:
这样做的一个大问题是,如果对象来自其他地方,比如函数参数,那么它可能会覆盖你硬编码的局部变量的作用域。链接的文档列出了许多使用此功能的问题。
eval(...)
解构这可能是你想的更多。您可以手动创建一个属性列表,将其赋值为变量,然后将其放入
eval(...)
中的析构赋值中。最后看起来是这样的:这在两个方面是不同的。在
eval(...)
中创建新变量的唯一方法是在全局范围内,因此它不是自包含的。然而,它只包含对象的own properties,这意味着不会从原型中复制任何东西。MDN还详细说明了使用此功能的问题。