Reputation: 565
I am really baffled as to why the following code should work in Javascript:
var string = '1233'
console.log(typeof string) // prints string
console.log(string % 2) // prints 1
var result = string - 4
console.log(result) // prints 1229
Why are operators like % and - are allowed on strings ? Does Javascript try to convert the string to the number ? (type promotion of sorts)
P.S. I am from C++ background.
Upvotes: 1
Views: 66
Reputation: 371019
Because the specification says so. %
(and *
and /
) are MultiplicativeOperator
s, and when any of those are used, both sides of the operator are converted to numbers:
- Let lnum be ? ToNumeric(leftValue).
- Let rnum be ? ToNumeric(rightValue).
- If Type(lnum) is different from Type(rnum), throw a TypeError exception.
- Let T be Type(lnum).
- If MultiplicativeOperator is *, return T::multiply(lnum, rnum).
- If MultiplicativeOperator is /, return T::divide(lnum, rnum).
Else,
a. Assert: MultiplicativeOperator is %.
b. Return T::remainder(lnum, rnum).
The same sort of thing is happening when -
is used on non-numbers - both sides are coerced to numbers first, after which the operation is performed. It doesn't throw an error, unless one of the ToNumeric
s returns a number
, and the other ToNumeric
returns a bigint
. BigInts are the only type which require the explicit type casting you're expecting.
Note that in Typescript, which is a (mostly) type-safe version of Javascript, this sort of thing does result in an error, specifically:
The right-hand (or left-hand) side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ts(2363)
But standard Javascript, in the case of conflicting type issues like these, almost always prefers to attempt to carry out the operation instead of throwing errors. For similar reasons, you can do
const obj = {};
const someStr = 'foo' + obj;
console.log(someStr);
Which doesn't make much sense, since obj
is an object (and can't be very meaningfully +
d with a string in most situations), but the language doesn't prohibit it.
Upvotes: 3
Reputation: 1147
It's happening because when you try to make mathematical operations with string where you have numbers only, Javacript is trying to convert them to number in order to make this operation. It is called "Type coercion" More information can be founded in MDN
Upvotes: 0