Идентификатор 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 обсуждается алгоритм оператора ===