Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поведение имени свойства объекта в кавычках (https://javascript.ru/forum/misc/76419-povedenie-imeni-svojjstva-obekta-v-kavychkakh.html)

JS_Johny 10.01.2019 04:41

Поведение имени свойства объекта в кавычках
 
Друзья, подскажите верно-ли я понимаю,
что если у объекта есть 2 одинаковых имени свойств,
одно из которых указанно в кавычках, то указанное в кавычках
будет скрыто до тех пор, пока есть то, без кавычек?
Пример:

var obj = {
  '21': 1,
  //21: 2,
  22: 3
}

alert( Object.keys(obj) ); // 21, 22
alert( Object.values(obj) ); // 1, 3

var obj = {
  '21': 1,
  21: 2,
  22: 3
}

alert( Object.keys(obj) ); // 21, 22
alert( Object.values(obj) ); // 2, 3

Rise 10.01.2019 09:01

Object.keys(object) возвращает массив строк, alert(array) приводит массив к строке, непримитивы приводятся к строке методом .toString(), array.toString() возвращает конкатенацию элементов через запятую. Поэтому кавычек, как идентификатора строки, вы не видите.
var array = ['x', '21', 21, 22]; // конкатенация: 'x' + ',' + '21' + ',' + 21 + ',' + 22
alert(array);

Все имена свойств структуры Object приводятся к строке, поэтому 21 становится '21' и перезаписывает предыдущий '21', доподлинно установить тип можно через typeof. Если всё же нужно сохранить тип имени, тогда следует использовать структуру Map, это одно из основных ее отличий.
var text = '';

var obj = { '21': 1, 21: 2, 22: 3 };
text += 'Object\n';
for (var key in obj) {
    text += 'key: ' + key + ', type: ' + typeof key + ', value: ' + obj[key] + '\n';
}

var map = new Map([['21', 1], [21, 2], [22, 3]]);
text += 'Map\n';
for (var [key, value] of map) {
    text += 'key: ' + key + ', type: ' + typeof key + ', value: ' + value + '\n';
}
alert(text);

Можно даже переписать .toString() как угодно.
Array.prototype.toString = function() {
    var temp = [], i, v;
    for (i = 0; i < this.length; i++) {
        v = this[i];
        if (typeof v == 'string') v = '"' + v + '"';
        temp.push(i + ': ' + v);
    }
    return '[ ' + temp.join(', ') + ' ]';
};

var array = ['x', '21', 21, 22];
alert(array); // [ 0: "x", 1: "21", 2: 21, 3: 22 ]

JS_Johny 13.01.2019 05:08

Понял! Все дело в перезаписи одноименных свойств)
Спасибо большое!


Часовой пояс GMT +3, время: 01:44.