+ оператор перед выражением в javascript: что он делает? - PullRequest
11 голосов
/ 30 ноября 2011

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

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

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

Ответы [ 4 ]

7 голосов
/ 30 ноября 2011

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

4 голосов
/ 30 ноября 2011

Согласно MDN :

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

3 голосов
/ 30 ноября 2011

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

2 голосов
/ 30 ноября 2011

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

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

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

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

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

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

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

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