详解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 相关文章推荐
Js中sort()方法的用法
Nov 04 Javascript
JS 实现Json查询的方法实例
Apr 12 Javascript
如何用JavaScript动态呼叫函数(两种方式)
May 03 Javascript
jquery iframe操作详细解析
Nov 20 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
JS定义类的六种方式详解
May 12 Javascript
Angular2 父子组件通信方式的示例
Jan 29 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
Sep 12 Javascript
关于js陀螺仪的理解分析
Apr 11 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 Javascript
js+cavans实现图片滑块验证
Sep 29 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
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/06/09 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
python多线程操作实例
2014/11/21 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
python实现Virginia无密钥解密
2019/03/20 Python
Python实现FM算法解析
2019/06/18 Python
基于django传递数据到后端的例子
2019/08/16 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Python属性和内建属性实例解析
2020/01/14 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
北大青鸟学生求职信
2013/09/24 职场文书
银行优秀员工事迹
2014/02/06 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
实习公司领导推荐函
2014/05/21 职场文书
zabbix配置nginx监控的实现
2022/05/25 Servers
tree shaking对打包体积优化及作用
2022/07/07 Java/Android