Javascript возвращает строку о том, что должно быть сокращенным логическим тестом - PullRequest
7 голосов
/ 28 марта 2012

Может кто-нибудь объяснить мне, почему это возвращает пустую строку ("") вместо логического (false)?

var x = "";
alert(x && x.length > 0);

... Хотя это работает, как ожидалось, возвращая true:

var y = "abc";
alert(y && y.length > 0);

Я просто пытаюсь сделать простую стенографическую проверку, чтобы увидеть, существует ли значение в переменной (убедитесь, что оно не неопределенное, не пустое или не пустая).каждый тест по отдельности (x == null, typeof x == 'undefined', x == '') - я просто пытаюсь понять, почему Javascript возвращает строку для того, что выглядит как логический тест.

Ответы [ 3 ]

7 голосов
/ 28 марта 2012

Когда условный оператор в JavaScript выполняется, он возвращает последнее оцененное значение.

var x = "";
alert(x && x.length > 0);

Пустая строка: falsey , поэтому при использовании только x вусловие, это будет ложь .Поскольку вы используете &&, если LHS false , то нет причин беспокоиться о проверке RHS.Это оценка короткого замыкания .Поэтому последняя оцененная часть, пустая строка, возвращается в alert().

var y = "abc";
alert(y && y.length > 0);

Непустая строка - truey .Таким образом, LHS равен true , и, поскольку это &&, RHS оценивается (необходимо знать, является ли все условие true ).Возвращаемое значение y.length > 0 равно true, поэтому оно передается вашему alert().

0 голосов
/ 28 марта 2012

Условные операции с использованием && (оператор AND) прекращаются, когда:

  • Одно из условий оценивается как false
  • Он успешно дошел до конца, оценив все до true

Результат условных операций будет оцениваться последним перед остановкой (не обязательно boolean)

Чтобы принудительно вернуть real boolean, вы можете обернуть все вокруг !!(...), пример:

alert(typeof !!(...) === "boolean"); //will always be true no matter what conditions are inside
0 голосов
/ 28 марта 2012

Возвращается и пустая строка, потому что x уже определен, просто пуст.

Это приводит к тому, что первая часть вашего выражения alert(x) показывает пустую строку.

Если вам нужночтобы проверить наличие пустой или пустой строки, попробуйте что-то вроде этого.

String.isNullOrWhiteSpace = function (str) {
    if (typeof str === "string") {
        var isNullOrWhiteSpace = false;

        // Check for null string
        if (str == null || typeof str === "undefined") isNullOrWhiteSpace = true;

        // Check for string with whitespace
        if (str.replace(/\s/g, '').length < 1) isNullOrWhiteSpace = true;

        return isNullOrWhiteSpace;
    }

    if (typeof str === "undefined" || str == null) {
        return true;
    }
};
...