Объекты и их ключи [дубликат]

275
09 октября 2018, 00:50

На данный вопрос уже ответили:

  • Какова максимальная длина строки ключа (свойства) объекта? 1 ответ

TypeScript

{ 
    let foo = function () { } 
    let o = {} 
    o[foo] = 'test string' 
    console.log(`o[foo]: ${o[foo]}`) 
    // Type '() => void' cannot be used as an index type. 
}

документация мозиллы

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Map#Сходство_объектов_и_map

  • В объекте ключи должны быть строками, когда в Map они могут иметь любой тип.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Objects_and_maps_compared

  • The keys of an Object are Strings and Symbols, whereas they can be any value for a Map, including functions, objects, and any primitive.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#Parameters

Pairs of names (strings) and values (any value) where the name is separated from the value by a colon.

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object#Параметры

Пары из имён (строки) и значений (любые значения), где имя отделяется от значения двоеточием.

Вопрос:

  1. пруфы на ecmascript? или ...
    а вообще кого считать авторитетным источником ?
    да, есть ли у хрома анлог документации MDN ?

  2. возможно какие-либо рекомендации от разработчиков(хрома) ?

  3. а как оно вообще работает ?

например в приведённом ниже коде ключ [arr] это ссылка ?
если да - а как там со сборщиком мусора и доступом из корня ? ( на сегодня, жеж, вроде как победили перекрёстные ссылки. тема отдельного вопроса, но всё же, если кто в курсе - прошу поделиться ходя бы ссылками. например отредактировав это вопрос)

{ 
    let el = function () { 
        let t = Date.now() 
        document.body.innerHTML += `<table id="log${t}"></table>` 
        return document.getElementById('log' + t) 
    }() 
    let log = (_f = '<hr>') => 'string' == typeof _f 
        ? el.innerHTML += `<tr> <td><hr></td> <td>${_f}</td></tr>` 
        : el.innerHTML += `<tr> <td>${_f.toString()}</td> <td>${_f()}</td></tr>` 
    // --- 
    let arr = ['a'] 
    let o = { 
        [arr]: 'test' 
    } 
    // -- 
    log(() => o[['a']]) 
    log(() => o[arr]) 
    log() 
    arr = undefined 
    log(() => o[['a']]) 
    log(() => o[arr]) 
}

Answer 1
{
    let foo = function () { }
    let o = {}
    o[foo] = 'test string'
    console.log(`o[foo]: ${o[foo]}`)
    // Type '() => void' cannot be used as an index type.
}

Ну и что вам тут не нравится, написано же:

В объекте ключи должны быть строками, когда в Map они могут иметь любой тип.

Вы попробуйте вывести объект, который написали

const prop1 = 10
const prop2 = [1, 2, 3, 4]
const prop3 = {a: 1}
const test = {[prop1]: 'prop1', [prop2]: 'prop2', [prop3]: 'prop3'}
// {1,2,3,4: "prop2", 10: "prop1", [object Object]: "prop3"}

То есть в данном случае, просто неявно вызывается метод toString, либо считает значение переменной. Таким образом можно передавать динамически ключи:

const prop = Math.random() > 0.5 ? 'more': 'less';
const test2 = {[prop]: true};

Про Map отдельная тема, но это и не объект совсем, а скорее новая структура. И ключи там могут быть чем угодно, хоть функцией, хоть объектом. Тут работает обычное сравнение по значению/ссылке

const mapProp = {'prop': 1}
const test3 = new Map();
test3.set(mapProp, true);
test3.get(mapProp)
// true
// объект схож
const mapProp2 = {'prop': 1}
// но это не работает
test3.get(mapProp2)
// undefined

а вообще кого считать авторитетным источником ?

Спецификацию: http://www.ecma-international.org/ecma-262/9.0/index.html

READ ALSO
Переключение стилей

Переключение стилей

Помогите додумать кодУ меня есть 3 блока с текстом и чекбокосм, при переключении блоков я меняю фон и текст, но мне так же надо менять цвет...

196
Angular js preloader

Angular js preloader

Как сделать прелоадер для ангуляра(роунтинг) который будет пропадать только после полной загрузки страницы ?

179
Как использовать Mobile SDK VK API?

Как использовать Mobile SDK VK API?

Прошу помочь разобраться с темой использования VK API в Direct Games вконтактеЕсть прототип игры и хотел разобраться с работой api

188
Вставить перенос строки в текст typescript

Вставить перенос строки в текст typescript

Есть приложение на Angular 6 в котором используется typescript соответственноЕсть кнопка копирования статистики из разных частей страницы

291