I was perusing the underscore.js library and I found something I haven't e across before:
if (obj.length === +obj.length) { ... }
What is that +
operator doing there? For context, here is a direct link to that part of the file.
I was perusing the underscore.js library and I found something I haven't e across before:
if (obj.length === +obj.length) { ... }
What is that +
operator doing there? For context, here is a direct link to that part of the file.
- 1 possible duplicate of Whats the significant use of Unary Plus and Minus operators? – Daniel A. White Commented Nov 30, 2011 at 17:50
- It is another way to convert strong to number. You can play with it here jsfiddle/wbednarski/uCm93 – Wojciech Bednarski Commented Nov 30, 2011 at 18:00
-
It does seem a little strange to use
===
with a type conversion. – jfriend00 Commented Nov 30, 2011 at 18:00 -
@jfriend00 A little bit. However I think they use
===
by convention everywhere and it is good practice. – Wojciech Bednarski Commented Nov 30, 2011 at 18:02 - @DanielA.White It's kinda a duplicate, but I think the question is useful as unless you already know what a 'unary plus operator' is you wouldn't find the other question. – Ben Clayton Commented Nov 30, 2011 at 18:49
4 Answers
Reset to default 7The unary +
operator can be used to convert a value to a number in JavaScript. Underscore appears to be testing that the .length
property is a number, otherwise it won't be equal to itself-converted-to-a-number.
According to MDN:
The unary plus operator precedes its operand and evaluates to its operand but attempts to converts it into a number, if it isn't already. For example, y = +x takes the value of x and assigns that to y; that is, if x were 3, y would get the value 3 and x would retain the value 3; but if x were the string "3", y would also get the value 3. Although unary negation (-) also can convert non-numbers, unary plus is the fastest and preferred way of converting something into a number, because it does not perform any other operations on the number. It can convert string representations of integers and floats, as well as the non-string values true, false, and null. Integers in both decimal and hexadecimal ("0x"-prefixed) formats are supported. Negative numbers are supported (though not for hex). If it cannot parse a particular value, it will evaluate to NaN.
It's a way of ensuring that obj.length is a number rather than a potential string. The reason for this is that the === will fail if the length (for whatever reason) is a string variable, e.g. "3".
It's a nice hack to check whether obj.length
is of the type number
or not. You see, the +
operator can be used for string coercion. For example:
alert(+ "3" + 7); // alerts 10
This is possible because the +
operator coerces the string "3"
to the number 3
. Hence the result is 10
and not "37"
.
In addition, JavaScript has two types of equality and inequality operators:
- Strict equality and inequality (e.g.
3 === "3"
expresses false). - Normal equality and inequality (e.g.
3 == "3"
expresses true).
Strict equality and inequality doesn't coerce the value. Hence the number 3
is not equal to the string "3"
. Normal equality and inequality does coerce the value. Hence the number 3
is equal to the string "3"
.
Now, the above code simply coerces obj.length
to a number using the +
operator, and strictly checks whether the value before and after the coercion are the same (i.e. obj.length
of the type number
). It's logically equivalent to the following code (only more succinct):
if (typeof obj.length === "number") {
// code
}