定义一个函数以仅应用于作为参数传递的对象的属性子集[重复]

Posted

技术标签:

【中文标题】定义一个函数以仅应用于作为参数传递的对象的属性子集[重复]【英文标题】:Defining a function to apply only to a subset of properties of the objects passed as argument [duplicate] 【发布时间】:2019-06-27 08:02:48 【问题描述】:

我最近遇到this nifty piece of javascript

我正在努力理解它是如何工作的,特别是这部分:

  Array.from(e.attributes, (name, value) => [name, value])

在这里,我们处理 NamedNodeMap,它是 Attr 对象的集合,并且 Attr 确实具有名为 namevalue 的属性等等。 所以,我们有一个匿名函数,它接受一个对象并返回一个数组。到目前为止,一切顺利。

我不太明白的是函数的参数被定义为垃圾对象name, value的方式。

我能够隔离行为:

> o= a: 1, b: 2, ldfk: 'mùl' 
> let objToArr = function(a,b) return [a,b] 

> objToArr(o)
[ 1, 2 ]
> 
> o = 'dfklj':3.14, 'c':'z', 'a':1, 'foo':'bar', 'b':2, 'z':26 
 dfklj: 3.14, c: 'z', a: 1, foo: 'bar', b: 2, z: 26 
> objToArr(o)
[ 1, 2 ]
> 

但我仍然不明白为什么它有效。有人可以解释一下或让我参考相应的文档吗?

【问题讨论】:

你的第一个链接失效了。 链接修复,谢谢尼娜 它叫做Destructuring。另外:Unpacking fields from objects passed as function parameter 谢谢阿迪加,这就是我正在寻找的答案。 JavaScript 从未停止让我惊讶:-) 【参考方案1】:

您正在寻找的是destructuring assignment,其中一个对象被分配给一个只有键的对象文字,您需要获取。

var object =  name_: 'foo', value: 42 ,
     name_, value  = object;           // name is a property of window

console.log(name_);
console.log(value);

【讨论】:

宾果游戏! (继续计算生命、宇宙和万物的真实答案)【参考方案2】:

我不太明白的是函数的参数被定义为 litteral 对象 name, value 的方式。

这称为destructuring assignment JavaScript 表达式,它可以将数组中的值或对象中的属性解压缩到不同的变量中。

【讨论】:

不,在函数的参数声明中使用它不是“赋值”。 您可以分配给新变量,即使它在函数中使用。 const func = (a: foo, b: bar) => console.log(foo, bar)Link【参考方案3】:

您没有将对象文字完全定义为参数,而是您是 destructuring 对象。您可以将解构视为访问对象属性的另一种方式。

例如,如果你有一个对象a

const a = 
  name: 'foo',
  value: 'bar'

您可以通过多种不同方式获取其属性:

通过括号表示法:

const name = a["name"];
const value = a["value"];

通过点表示法:

const name = a.name;
const value = a.value;

或通过destructuring assignment:

const name, value = a; // name & value are variables which you can use

const a = 
  name: "foo",
  value: "bar"


var name = a["name"];
var value = a["value"];
console.log(name, value);

var name = a.name;
var value = a.value;
console.log(name, value);

var name, value = a;
console.log(name, value);

因此,当您在函数参数中使用name, value 时,您实际上是在告诉javascript 从作为参数传入的对象中提取namevalue 属性。

【讨论】:

以上是关于定义一个函数以仅应用于作为参数传递的对象的属性子集[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MVC Web Api GET 将对象作为参数传递

如何在将对象作为泛型参数传递时使用它的基础类型

AttributeError:将 sql 函数作为默认参数传递时,“NoneType”对象没有属性“_jvm”

如何将对象属性作为参数传递? (JavaScript)

将对象作为参数传递给构造函数并将其属性复制到新对象?

JavaScript高级 面向对象(12)--引用类型值类型作为参数传递的特性