JavaScript 中的隐式转换

316 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

算术运算符 -、*、/ 和 % 在计算之前都会尝试将其参数转换为数字。而算术符 +,既重载了数字相加,又重载了字符串连接操作。

加法运算是左结合律

null 在算术运算中不会导致失败而是隐式地转换为0

一个未定义的变量将被转换为特殊的浮点数值NaN(not a number)

无奈的是,即便是测试NaN值也是异常困难。这有两个原因。

  • JavaScript遵循了IEEE浮点数标准令人头痛的要求—NaN不等于其本身
 let x = NaN;
 x === NaN; //false

另外,标准的库函数 isNaN也不是很可靠,因为它带有自己的隐式强制转换,在测试其参数之前,会将参数转换为数字(isNaN函数的一个更精确的名称可能是 coercesToNaN)。如果你已经知道一个值是数字,你可以使用 isNaN函数测试它是否是NaN。

 isNaN(NaN); //true

但是对于其他绝对不是NaN,但会被强制转换为NaN的值,使用 isNaN方法是无法区分的。

 console.log(isNaN("刘德华"));           // true
 console.log(isNaN(undefined));          // true
 console.log(isNaN({}));                 // true
 console.log(isNaN({ name: "罗老师" }));  // true

最后一种强制转换有时称为真值运算(truthiness)

大多数的 JavaScript值都为真值(truth),也就是能隐式地转换为true,真值运算不会隐式调用任何强制转换方法

JavaScript中有 7 个假值: false、0、-0、”“、NaN、null 和undefined

其他所有的值都为真值。

由于数字和字符串可能为假值,因此,使用真值运算检查函数参数或者对象属性是否已定义不是绝对安全的。

对象也可以被强制转换为原始值。最常见的用法是转换为字符串

 console.log("the Math object" + Math); //the Math object[object Math]
 console.log("the JSON object" + JSON); //the JSON object[object JSON]

对象通过隐式地调用其自身的 toString方法转换为字符串。

 console.log(Math.toString());
 console.log(JSON.toString());

总结

  • 类型错误可能被隐式的强制转换所隐藏。
  • 重载的运算符+是进行加法运算还是字符串连接操作取决于其参数类型。
  • 对象通过 valueof方法强制转換为数字,通过 toString方法强制转换为字符串。
  • 具有 valueof 方法的对象应该实现 toString方法,返回一个 valueof 方法产生的数字的字符串表示。
  • 测试一个值是否为未定义的值,应该使用 typeof 或者与 undefined 进行比较而不是使用真值运算。