Определение функции для применения только к подмножеству свойств объектов, переданных в качестве аргумента

Недавно я наткнулся на этот отличный кусок 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 ]
> 

но я до сих пор не понимаю Зачем это работает. Может ли кто-нибудь объяснить или направить меня к соответствующей документации?

ваша первая ссылка не работает.

Nina Scholz 03.02.2019 10:38

ссылка исправлена, спасибо Нина

Éric Viala 03.02.2019 10:40

Спасибо, адига, это ответ, который я искал. JavaScript не перестает меня удивлять :-)

Éric Viala 03.02.2019 10:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

То, что вы ищете, это присваивание деструктуризации, где объект присваивается объектному литералу только с ключами, которые вам нужно взять.

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

console.info(name_);
console.info(value);

Бинго! (приступая к вычислению истинного ответа на вопрос «Жизнь, Вселенная и все остальное»)

Éric Viala 03.02.2019 10:53

Вы не совсем определяете литерал объекта в качестве аргумента, а скорее являетесь объектом деструктурирование. Вы можете рассматривать деконструкцию как еще один способ доступа к свойствам объекта.

Например, если у вас есть объект 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 присваивание деструктуризации, которое позволяет распаковывать значения из массивов или свойства объектов в отдельные переменные.

Нет, это не "присваивание" при использовании в объявлении параметра функции.

Bergi 03.02.2019 11:34

Вы можете назначать новые переменные, даже если они используются в функции. const func = ({a: foo, b: bar}) => {console.info(foo, bar)}Ссылка на сайт

Hamza Ahmed 04.02.2019 05:44

Другие вопросы по теме