Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Объекты JavaScript могут только использовать строки в качестве ключей (что-либо еще преобразовывается в строку).
Вы могли, альтернативно, поддержать массив, который индексирует рассматриваемые объекты, и используйте его индексную строку в качестве ссылки на объект. Что-то вроде этого:
var ObjectReference = [];
ObjectReference.push(obj);
set['ObjectReference.' + ObjectReference.indexOf(obj)] = true;
, Очевидно, это является немного подробным, но Вы могли записать несколько методов, которые обрабатывают его и получают и устанавливают все волей-неволей.
Редактирование:
Ваше предположение является фактом - это - определенное поведение в JavaScript - конкретно, toString преобразование происходит, означая, что Вы, банка может определить Вашу собственную функцию toString на объекте, который будет использоваться в качестве имени свойства. - olliej
Это поднимает другой интересный момент; можно определить toString метод на объектах, которые Вы хотите хешировать, и это может сформировать их идентификатор хеша.
Если Вы действительно хотите поведение набора (я иду знанием Java), то Вам будет трудно находить решение в JavaScript. Большинство разработчиков рекомендует уникальному ключу представить каждый объект, но это непохоже на набор, в котором можно получить два одинаковых объекта каждый с уникальным ключом. Java API делает работу проверки дублирующиеся значения путем сравнения значений хэш-кода, не ключей, и с тех пор нет никакого представления значения хэш-кода объектов в JavaScript, становится почти невозможно сделать то же. Даже библиотека Prototype JS допускает этот недостаток, когда она говорит:
"Хеш может считаться ассоциативным массивом, связывая уникальные ключи со значениями (которые не обязательно уникальны)..."
Спецификация JavaScript определяет доступ индексируемого свойства как выполнение toString преобразования на имени индекса. Например,
myObject[myProperty] = ...;
совпадает с
myObject[myProperty.toString()] = ...;
, Это необходимо, поскольку в JavaScript
myObject["someProperty"]
совпадает с
myObject.someProperty
И да, он делает меня грустным также :-(
Самый простой способ сделать это - дать каждому из ваших объектов свой собственный уникальный метод 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> в свой хеш, иначе она сотрет запись для вашего выходящего объекта с этим идентификатором.
Теперь все мои хеши совершенно холодные. Я также только что опубликовал запись в блоге несколько дней назад о именно этой теме .