The code:
var num = 20;
if(num == "20")
{
alert("It works");
}
else
{
alert("Not working");
}
The question:
-
In C programming we have a rule name data type promotion, where when there’s a mix of data type (example: addition of integer and floating point), the integer will first converted to floating point before the addition is being carry out.
-
The code above will prompt me an alert box with the message
"It works"that shows theiftest condition is evaluate to true. -
For loosely typed JavaScript, I’m just curious: is there any rule like C that determines which conversion will be carry out in which situation? Besides that, the JavaScript code above converts
numvariable value from an integer value to string value before making comparison or vice versa?
Yes, all the rules of type conversion applied by the equals operator are described on the ECMA-262 specification, in The Abstract Equality Comparison Algorithm.
The algorithm might look quite complex but it can be summarized to the following cases:
The type the two operands is the same:
If the types of the two operands differ
nullorundefinedIf one of the operands is an Object and the other is a primitive
The Object-to-Primitive conversion is made through an abstract operation called
ToPrimitive, this method will try to convert the object to a primitive value, using the internal[[PrimitiveValue]]method.This will try to ejecute the object’s
valueOfandtoStringmethods, and it will take the value of the first that returns a primitive value.In the case those two methods don’t return a primitive, or they aren’t callable, a
TypeErroris thrown, e.g.:The above statement will produce a
TypeErrorbecause the defaultObject.prototype.valueOfmethod doesn’t do anything more than actually the same object instance (this, not a primitive value) and we are setting an owntoStringproperty that’s not a function.A friend made small tool that might be interesting to you, it shows all the steps and recursive comparisons made between types: