Недавно я наткнулся на этот отличный кусок JavaScript
и я немного пытаюсь понять, как это работает, и конкретно эту часть:
Array.from(e.attributes, ({name, value}) => [name, value])
Здесь мы имеем дело с NamedNodeMap, который представляет собой набор объектов Attr, а у Attr есть свойства с именами name и value среди многих других.
Итак, у нас есть анонимная функция, которая принимает объект и возвращает массив. Все идет нормально.
Чего я не совсем понимаю, так это того, как аргумент функции определяется как буквальный объект {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 ]
>
но я до сих пор не понимаю Зачем это работает. Может ли кто-нибудь объяснить или направить меня к соответствующей документации?
ссылка исправлена, спасибо Нина
Он называется Разрушение. Также: Распаковка полей из объектов, переданных в качестве параметра функции
Спасибо, адига, это ответ, который я искал. JavaScript не перестает меня удивлять :-)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


То, что вы ищете, это присваивание деструктуризации, где объект присваивается объектному литералу только с ключами, которые вам нужно взять.
var object = { name_: 'foo', value: 42 },
{ name_, value } = object; // name is a property of window
console.info(name_);
console.info(value);Бинго! (приступая к вычислению истинного ответа на вопрос «Жизнь, Вселенная и все остальное»)
Вы не совсем определяете литерал объекта в качестве аргумента, а скорее являетесь объектом деструктурирование. Вы можете рассматривать деконструкцию как еще один способ доступа к свойствам объекта.
Например, если у вас есть объект a:
const a = {
name: 'foo',
value: 'bar'
}
Вы можете получить его свойства несколькими способами:
Обозначение через скобки:
const name = a["name"];
const value = a["value"];
Через точку:
const name = a.name;
const value = a.value;
Или через присваивание деструктуризации:
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.info(name, value);
var name = a.name;
var value = a.value;
console.info(name, value);
var {name, value} = a;
console.info(name, value);Таким образом, когда вы используете {name, value} в аргументах вашей функции, вы фактически указываете javascript извлекать свойства name и value из объекта, переданного в качестве аргумента.
What I don't quite get is the way the argument of the function is defined as the litteral object {name, value}.
Это называется выражением JavaScript присваивание деструктуризации, которое позволяет распаковывать значения из массивов или свойства объектов в отдельные переменные.
Нет, это не "присваивание" при использовании в объявлении параметра функции.
Вы можете назначать новые переменные, даже если они используются в функции. const func = ({a: foo, b: bar}) => {console.info(foo, bar)}Ссылка на сайт
ваша первая ссылка не работает.