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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放逐的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值