Параметры деструктурирования массива - PullRequest
0 голосов
/ 17 июня 2020

Я изучаю деструктуризацию, и у меня был быстрый запрос о том, как ссылаться на элементы массива.

Я деструктурирую вложенный массив внутри объекта в параметре функции, используя:

function ajaxOptions({
    url,
    headers: [ 
        header0 ="Content-Type: text/plain",
        ...otherHeaders
    ] = [],
    data
} = {}) { 
    //... function body
}

, который дает значение по умолчанию для первого элемента, header0 и распространяет другие элементы массива.

Но если бы у меня был объект настроек:

var settings = {
    url: 'http://someothersite.com', 
    data: 50, 
    callback: sayHello, 
    headers: [,  'Header2', 'Header3'] 
}

и передал его в ajaxOptions(settings). Я не могу использовать header0 в объекте настроек для ссылки на элемент массива, деструктурированный в ajaxOptions, могу я? Другими словами, я не могу использовать его в качестве именованного аргумента, например «url», «data» и «callback»?

Надеюсь, это имеет смысл. Вот полный код, если это поможет:

function ajaxOptions({
    url: url = "http://www.example.com",
    method: method = "post",
    headers: [ 
        header0 ="Content-Type: text/plain",
        ...otherHeaders
    ] = [],
    data: data,
    callback: callback 

} = {}) {
    return { url, method, headers: [header0, ...otherHeaders], data, callback};
}

function sayHello(){
    console.log('hello');
}


var defaults = ajaxOptions();

var settings = {
    url: 'http://someothersite.com', 
    data: 50, 
    callback: sayHello, 
    headers: [, header0 = 'New Header', 'Header2', 'Header3'] 
}

console.log(ajaxOptions(settings));

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

header0 в вашем списке параметров - это параметр, локальная переменная, точно так же, как a - это параметр в:

function test(a) { }

И точно так же, как вы не можете ссылаться на a по имени вне эта функция test, вы не можете сделать это с помощью своего кода и header0. Таким образом, если вы вызываете свою функцию с помощью header0 =, вы фактически определяете глобальную переменную header0 и сразу же присваиваете ей значение. Это приведет к ошибке в строгом режиме. Это не имеет ничего общего с параметром header0.

Параметр header0 получит свое значение из первого элемента массива, который вы передаете как headers значение свойства. Если объект, который вы передаете в качестве аргумента, не имеет свойства headers или это свойство не определяет первый элемент массива, отличный от undefined, тогда локальная переменная headers0 получит значение по умолчанию.

Эту переменную не следует путать с именем свойства, за которым следует двоеточие, которое также появляется в разделе параметров: headers:. Это не переменная, а просто определение места, откуда переменные headers0 и otherHeaders должны получать свои значения при вызове функции. Но headers сам по себе не является переменной.

url с другой стороны - это переменная. Он берет свое значение из одноименного свойства. Обратите внимание на отсутствие толстой кишки. Это делает его переменной (параметром).

Синтаксис, используемый при деструктуризации, может сбивать с толку. Например, если вместо url, у вас будет url: url2, тогда вместо определения переменной url вы определите переменную url2 - по-прежнему значение, которое свойство url имеет в переданном вами объекте. к функции.

0 голосов
/ 17 июня 2020

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

const defaulHeader = ["Content-Type: text/plain"]
const otherHeaders = ["Some-type: application/json"]

 const headers = [ 
        ...defaulHeader,
        ...otherHeaders
    ]

console.log(headers)
...