详解Vue源码中一些util函数


Posted in Javascript onApril 24, 2019

JS中很多开源库都有一个util文件夹,来存放一些常用的函数。这些套路属于那种常用但是不在ES规范中,同时又不足以单独为它发布一个npm模块。所以很多库都会单独写一个工具函数模块。

最进尝试阅读vue源码,看到很多有意思的函数,在这里分享一下。

Object.prototype.toString.call(arg) 和 String(arg) 的区别?

上述两个表达式都是尝试将一个参数转化为字符串,但是还是有区别的。

String(arg) 会尝试调用 arg.toString() 或者 arg.valueOf(), 所以如果arg或者arg的原型重写了这两个方法,Object.prototype.toString.call(arg) 和 String(arg) 的结果就不同

const _toString = Object.prototype.toString
var obj = {}

obj.toString() // [object Object]
_toString.call(obj) // [object Object]

obj.toString = () => '111'

obj.toString() // 111
_toString.call(obj) // [object Object]

/hello/.toString() // /hello/
_toString.call(/hello/) // [object RegExp]

详解Vue源码中一些util函数

上图是ES2018的截图,我们可以知道Object.prototype.toString的规则,而且有一个规律,Object.prototype.toString的返回值总是 [object + tag + ],如果我们只想要中间的tag,不要两边烦人的补充字符,我们可以

function toRawType (value) {
 return _toString.call(value).slice(8, -1)
}

toRawType(null) // "Null"
toRawType(/sdfsd/) //"RegExp"

虽然看起来挺简单的,但是很难自发的领悟到这种写法,有木有。。

缓存函数计算结果

假如有这样的一个函数

function computed(str) {
 // 假设中间的计算非常耗时
 console.log('2000s have passed')
 return 'a result'
}

我们希望将一些运算结果缓存起来,第二次调用的时候直接读取缓存中的内容,我们可以怎么做呢?

function cached(fn){
 const cache = Object.create(null)
 return function cachedFn (str) {
  if ( !cache[str] ) {
    cache[str] = fn(str)
  }
  return cache[str]
 }
}

var cachedComputed = cached(computed)
cachedComputed('ss')
// 打印2000s have passed
cachedComputed('ss')
// 不再打印

将hello-world风格的转化为helloWorld风格

const camelizeRE = /-(\w)/g
const camelize = cached((str) => {
 return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '')
})

camelize('hello-world')
// "helloWorld"

判断JS运行环境

const inBrowser = typeof window !== 'undefined'

const inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform
const weexPlatform = inWeex && WXEnvironment.platform.toLowerCase()

const UA = inBrowser && window.navigator.userAgent.toLowerCase()

const isIE = UA && /msie|trident/.test(UA)
const isIE9 = UA && UA.indexOf('msie 9.0') > 0
const isEdge = UA && UA.indexOf('edge/') > 0
const isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android')
const isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios')
const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge
const isPhantomJS = UA && /phantomjs/.test(UA)
const isFF = UA && UA.match(/firefox\/(\d+)/)

判断一个函数是宿主环境提供的还是用户自定义的

console.log.toString()
// "function log() { [native code] }"

function fn(){}
fn.toString()
// "function fn(){}"

// 所以
function isNative (Ctor){
 return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}

以上所述是小编给大家介绍的Vue源码中一些util函数详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
jQuery中after()方法用法实例
Dec 25 Javascript
js实现交换运动效果的方法
Apr 10 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
Aug 06 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
Nov 17 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
Apr 06 Javascript
详谈javascript精度问题与调整
Jul 08 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
swiper插件自定义切换箭头按钮
Dec 28 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
javascript数组去重方法总结(推荐)
Mar 20 Javascript
vue-cli3 DllPlugin 提取公用库的方法
Apr 24 #Javascript
VUE 实现复制内容到剪贴板的两种方法
Apr 24 #Javascript
详解一个小实例理解js原型和继承
Apr 24 #Javascript
微信小程序实现的一键复制功能示例
Apr 24 #Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 #Javascript
解决vue 单文件组件中样式加载问题
Apr 24 #Javascript
vue router 用户登陆功能的实例代码
Apr 24 #Javascript
You might like
PHP实现分页的一个示例
2006/10/09 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
jquery动态改变form属性提交表单
2014/06/03 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
node.js文件操作系统实例详解
2019/11/05 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
python实现图片变亮或者变暗的方法
2015/06/01 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
Python编码类型转换方法详解
2016/07/01 Python
python 异常处理总结
2016/10/18 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
2014年科室工作总结范文
2014/12/19 职场文书
员工工作能力评语
2014/12/31 职场文书
支行行长岗位职责
2015/02/15 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
2015年幼儿园班主任个人工作总结
2015/10/22 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
Java线程的6种状态与生命周期
2022/05/11 Java/Android