JavaScript如何在运行时推断实例类型?

时间:2012-04-13 13:06:00

标签: javascript types runtime

编写JavaScript时,我总是理所当然地认为将两个整数相加会产生另一个整数。或者将两个字符串一起添加将导致连接。但我开始思考,在使用这些实例执行操作之前,语言如何确定幕后实例的类型?

var one = 1;
var two = 2;
var fourStr = 'four';
var floaty = 1.5;

//this results in an integer
var three = one + two;           //3

//but this results in a string
var result = fourStr + one;      //'four1'

//and this results in a float
var floatenized = one + floaty;  //2.5

运行时是否只确定实例类型然后引用某种内部类型优先级?任何人都可以完全解释如何运行时执行这些操作结合了不同类型的实例?

2 个答案:

答案 0 :(得分:3)

ecmascript specification确切地描述了+(第11.6.1节)等运营商如何使用不同类型的行为。

与您的示例相关:

  • (数字)+(数字):结果将是浮点数的总和
  • (string)+(number):结果将是字符串和数字字符串represantation的串联
  • (number)+(字符串):结果将是数字和字符串的字符串represantation的串联

但是+也可以作为一元运算符将字符串转换为数字,就像二进制-运算符一样(例如:+"4"+5==9,{{1} })。

类型转换算法在规范的第9节中描述。未指定环境应如何存储基元和对象的类型。

答案 1 :(得分:2)

为变量分配数字时

var one = 1;
//or
var floaty = 1.5;

值类型是数字....当您将字符串分配给变量

var fourStr = 'four';

值类型是字符串。当您添加字符串和数字时,它会将数字转换为字符串,然后连接2个字符串

See the values section of this doc from Mozilla