Цитата:
|
Цитата:
https://www.ecma-international.org/e...9.0/index.html Определяется понятие объекта. Определяется, что имена свойства объекта - строки. Вводится понятие "целочисленного индекса" причем для обычных объектов тоже. Но говорится, что это все равно строка 6.1.7 Properties are identified using key values. A property key value is either an ECMAScript String value or a Symbol value. All String and Symbol values, including the empty string, are valid as property keys. A property name is a property key that is a String value. An integer index is a String-valued property key that is a canonical numeric String (see 7.1.16) and whose numeric value is either +0 or a positive integer ≤ 253-1. An array index is an integer index whose numeric value i is in the range +0 ≤ i < 232-1. А дальше добавляется некоторая "экзотика" для объектов Аrray, Snring, Function... Но нигде не говорится, что индекс массива, это что то иное, чем свойство объекта, заданного строкой. Вообще разгвор (мой пост) начался с того, почему не сделать в javascript отрицательные "индексы" у массивов. Потому, что они уже есть. Но у них другая семантика. А менять семантику того, что уже есть, и быть может, как то кем то используется - низя! |
Экзотика, не экзотика, но индекс определен, это ни какое-то эфемерное понятие. )
А если углубляться и для различных языков, то "Чем обычный объект не ассоциативный массив?" в JS, это нечто приближенное, а в РНР именно ассоциативный массив. А если привести его к объекту, то работать с ним как с массивом уже не получится. В js можно и так object.property, и так object[property], а вот в РНР с объектом только так object->property, а так object[property], это фатальная ошибка. |
Цитата:
Ну в С или каком другом языке это можно понять как номер элемента в последовательности, расположенной в памяти. А если так let a = []; a[0]=0; a[1]=1; a[3]=3; console.log(a[2]); // undefined ну нет элемента, так чего с него взять. А если так Array.prototype['2']=2; let a = []; a[0]=0; a[1]=1; a[3]=3; console.log(a[2]); // 2! Ух ты! Так его же нет! И получается, что массив ведет себя как голимый объектишко. И когда нет элемента с индексом, он зачем то лезет в прототип. Прототип то объект - у него нет индексов, а только свойства с именами. А наш массив зачем то вместо индекса лезет за свойством по его имени. Да просто индексы - это всего лишь имена (строковые) свойств. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Т. е. вы можете обработать отдельно и собственные свойства списка как объекта и индексы списка. var xs = [1,2,3]; xs["1.5"] = 15; xs["-1"] = -1; console.group("собственные свойства списка как объекта"); for(const [key, value] of Object.entries(xs)) { console.log("свойство:", key, "значение:", value); } console.groupEnd(); console.group("индексы списка"); for(const [index, element] of xs.entries()) { console.log("индекс:", index, "элемент:", element); } console.groupEnd(); var a = []; a[15] = "⛵"; a[4371813261] = "⛴"; alert(a.length); // 16 Цитата:
Цитата:
Цитата:
Ассоциативный массив — это такой тип данных — коллекция, состоящая из таких пар (ключ, значение) — что всевозможные ключи представлены в ней только один раз. Смотрим в PHP, разные ключи 5 и "5" не могут быть представлены в так называемом «ассоциативном массиве», а значит — это не настоящий ассоциативный массив. <?php $a = [ 5 => "Hi, guys!", "5" => "Hi, y’all!" ]; echo json_encode([ length => count($a), keys => array_keys($a), elements => array_values($a) ], JSON_PRETTY_PRINT); Запускаем... Код:
~ via 🐘 v7.0.33 Ассоциативный массив реализован, например, в C# — Dictionary, Java — HashMap, JavaScript — Map. Цитата:
Цитата:
var a = new Float64Array(4); console.log(a); // массив заполнен нулями // изменяем массив a[0]=0; a[1]=1; a[3]=3; console.log(a[2]); // 0, а вы ожидали что-то другое? Цитата:
Однако именно свойства, представленные целыми числами от 0 до 4294967294 означают индексы списка, по которым можно получить соответствующие элементы списка. Все методы списка работают именно с индексами. Рассмотрим ещё пару примеров с вашим списком... var xs = [1,2,3]; xs["1.5"] = 15; xs["-1"] = -1; // элементы списка можно получить по индексам alert(JSON.stringify(xs)); var a = new Array(4); console.log(a); // список ничем не заполнен [empty × 4] // изменяем список a[0]=0; a[1]=1; a[3]=3; console.log(a); // [0, 1, empty, 3] // только для voraa, если вам нужен массив с предопределёнными // значениями, то используйте наследование от класса Array Array.prototype[2] = 2; Array.prototype[20] = 20; var a = new Array(4); console.log(a); // список ничем не заполнен [empty × 4] /* Однако на самом деле теперь индексы 2 и 20 есть у всех массивов, однако инициализируя массив при помощи [] или new Array(4), свойство length определяется на самом списке (у каждого списка своя длина) { length: 4, __proto__: { "2": 2, "20": 20, length: 21, constructor: Array, // остальные методы и свойства __proto__: { constructor: Object, // остальные методы и свойства объекта __proto__: null } } } */ // изменяем список a[0]=0; a[1]=1; a[3]=3; console.log(Array.from(a)); // [0, 1, 2, 3] // Однако ручная инициализация приводит к тому, // что видны все элементы console.log(({ __proto__: Array.prototype }).map(v => v)); // [empty × 2, 2, empty × 17, 20] // Ещё пример... var b = { __proto__: Array.prototype }; b.push(22); console.log(b); // [empty × 21, 22] console.log(Array.from(b)); // [undefined × 2, 2, undefined × 17, 20, 22] Списки так работают, поскольку они не используют отдельный объект для своих элементов, что компенсируется тем, что у списков есть множество методов, что позволяет исключить прямое манипулирование индексами. Цитата:
array.slice(-1).forEach(item => { // do something with last item }); Вытаскивание элемента из контейнера (в данном случае список) предполагает дополнительные проверки! const item = array.last(); if(item) { // do something with last item }); |
Malleys,
:thanks: |
Стоило открывать дважды Америку, если и ежик знает, что массив не может содержать дубликаты ключей, как и объект дубликаты свойств, ключ/свойство примет последнее значение. А чтобы это увидеть JS совсем и не нужен.
$a = [3=> 1, '3'=> 2]; print_r($a); print_r((object)$a); Array ( [3] => 2 ) stdClass Object ( [3] => 2 ) |
Цитата:
Код:
➜ php --interactive Цитата:
Цитата:
var a = new Map(); a.set(3, 1); a.set("3", 2); console.log(a); // Map(2) {3 => 1, "3" => 2} console.log(a.size); // 2 |
Цитата:
Цитата:
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 01:09. |