详解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 相关文章推荐
JQuery this 和 $(this) 的区别
Aug 23 Javascript
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
window.location不跳转的问题解决方法
Apr 17 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
js 创建对象 经典模式全面了解
Aug 16 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
浅析Jquery操作select
Dec 13 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
Mar 24 Javascript
JavaScript Window浏览器对象模型原理解析
May 30 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
Oct 27 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
phpQuery占用内存过多的处理方法
2013/11/13 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
JavaScript中string对象
2015/06/12 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
React如何避免重渲染
2018/04/10 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
vue实现图片上传功能
2020/05/28 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
一份python入门应该看的学习资料
2018/04/11 Python
python绘制圆柱体的方法
2018/07/02 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
python argparser的具体使用
2019/11/10 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
会议邀请书范文
2014/02/02 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python