Оператор идентификационных данных JavaScript на строках

У меня есть такая простая идея, вы можете попробовать

class A {} 
class B {}
$dynamicClassName = "A";
eval("class DynamicParent extends $dynamicClassName {}");

class C extends DynamicParent{
   // extends success
   // Testing
   function __construct(){
        echo get_parent_class('DynamicParent'); exit; //A :)
   }
}
10
задан Mark Ursino 21 October 2009 в 21:12
поделиться

2 ответа

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

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

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

Интересно, что это зависит от браузера - тип этого - это строка в Chrome.

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

10
ответ дан 3 December 2019 в 20:05
поделиться

=== - это идентификатор (тот же объект; x равно 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

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

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

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

9
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: