Javascript Неопределенная строка Свойство Истина - PullRequest
5 голосов
/ 24 марта 2012

Я часто использовал следующий шаблон в своем Javascript:

x = couldBeNullThing || valueIfItIsNull;

, потому что он превосходит:

x = couldBeNullThing ? couldBeNullThing : valueIfItIsNull;

Я также часто использую небольшой вариант этого же шаблона:

x = x || valueIfXIsNotDefined;

Это все здорово ... кроме проблемы, я недавно обнаружил:

foo = "";
//assert foo.x === undefined;
foo.x = foo.x || valueIfXIsNotDefined;
//assert foo.x === undefined;

Другими словами, если у вас есть строка, и вы делаете string.aPropertyThatStringDoesntHave ||foo, вы не получите ни foo, ни действительного значения;вместо этого вы получаете неопределенное.

Может кто-нибудь объяснить, почему это так?Мне кажется, что если foo.x не определен, то foo.x ||Что-нибудь еще должно всегда приводить к чему-то еще ... так почему бы и нет?

1 Ответ

2 голосов
/ 24 марта 2012

Хотя я знаком с концепцией assert, я не знал, что JavaScript обладает такой функциональностью. Имея это в виду, я могу быть совершенно неправ, но мне кажется, что это утверждение:

assert (foo.x || valueIfXIsNotDefined) === undefined;

... вызывает функцию с именем assert(), передает ей параметр foo.x || valueIfXIsNotDefined, а затем сравнивает возвращаемое значение из функции assert() с undefined. Возможно, что вам нужно, это:

assert(foo.x || valueIfXIsNotDefined === undefined);

Если я попробую что-то похожее с console.log():

var foo = "",
    valueIfXIsNotDefined = "test";
console.log( foo.x === undefined);
console.log(foo.x || valueIfXIsNotDefined === undefined);

Тогда записывается:

true
false

Аналогично, после:

var result = foo.x || valueIfXIsNotDefined;

result - это "test".

http://jsfiddle.net/YBPyw/

Кроме того, если вы на самом деле попытаетесь присвоить foo.x равное чему-либо (где foo была строкой), это не сработает, поэтому при последующем тестировании foo.x это даст undefined.

...