我们常常会用到 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