9

This is purely an educational question.

I'm working on a new version of a web app that the company I'm working for had made earlier. when re-writing the math, I came across this:

document.getElementById("estResidual").value-0;

Thinking there was no purpose for the "-0", I removed it. But when I tried the calculations, the numbers were waaayyyyyy off. Then I tried re-adding the "-0", and voila! everything worked nicely.

The Question: What did the "-0" do to change the value?

2
  • 1
    Note - when you use + 0 it might still look like a concatenation. There is no confusion with the minus. Commented Mar 4, 2014 at 20:24
  • 1
    @Floris - just re-read your comment and realized that too... so I deleted mine. :) Commented Mar 4, 2014 at 20:34

3 Answers 3

19

It's an (ab)use of JavaScript's soft typing behavior. In this case, it will convert a string to a float:

> "13"
"13"
> "13"-0
13
> "1.01"-0
1.01

Unary + will do the same:

> +"13"
13
> +"9.9"
9.9

Note that using + will instead convert the integer 0 into a string and concatenate it:

> "13"+0
"130"

This is all standardized. For explicit details on how these operators should behave, you can always check the ECMAScript Language Specification (e.g. addition, subtraction. unary plus).

Sign up to request clarification or add additional context in comments.

3 Comments

Why "abuse"? Certainly learning different ways to use a language is a beneficial thing, no? Or is this a practice that's best avoided due to the ease with which problems could occur with sloppy coding?
@DanTheGameMan: I personally don't like it because it's not obvious at all what the intent is. After all, you had to ask on stackoverflow what it does =). And then seeing that -0 works, you might expect +0 to work the same way, given the properties of arithmetic, but that gives you a totally different result! I'd recommend using parseInt() or parseFloat()
parseFloat seems to work nicely, and it is indeed much clearer on what's happening
1

The JS engine re-casts on the fly to try and make statements work. So JS will cast "23" to an integer 23 when you try to perform math on it, and likewise it will convert integer 23 to string "23" if you do something like:

var a = 23;
console.log(23 + "asdf");
//outputs "23asdf"

1 Comment

It's not really a static typing issue. A statically typed language could have this exact behavior, wherein the type of the expression <string> - <integer> would be <integer>.
1

That forces the type of object to become a number rather than a string.

1 Comment

well Claudiu's answer is way better than mine

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.