Что означает пара ключ-значение в квадратных скобках []?
Давайте рассмотрим следующее это мой объект:
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));