Идентификатор JavaScript на строках

Я пытаюсь написать прототип для определения, является ли строка пустой. Это действительно просто игра с JS и прототипом, ничего важного. Здесь мой код:

String.prototype.IsEmpty = function() {
  return (this === "");
}

Примечание. Я использовал сравнение идентичности === вместо равенства ==. Когда я запускаю функцию с указанным выше определением:

"".IsEmpty(); // false

Если я задаю определение использовать == как:

String.prototype.IsEmpty = function() {
  return (this == "");
}

Новый def'n будет делать:

"".IsEmpty(); // true

Я не понимаю, почему === не работает, поскольку "" идентичен ""

Ответ 1

Это потому, что "" является примитивом строки, но когда вы вызываете .IsEmpty(), он неявно преобразуется в объект String.

Вам нужно вызвать на него .toString():

String.prototype.IsEmpty = function() {
  return (this.toString() === "");
}

Интересно, что это зависит от браузера - typeof this есть String в Chrome.

Как указывает @pst, если вы должны были преобразовать другой способ и сравнить this === new String("");, он все равно не будет работать, так как это разные экземпляры.

Ответ 2

=== является личность (тот же объект, x is x **). == - равенство (то же значение, x выглядит как y).

Позволяет воспроизвести некоторые (Rhino/JS 1.8):

{} === {} // false
new String("") === new String("") // false
typeof new String("") // object

"" === "" // true
typeof "" // string
f = function () { return "f" };
"foo" === f() + "oo" // true

String.prototype.foo = function () { return this; };
typeof "hello".foo() // object -- uh, oh! it was lifted

Итак, что только что произошло?

Разница между объектом String и строкой. Конечно, следует использовать сравнение равенства (или .length).

доказательство в пудинге, в разделе 11.9.6 обсуждается алгоритм оператора ===