Я просматривал библиотеку underscore.js, и я обнаружил, что раньше не сталкивался:
if (obj.length === +obj.length) { ... }
Что там делает оператор +
? Для контекста, здесь прямая ссылка в эту часть файла.
Я просматривал библиотеку underscore.js, и я обнаружил, что раньше не сталкивался:
if (obj.length === +obj.length) { ... }
Что там делает оператор +
? Для контекста, здесь прямая ссылка в эту часть файла.
Унарный оператор +
может использоваться для преобразования значения в число в JavaScript. Подчеркивание, похоже, проверяет, что свойство .length
является числом, в противном случае оно не будет равно самому преобразованному в номер.
Согласно MDN:
Оператор унарного плюса предшествует своему операнду и оценивает его операнд, но пытается преобразовать его в число, если оно не уже. Например, y = + x принимает значение x и присваивает это у; то есть, если x равно 3, y получит значение 3 и x сохранит значение 3; но если x - строка "3", y также получит значение 3. Хотя унарное отрицание (-) также может конвертировать не числа, унарный плюс является самым быстрым и предпочтительным способом преобразования чего-либо в номер, поскольку он не выполняет никаких других операций с номер. Он может преобразовывать строковые представления целых чисел и поплавков, а также нестрочные значения true, false и null. Целые числа в поддерживаются как десятичные, так и шестнадцатеричные ( "0x" -предоставляемые) форматы. Отрицательные числа поддерживаются (хотя и не для hex). Если он не может проанализируйте определенное значение, оно будет оцениваться до NaN.
Это способ гарантировать, что obj.length является числом, а не потенциальной строкой. Причиной этого является то, что === не удастся, если длина (по какой-либо причине) является строковой переменной, например. "3".
Хороший хак, чтобы проверить, имеет ли тип 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
}