Skip to main content

+ operator before expression in javascript: what does it do?


I was perusing the underscore.js library and I found something I haven't come 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.


Source: Tips4allCCNA FINAL EXAM

Comments

  1. The 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.

    ReplyDelete
  2. 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".

    ReplyDelete
  3. 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.

    ReplyDelete
  4. 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
    }

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?

CCNA 3 Final Exam => latest version

1 . Which security protocol or measure would provide the greatest protection for a wireless LAN? WPA2 cloaking SSIDs shared WEP key MAC address filtering   2 . Refer to the exhibit. All trunk links are operational and all VLANs are allowed on all trunk links. An ARP request is sent by computer 5. Which device or devices will receive this message? only computer 4 computer 3 and RTR-A computer 4 and RTR-A computer 1, computer 2, computer 4, and RTR-A computer 1, computer 2, computer 3, computer 4, and RTR-A all of the computers and the router   3 . Refer to the exhibit. Hosts A and B, connected to hub HB1, attempt to transmit a frame at the same time but a collision occurs. Which hosts will receive the collision jamming signal? only hosts A and B only hosts A, B, and C only hosts A, B, C, and D only hosts A, B, C, and E   4 . Refer to the exhibit. Router RA receives a packet with a source address of 192.168.1.65 and a destination address of 192.168.1.161...