Извините, я что-то сегодня ничего не соображаю :(
Подскажите, пожалуйста, почему такой код:

Выделить код

Код:

var z1=new String("a");
var z2=new String("a");
alert(z1==z2);

В firefox 3.0.6 выводит "false"?

Объекты-то разные каждый раз создаются!!! Каждый вызов процедуры "new"
создает свой объект строкового типа и адресация у объектов разная и объекты
сами хоть и принадлежат к классу строк, но идентифицируются как разные.

Что-то я совсем туплю сегодня в самом деле. Ну разумеется, объекты разные. Но здесь ведь "==" должен значения строк сравнивать? Значения ведь у них одинаковые?
Как же мне тогда сравнить две строки?

Прежде всего z1 и z2 это переменные-объекты у которых есть свои
свойства, атрибуты и методы. Сравнивая два разных объекта получите
false. Как у Вас в Java(Script) я не совсем знаю, ибо сам "делфист",
но по-моему тут будет уместно (а может и нет) сделать так:

alert(z1.value==z2.value);

Но результат не гарантирую... :P

alex_past пишет

Как же мне тогда сравнить две строки?

Бывают объекты, а бывают примитивные значения.

Выделить код

Код:

alert(typeof new String("a"));
alert(typeof "a");
alert(typeof (new String("a").valueOf()));

Неплохая статья на тему

ПротопопулуS: Нет, спасибо, конечно, но непроханже :( Такая запись выведет true при любых значениях.

Вообще, пользы от

Выделить код

Код:

var a = new String("a");

обычно никакой.
Что мешает сделать

Выделить код

Код:

var a = "a";

?

Infocatcher: Спасибо, пойду читать.
Просто нужно чужой код поправить, а там было объявление через new.
Вообще говоря, странно. z=new String("a"); alert(z) ведь без проблем выведет примитивное значение...

alex_past пишет

Вообще говоря, странно. z=new String("a"); alert(z) ведь без проблем выведет примитивное значение...

При выполнении alert происходит преобразование типов.
Как и при, например

Выделить код

Код:

alert(typeof (0 + "a"));

Да, это я понимаю.
А "==" в моём куске кода, выходит, сравнивает адреса строковых объектов вместо их примитивных значений? Жуть какая... :( А я, балбес, был уверен, что он как раз valueOf-ы сравнивать должен.
Спасибо!