'abc' => 'Abc'

function capitalize (value) {
if (!value && value !== 0) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}

一开始在想作者为什么不直接if(value),后来发现如果这样写的话0就会被返回空字符串了,看到下面这么一句

'abc' => 'ABC'

uppercase: function (value) {
return (value || value === 0)
? value.toString().toUpperCase()
: ''
}

这个是用来将所有字母转换成大写的,很明显这句比上面一句更加简洁,那么作者为什么不用第二种写法来实现第一种呢?我觉得主要还是因为第一种不太适合使用三元表达式。

function capitalize(value) {
return value || value === 0 ? (value = value.toString()).charAt(0).toUpperCase() + value.slice(1) : '';
}

虽然说以上代码确实简洁了许多,但是不太直观,尤其是代码中的value.slice(1)这一句,而这个value此时已经变成了字符串,三元表达式对于需要赋值或代码比较长的情况下就不太合适了,很快验证了我的这种猜测是对的,再看下面这段代码

12345 => $12,345.00

currency: function (value, args) {
if (!value && value !== 0) return ''
var sign = (args && args[0]) || '$',
s = Math.floor(value).toString(),
i = s.length % 3,
h = i > 0 ? (s.slice(0, i) + (s.length > 3 ? ',' : '')) : '',
f = '.' + value.toFixed(2).slice(-2)
return sign + h + s.slice(i).replace(/(\d{3})(?=\d)/g, '$1,') + f
}

可以看到作者又用了第一种写法,那么作者为什么用的是第一种写法而不是第二种value || value === 0呢,原因就在于这段代码中的逻辑判断比较多,如果使用第二种那么代码就会是类似下面这样的

function currency (value, args) {
if (value || value === 0){
var sign = (args && args[0]) || '$',
s = Math.floor(value).toString(),
i = s.length % 3,
h = i > 0 ? (s.slice(0, i) + (s.length > 3 ? ',' : '')) : '',
f = '.' + value.toFixed(2).slice(-2)
return sign + h + s.slice(i).replace(/(\d{3})(?=\d)/g, '$1,') + f
}
return "";
}

而估计作者是希望将简单的逻辑先搞定,再写复杂的逻辑,菜鸟和大牛的差距往往也在这,什么时候该用什么,什么时候不该用什么,而不是死机硬背一些所谓的最佳实践。

来看看这段代码是做啥的吧

function currency(value, args) {
if (!value && value !== 0) return ''
var sign = (args && args[0]) || '$',
s = Math.floor(value).toString(),
i = s.length % 3,
h = i > 0 ? (s.slice(0, i) + (s.length > 3 ? ',' : '')) : '',
f = '.' + value.toFixed(2).slice(-2)
return sign + h + s.slice(i).replace(/(\d{3})(?=\d)/g, '$1,') + f
}

一开始想不明白作者为什么判断了args还要判断args[0],还以为是个数组,但实验了几次发现这样做是有原因的,如果第二个参数错误的传了一个数字,如果不加args[0],那么开始位置就是这个数字了,很显然这是错误的,而取args[0]只有是字符串或者数组的情况下才有用,这样说来如果我传的是一个数组这个代码也是有问题的,另外一点就是如果传的是多个字符串只会取第1个。

作者的整体思路是将数字拆成3部分,先将小数点过滤,第一部分就是那个显示符$,第二部分求余数%3,第三部分将不是余数的每3个值后面加,号,第4部分取通过toFixed转换后的后两位,最后把它们想加。

找复数

function pluralize(value, args) {
return args.length > 1
// 如果args的长度大于1,则查找value所对应的值,从1开始,如果找不到返回数组最后一个值,如果args的长度小于1并且找不到则返回数组第0个加上s。
? (args[value - 1] || args[args.length - 1])
: (args[value - 1] || args[0] + 's')
}

如果只有一个参数,复数形式只是简单地在末尾添加一个 “s”。如果有多个参数,参数被当作一个字符串数组,对应一个、两个、三个…复数词。如果值的个数多于参数的个数,多出的使用最后一个参数。

按键过滤器

var keyCodes = {
enter : 13,
tab : 9,
'delete' : 46,
up : 38,
left : 37,
right : 39,
down : 40,
esc : 27
};
function key(handler, args) {
if (!handler) return
var code = keyCodes[args[0]]
if (!code) {
code = parseInt(args[0])
}
return function (e) {
if (e.keyCode === code) {
handler.call(this, e)
}
}
}

当args在keyCodes对象中,则获取keyCodes中的code值,如果不在其中则将args值转成10进制(用户可能传递的是其他进制),赋给code,当code值与keyCode一样时,再执行相应的函数。

读vue-0.6-filters.js源码的更多相关文章

  1. vue.js源码精析

    MVVM大比拼之vue.js源码精析 VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多 ...

  2. Vue.js 源码构建(三)

    Vue.js 源码是基于 Rollup 构建的,它的构建相关配置都在 scripts 目录下. 构建脚本 通常一个基于 NPM 托管的项目都会有一个 package.json 文件,它是对项目的描述文 ...

  3. 从template到DOM(Vue.js源码角度看内部运行机制)

    写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(https://github.com/answershuto/learnVue)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些 ...

  4. Vue.js源码——事件机制

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...

  5. 从Vue.js源码角度再看数据绑定

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...

  6. 【转】从Vue.js源码看异步更新DOM策略及nextTick

    在使用vue.js的时候,有时候因为一些特定的业务场景,不得不去操作DOM,比如这样: <template> <div> <div ref="test" ...

  7. Vue.js 源码分析(一) 代码结构

    关于Vue vue是一个兴起的前端js库,是一个精简的MVVM.MVVM模式是由经典的软件架构MVC衍生来的,当View(视图层)变化时,会自动更新到ViewModel(视图模型),反之亦然,View ...

  8. vue源码分析—Vue.js 源码构建

    Vue.js 源码是基于 Rollup 构建的,它的构建相关配置都在 scripts 目录下.(Rollup 中文网和英文网) 构建脚本 通常一个基于 NPM 托管的项目都会有一个 package.j ...

  9. 2018-11-23 手工翻译Vue.js源码:尝试重命名标识符与文本

    续前文: 手工翻译Vue.js源码第一步:14个文件重命名 对core/instance/索引中的变量, 方法进行重命名如下(题图): import { 混入初始化 } from './初始化' im ...

  10. vue.js源码学习分享(一)

    今天看了vue.js源码  发现非常不错,想一边看一遍写博客和大家分享 /** * Convert a value to a string that is actually rendered. *转换 ...

随机推荐

  1. linux虚拟机配置上网(静态IP)和配置tomcat服务环境

    常用命令:vi或者vim编辑 ,按i编辑模式,按ecs进入基本模式,按 :w  保存:按 :wq  退出并保存:mv移动::q退出 :ln -sv apache-tomcat-8.0.24 tomca ...

  2. 在centos7上使用最简单的方法把php脚本做成服务,随开机启动运行

    1.准备文件:coffeetest.service # copy to /usr/lib/systemd/system # systemctl enable coffeetest.service [U ...

  3. Knockout.js快速学习笔记

    原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...

  4. Activity 重载方法 onStart和onResume、onPause和onStop的区别

    Activity 重载方法 onStart和onResume.onPause和onStop的区别 首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最 ...

  5. 图解HTTP第二章

    简单的 HTTP 协议 1>HTTP 协议用于客户端和服务器端之间的通信 HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信.请求访问文本或图像等资源的一 ...

  6. div辅助线【完整版】

    ## <html> <head> <link rel="stylesheet" type="https://cdn.bootcss.com/ ...

  7. uart通讯协议

    本次设计的源码在http://download.csdn.net/detail/noticeable/9912383 下载 实验目的:通过uart通讯协议的编写,了解FPGA的通讯协议编写的方法. 实 ...

  8. 【BZOJ4025】 二分图(线段树分治)

    传送门 BZOJ Solution 只是为了学习一下线段树分治的啦! 当你学会线段树分治之后,可以跳过下面的一部分: 按照时间搞一颗线段树出来,把包含这段区间的操作用vector压进去. 每一个线段树 ...

  9. Matlab实现《追光者》简谱

    MATLAB除了生孩子,其他全都能做系列. 使用MATLAB进行播放<追光者>,纯文本内容哦. Fs = ; load y; sound(y, Fs); 加载的y是哪里来的呢?当然是调用函 ...

  10. 骚年,看我如何把 PhantomJS 图片的 XSS 升级成 SSRF/LFR

    这篇文章实在是太好了,我看了好几篇,所以极力推荐给大家 原文地址   http://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-ren ...