详解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 相关文章推荐
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
js实现类似MSN提示的页面效果代码分享
Aug 24 Javascript
javascript正则表达式之分组概念与用法实例
Jun 16 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
js cookie实现记住密码功能
Jan 17 Javascript
js 监控iframe URL的变化实例代码
Jul 12 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
Jun 20 jQuery
vue draggable resizable gorkys与v-chart使用与总结
Sep 05 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
Vue页面切换和a链接的本质区别详解
Nov 12 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遍历二维数组的代码
2011/04/22 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
php页面缓存方法小结
2015/01/10 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
Javascript - HTML的request类
2006/07/15 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
python求crc32值的方法
2014/10/05 Python
编写Python CGI脚本的教程
2015/06/29 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
python和shell获取文本内容的方法
2018/06/05 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
Python中SQLite如何使用
2020/05/27 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
美国校服网上商店:French Toast
2019/10/08 全球购物
运动会开幕式邀请函
2014/01/22 职场文书
个人简历自我评价
2014/02/02 职场文书
《秋游》教学反思
2014/04/24 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
队名及霸气口号大全
2015/12/25 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis