#ИМЯ?

Я просматривал библиотеку underscore.js, и я обнаружил, что раньше не сталкивался:

if (obj.length === +obj.length) { ... }

Что там делает оператор +? Для контекста, здесь прямая ссылка в эту часть файла.

Ответ 1

Унарный оператор + может использоваться для преобразования значения в число в JavaScript. Подчеркивание, похоже, проверяет, что свойство .length является числом, в противном случае оно не будет равно самому преобразованному в номер.

Ответ 2

Согласно MDN:

Оператор унарного плюса предшествует своему операнду и оценивает его операнд, но пытается преобразовать его в число, если оно не уже. Например, y = + x принимает значение x и присваивает это у; то есть, если x равно 3, y получит значение 3 и x сохранит значение 3; но если x - строка "3", y также получит значение 3. Хотя унарное отрицание (-) также может конвертировать не числа, унарный плюс является самым быстрым и предпочтительным способом преобразования чего-либо в номер, поскольку он не выполняет никаких других операций с номер. Он может преобразовывать строковые представления целых чисел и поплавков, а также нестрочные значения true, false и null. Целые числа в поддерживаются как десятичные, так и шестнадцатеричные ( "0x" -предоставляемые) форматы. Отрицательные числа поддерживаются (хотя и не для hex). Если он не может проанализируйте определенное значение, оно будет оцениваться до NaN.

Ответ 3

Это способ гарантировать, что obj.length является числом, а не потенциальной строкой. Причиной этого является то, что === не удастся, если длина (по какой-либо причине) является строковой переменной, например. "3".

Ответ 4

Хороший хак, чтобы проверить, имеет ли тип obj.length тип number или нет. Вы видите, что оператор + может использоваться для принудительного принуждения строки. Например:

alert(+ "3" + 7); // alerts 10

Это возможно, потому что оператор + принуждает строку "3" к числу 3. Следовательно, результат 10, а не "37".

Кроме того, JavaScript имеет два типа операторов равенства и неравенства:

  • Строгое равенство и неравенство (например, 3 === "3" выражает ложь).
  • Нормальное равенство и неравенство (например, 3 == "3" выражает true).

Строгое равенство и неравенство не вызывают ценности. Следовательно, число 3 не равно строке "3". Нормальное равенство и неравенство действительно ценят ценность. Следовательно, число 3 равно строке "3".

Теперь приведенный выше код просто принуждает obj.length к числу с помощью оператора + и строго проверяет, являются ли значения до и после принуждения одинаковыми (т.е. obj.length типа number). Он логически эквивалентен следующему коду (только более кратким):

if (typeof obj.length === "number") {
    // code
}