前端编码建议: JavaScript数据类型的特殊性

835 阅读1分钟

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

前端编码建议: JavaScript数据类型的特殊性

1.防止浮点数溢出

二进制的浮点数不能正确处理十进制的小数, 因此 0.1 + 0.2 不等于 0.3

num = 0.1 + 0.2; //0.30000000000004

建议使用 Decimal.js 库

2. 慎用 JavaScript 类型自动转换

3. 正确检测数据类型

使用 typeof 运算符返回一个用于识别其运算数类型的字符串。对于任何变量 来说,使用 typeof 运算符总是以字符串的形式返回以下6种类型之一:

  • number
  • string
  • boolean
  • object
  • function
  • undefined

typeof 检测 null 值时返回的是 object 而不是 null

function type (o) {
  return (o === null) ? "null" : (typeof o);
}

注意: typeof 不能检测复杂的数据此类型,以及各种特殊用途的对象,比如 RegExp, Date,Math等

对于Object或Array,可以使用 constructor 属性, 该属性值引用的是原来构造该对象的函数。如果结合 typeof 运算符和 constructor 属性, 基本能够完成数据类型的检测。

valuetypeof valuevalue.constructor
var value = 1"number"Number
var value = "a""string"String
var value = true"boolean"Boolean
var value = {}"object"Object
var value = new Object()"object"Object
var value = []"object"Array
var value = new Array()"object"Array
var value = function() {}"function"Function
function className(){}"object"className

但是对于 undefined 和 null 特殊值不能使用constructor, JavaScript 会抛出异常。

对于直接量也不能使用 constructor 需要加上一个小括号

使用 toString() 检测对象类型是最安全、最准确的。 调用 toString()方法把对象转换成字符串, 然后通过检测字符串中是否包含数组所特有的标志字符可以确定对象的类型。

let test = "123"
console.log(Object.prototype.toString.call(test)); // [object String]
test = null
console.log(Object.prototype.toString.call(test)); // [object Null]
test = []
console.log(Object.prototype.toString.call(test)); // [object Array]