Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.01.2019, 03:41
Новичок на форуме
Отправить личное сообщение для JS_Johny Посмотреть профиль Найти все сообщения от JS_Johny
 
Регистрация: 01.01.2019
Сообщений: 9

Поведение имени свойства объекта в кавычках
Друзья, подскажите верно-ли я понимаю,
что если у объекта есть 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
Ответить с цитированием
  #2 (permalink)  
Старый 10.01.2019, 08:01
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,125

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 ]

Последний раз редактировалось Rise, 10.01.2019 в 08:46.
Ответить с цитированием
  #3 (permalink)  
Старый 13.01.2019, 04:08
Новичок на форуме
Отправить личное сообщение для JS_Johny Посмотреть профиль Найти все сообщения от JS_Johny
 
Регистрация: 01.01.2019
Сообщений: 9

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свойства объекта, взятые из свойств этого же объекта. nklf-367 Общие вопросы Javascript 2 17.10.2017 17:36
Знак $ в имени свойства объекта Luca Общие вопросы Javascript 7 07.07.2017 03:06
При вызове локальной функции объекта не могу использовать свойства объекта Gudsaf Общие вопросы Javascript 7 17.09.2016 20:23
Как обратиться к свойству объекта по имени если оно хранится в переменной xaknik Общие вопросы Javascript 2 25.04.2012 22:12
Как при чтении или записи свойства объекта вызывать функцию danik.js Общие вопросы Javascript 3 16.09.2010 16:57