详解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 相关文章推荐
一个页面放2段图片滚动代码出现冲突的问题如何解决
Dec 21 Javascript
javaScript对文字按照拼音排序实现代码
Dec 27 Javascript
javascript的正则匹配方法学习
Feb 24 Javascript
JavaScript数据类型转换的注意事项
Jul 31 Javascript
js表单元素checked、radio被选中的几种方法(详解)
Aug 22 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
使用JSON格式提交数据到服务端的实例代码
Apr 01 Javascript
Vue CLI3基础学习之pages构建多页应用
Jun 02 Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 Javascript
js实现橱窗展示效果
Jan 11 Javascript
基于js实现判断浏览器类型代码实例
Jul 17 Javascript
Ant-design-vue Table组件customRow属性的使用说明
Oct 28 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 防止单引号,双引号在接受页面转义
2008/07/10 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks & solutions)
2010/03/01 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
Bootstrap4如何定制自己的颜色和风格
2018/02/26 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
Python 的 Socket 编程
2015/03/24 Python
django的ORM操作 增加和查询
2019/07/26 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Python中内建模块collections如何使用
2020/05/27 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
golang/python实现归并排序实例代码
2020/08/30 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
.NET面试10题
2014/02/24 面试题
Linux文件系统类型
2012/02/15 面试题
人力资源总监工作说明
2014/03/03 职场文书
应届生求职信范文
2014/06/30 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
2015年新农合工作总结
2015/03/30 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript