Я часто использовал следующий шаблон в моем Javascript:Javascript Неопределенное Строка собственности Truthiness
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 || anythingElse всегда должен приводить к чему-либоElse ... так почему же это не так?
Интересно, что это работает, если вы делаете 'foo = new String (" ")' – Gohn67
Еще одна вещь, которую я заметил, заключается в том, что использование 'console.log (foo)' возвращает (пустая строка) "и когда используя новый String (""), он возвращает объект String. Кроме того, я нахожусь в Firefox. Может отличаться в других браузерах. – Gohn67
Уг извините за спам. Но это интересный вопрос. Также 'foo = String (" ")' возвращает "(пустая строка). Кроме того, что-то вроде 'foo =" Test ".substr (1)' возвращает только строковое значение, а не объект. – Gohn67