Действительно ли там кто-либо - вид функции хэш-кода в JavaScript?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

139
задан Peter Mortensen 9 August 2014 в 15:07
поделиться

4 ответа

Объекты JavaScript могут только использовать строки в качестве ключей (что-либо еще преобразовывается в строку).

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

var ObjectReference = [];
ObjectReference.push(obj);

set['ObjectReference.' + ObjectReference.indexOf(obj)] = true;

, Очевидно, это является немного подробным, но Вы могли записать несколько методов, которые обрабатывают его и получают и устанавливают все волей-неволей.

Редактирование:

Ваше предположение является фактом - это - определенное поведение в JavaScript - конкретно, toString преобразование происходит, означая, что Вы, банка может определить Вашу собственную функцию toString на объекте, который будет использоваться в качестве имени свойства. - olliej

Это поднимает другой интересный момент; можно определить toString метод на объектах, которые Вы хотите хешировать, и это может сформировать их идентификатор хеша.

32
ответ дан 23 November 2019 в 23:21
поделиться

Если Вы действительно хотите поведение набора (я иду знанием Java), то Вам будет трудно находить решение в JavaScript. Большинство разработчиков рекомендует уникальному ключу представить каждый объект, но это непохоже на набор, в котором можно получить два одинаковых объекта каждый с уникальным ключом. Java API делает работу проверки дублирующиеся значения путем сравнения значений хэш-кода, не ключей, и с тех пор нет никакого представления значения хэш-кода объектов в JavaScript, становится почти невозможно сделать то же. Даже библиотека Prototype JS допускает этот недостаток, когда она говорит:

"Хеш может считаться ассоциативным массивом, связывая уникальные ключи со значениями (которые не обязательно уникальны)..."

http://www.prototypejs.org/api/hash

0
ответ дан 23 November 2019 в 23:21
поделиться

Спецификация JavaScript определяет доступ индексируемого свойства как выполнение toString преобразования на имени индекса. Например,

myObject[myProperty] = ...;

совпадает с

myObject[myProperty.toString()] = ...;

, Это необходимо, поскольку в JavaScript

myObject["someProperty"]

совпадает с

myObject.someProperty

И да, он делает меня грустным также :-(

8
ответ дан 23 November 2019 в 23:21
поделиться

Самый простой способ сделать это - дать каждому из ваших объектов свой собственный уникальный метод toString :

(function() {
    var id = 0;

    /*global MyObject */
    MyObject = function() {
        this.objectId = '<#MyObject:' + (id++) + '>';
        this.toString= function() {
            return this.objectId;
        };
    };
})();

У меня была та же проблема, и это прекрасно решило ее для меня с минимальной суетой, и это было намного проще, чем повторная реализация некоторого жирного стиля Java Hashtable и добавление equals () и hashCode () в классы объектов. Просто убедитесь, что вы также не вставляете строку '<#MyObject: 12> в свой хеш, иначе она сотрет запись для вашего выходящего объекта с этим идентификатором.

Теперь все мои хеши совершенно холодные. Я также только что опубликовал запись в блоге несколько дней назад о именно этой теме .

31
ответ дан 23 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: