Что означает пара ключ-значение в квадратных скобках []?

Давайте рассмотрим следующее это мой объект:

var n = {"aa":"x","dd":'d'};

Я использую квадратные скобки в Object.assign. Это дает следующий результат. [aa: "x", dd: "d"]. Окончательный код:

var n = {"aa":"x","dd":'d'};
var m = Object.assign([],n);

// result is 
[aa: "x", dd: "d"]

в __proto__ console.log __proto__ сообщает, что это массив, если это массив, следующий за кодом с unexpected token error

var v = ["sss":"ddd","ccc":"ddd"]; 

Что означает?

enter image description here

Ответ 1

Массивы - это объекты в JS

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

MDN говорит:

Массивы являются объектами в виде списков

...

Массивы не могут использовать строки в качестве индексов элементов (как в ассоциативном массиве), но должны использовать целые числа. Установка или доступ через нецелые числа с использованием скобочных обозначений (или точечных обозначений) не будут устанавливать или извлекать элемент из самого списка массивов, но будут устанавливать или получать доступ к переменной, связанной с этим набором свойств объекта массива. Свойства объекта массива и список элементов массива разделены, и операции обхода массива и мутации не могут быть применены к этим именованным свойствам.

Object.assign не знает разницы между массивом и объектом, а просто назначает ключи из параметров 2+ для объекта с параметром 1. Такое поведение не должно вызывать удивления.

const a = [];
a.foo = 42;
const b = Object.assign([], a);                  // sure, why not?
console.log(typeof a, typeof b, b.foo);          // => object object 42
console.log(Array.isArray(a), Array.isArray(b)); // => true true

Ответ 2

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

Не совсем понятно, что вы хотите сделать, обычно используется Object.assign() с литералами объекта, а не с массивами. У них есть свои функции.

Object.assign({}, n);

был бы вменяемый случай использования.

Ответ 3

Object.assign() просто Object.assign() перебирает перечисляемые ключи всех объектов, начиная со второго параметра, и добавляет их к target объекту.

Итак, Object.assign(arr, obj) примерно сводится к (polyfill):

for(key in obj)
  arr[key] = obj[key]

Эту технику можно использовать, когда вы хотите обновить определенный индекс массива без изменения исходного массива (как в реакции)

Итак, этот код

const arr = [1, 2, 3, 4]
const clone = [...arr]
clone[2] = 10;
console.log(arr, clone)

Ответ 4

Если вы хотите изменить объект в массив, вы должны сделать это:

var n = {"aa":"x","dd":'d'};

for (let [key, value] of Object.entries(n)) {
console.log('${key}: ${value}');
}

Метод Object.entries() возвращает массив пар из перечисленных объектов со свойством строкового ключа [ключ, значение] в указанном объекте в том же порядке, что и в цикле for... in (разница состоит в том, что for в цикле перечисляет свойства и в цепочке прототипов). Порядок массива, возвращаемого Object.entries(), не зависит от того, как определен объект.

Ответ 5

Массивы {} в Javascript

Рассматривать:

let obj = {"keyOne":"keyOneValue!", "keyTwo":'keyTwoValue!'};
let array = Object.assign([], obj);

console.log('Array is', array);
console.log('Array keys are currently: ', Object.keys(array));
console.log('array.keyOne value:', array.keyOne);
console.log('array.keyTwo value:', array.keyTwo);
console.log('But Array length is', array.length);
array.push('hello');
console.log('Array push one element array.push("hello")');
console.log('Array length after push', array.length);
console.log('Array keys are now!!!', Object.keys(array));