[已解决]lodash源码之toNumber的一些疑问
业务背景
为了更方便的看vue源码,就想着先把lodash源码先过一遍,打个基础,但在阅读的过程中发现一些问题,自己很想想明白,这种问题搜索也不知道咋搜索
源码地址
https://github.com/ranwawa/lo...
- 问题1: isSymbol为什么要搞这么复杂?
const toString = Object.prototype.toString
function getTag(value) {
if (value == null) {
return value === undefined ? '[object Undefined]' : '[object Null]'
}
return toString.call(value)
}
function isSymbol(value) {
const type = typeof value
return type == 'symbol' || (type === 'object' && value != null && getTag(value) == '[object Symbol]')
}
判断类型,通过Object.prototype.toString可以识别所有类型,为啥还需要前面哪么多判断?
其中getTag就是toString方法.开始一来直接调这个方法就得了嘛,非得做这么多步骤?是出于性能考虑?
- 问题2: 为啥要把parseInt赋值给一个新的变量
/** Built-in method references without a dependency on `root`. */
const freeParseInt = parseInt
function toNumber(value) {
...
return (isBinary || reIsOctal.test(value))
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: (reIsBadHex.test(value) ? NAN : +value)
}
parseInt本身就是一个全局函数,为啥要把赋值给另外一个变量呢?上面的注释说的也是奇怪,不依赖顶级对象,但是确实没看出有啥不同的地方啊
- 问题3: 为啥16进制转数值要用+号而不是parseInt
代码同上,最后一行
2进制和8进制都是用parseInt转换的,为什么16进制要用+号来转换呢而不是parseInt呢?
查了下MDN,+号可以把16进制转换成10进制,可是2进制和8进制都是原样返回的,为什么16进制要转换成10进制返回呢????
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1.isSymbol为什么要搞这么复杂?
typeof
比Object.prototype.toString
效率高10倍,对追求性能极致的库来说这种优化必不可少可以把这段代码直接在控制台运行对比
2.为啥要把parseInt赋值给一个新的变量
因为全局函数随时有可能被第三者替换
在控制台贴上这个函数,你再
parseInt
给我看看?3.
16进制没有处理,直接返回
NAN
了,带+
的是10进制数,确保返回值是数值类型而已,至于2进制8进制转成10进制返回也没什么问题