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

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.