将对象销毁为函数args

时间:2019-08-01 23:13:33

标签: javascript destructuring

const obj = {
    foo: 1,
    bar: 2
};

let fn = (...obj) => {
    console.log(foo, bar); // ReferenceError: foo is not defined
};

fn(obj);

我基本上想直接在函数内部使用对象道具,而不必使用obj.fooobj.bar

编辑后添加:我知道我可以手动定义args({ foo, bar }),但是我不想这样做,因为该对象应该具有未知的/可变数字属性。

3 个答案:

答案 0 :(得分:1)

对象的解构不同于数组:

const obj = {
    foo: 1,
    bar: 2
};

let fn = ({ foo, bar }) => {
    console.log(foo, bar); // ReferenceError: foo is not defined
};

fn(obj);


如果只想遍历属性,也可以对值使用解构:

const obj = {
    foo: 1,
    bar: 2
};

let fn = (values) => {
    console.log(...values); // ReferenceError: foo is not defined
};

fn(Object.values(obj));

答案 1 :(得分:1)

这有帮助吗?

我假设您是关注一些您确实了解的属性。 但是想保留其他人吗?

const obj = {
    foo: 1,
    bar: 2,
    unknown: 3,
    unknow: 4,
};

let fn = ({ foo, bar, ...other}) => {
    console.log(foo, bar); 
    console.log(other);
};

fn(obj);

答案 2 :(得分:0)

这似乎是您要去的目标,至少要大致说一下,因为它确实有一个很大的警告。

我所要做的就是使用this关键字,假设它也将变量名称封装在函数的上下文中。当然,在测试期间,我忘记了很多主要信息。在该上下文中使用this关键字时,默认为包含上下文。在这种情况下,即为window。因此,在窗口对象上设置键名会污染全局范围或包含范围的所有范围,尽管我尚未在基于类的上下文中对此进行过测试。

const obj1 = {varname1: "this is variable name 1", varname2: "this is variable name 2"};

function createsVars(obj) {
  var keys = Object.keys(obj);
  for (let i = 0; i < keys.length; i++) {
    this[keys[i]] = obj[keys[i]];
  }
  console.log(varname1, "|", varname2);
}

createsVars(obj1);