Я просматривал библиотеку 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
}