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

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex