Реализация хранилища в Firefox может хранить только строки, но сентябре 2009 года W3C изменил черновик, чтобы принимать любые данные.Реализация (все еще) еще не догнала( см. Правка ниже ).
Итак, в вашем случае логическое значение преобразуется в строку.
Что касается того "true" != true, почему , как написано в описании Equal ( ==) в MDC *:
Если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение. Если один из операндов является числом или логическим значением, операнды по возможности преобразуются в числа ; иначе, если один из операндов является строкой, другой операнд преобразуется в строку, если это возможно.
Обратите внимание, что строка преобразуется в число вместо логического . Поскольку "true"преобразовано в число NaN, оно не будет равно ничему, поэтомуfalse возвращается.
(*: Фактический стандарт см. В ECMA-262 §11.9.3 «Абстрактный алгоритм сравнения равенства»)
Edit:setItem интерфейс был вернулся принимать строки только на сентябрь 1 - го проекта 2011 года в соответствии с поведением существующих реализаций, так как ни один из поставщиков не заинтересованы в поддержке хранящих не-строк. Подробнее см. Https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 .