js 常见的隐式转换

我们常常会用到 js 来做对比或者是计算,通常 js 中的数据转换,或者使用 parseInt ,那我们来对比看看他们的耗时

这里我们新建一个方法

function foo() { }
foo.valueOf = ()=> {
  return 5
}

测试他们转换为 number 的耗时

console.time('+ 号转换')
console.log('[ foo ] >', +foo)
console.timeEnd('+ 号转换')
console.time('位运算转换')
console.log('[ foo ] >', foo>>0)
console.timeEnd('位运算转换')
console.time('parseInt转换')
console.log('[ foo ] >', parseInt(foo))
console.timeEnd('parseInt转换')

// 输出
+ 号转换: 0.132ms
[ foo ] > 5
位运算转换: 0.063ms
[ foo ] > 1
parseInt转换: 0.223ms

由此,可以看出耗时 位运算 > 运算符转换 > parseInt 方法转换; 以后需要将其他类型转换为 number 整数类型时,便可以直接使用 位运算来转换数据类型了

这里是有前提条件的,一般来说,对于复杂数据类型,如 Array,Object,Function,Date 等在进行数据隐式转换的时候,会优先调用 valueOf 方法,当其 valueOf 方法依旧返回 一个复杂类型 时,又会去调用 toString 方法,若 toString 方法依旧返回复杂类型,那就会转换失败,会抛出一个类似转换失败的错误 `TypeError: Cannot convert object to primitive value`


const obj = {
  toString(){
    return {}
  },
  valueOf(){
    return {}
  }
}
console.log(obj>>0) // TypeError: Cannot convert object to primitive value
这里要说明下 Date 是一个特例,它会优先调用 toString 方法 而不是 valueOf
const date = new Date
Date.prototype.valueOf = function () { return 1 }
Date.prototype.toString = function () { return 4 }

console.log('[ Date>>0 ] >', date + 1) // 5

你可能感兴趣的:(javascript,开发语言)