typeOf

typeOf: function (obj) {
return toString.call(obj).slice(8, -1)
}

每个对象都有一个 toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用。默认情况下,toString() 方法被每个继承自Object的对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象类型。

Object.prototype.toString()

也就是说当调用toString方法去转换某个对象时,如果那个对象转换不成字符串就会返回"[object type]"这个,但是由于所有对象都继承自Object,所以默认情况下输出的是"[object object]",除非你改变toString的指向,也就是我们平时用的call、apply、bind。

我们会发现如果通过数组的toString是可以转换成字符串的,而借用Object的toString就会返回"[object Array]",我觉得主要还是因为Object里面的toString方法和其他类型的toString方法内部做的是不同的处理,这也就是为什么一定要借用Object里面的toString方法才行。

toText

toText: function (value) {
return (typeof value === 'string' ||
typeof value === 'boolean' ||
(typeof value === 'number' && value == value))
? value
: ''
}

排除NaN value == value,因为NaN不等于NaN,但我觉得作者这段代码写的并不好,一会用=一会又用并且这里也不涉及隐式转换。

也可以用switch来实现

toText: function (value) {
switch(typeof value){
case "string":
case "boolean":
case "number":
return value == value ? value : "";
default:
return "";
}
}

过滤数组重复项

unique: function (arr) {
var hash = utils.hash(),
i = arr.length,
key, res = []
while (i--) {
key = arr[i]
if (hash[key]) continue
hash[key] = 1
res.push(key)
}
return res
}

他这里是通过对象来实现过滤数组重复项的,因为对象不能有相同的key,作者在代码中经常使用utils.hash()这么一句话,这句话的意思是创建一个空对象,使用的是Object.create(null),使用这种方法创建对象的好处就是它不会继承任何对象的属性和方法。

除了用作者的这种方式,还可以用Map对象实现

unique: function (arr) {
var map = new Map(),
res = [];
arr.forEach(function(item){
map.set(item);
});
map.forEach(function(item,index){
res.push(index);
});
return res;
}

将字符串转成DOM元素

function toFragment (template) {
if (typeof template !== 'string') {
return template
}
// 如果是ID选择器则获取元素里面的内容
if (template.charAt(0) === '#') {
var templateNode = document.getElementById(template.slice(1))
// 如果获取不到元素则返回空
if (!templateNode) return
template = templateNode.innerHTML
}
// 这里创建一个div主要是想借用DOM的innerHTML方法
var node = document.createElement('div'),
// 创建一个文档片段,如果这里用createElement来创建元素那么就会多出一个无用的外层标签来。
frag = document.createDocumentFragment(),
child
// 去除空格
node.innerHTML = template.trim()
while (child = node.firstChild) {
frag.appendChild(child)
}
return frag
}

相关阅读:

createElement与createDocumentFragment的点点区别

Document.createDocumentFragment()

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

  1. 分享一个utils.js源码

    NEJ.define([ './global.js', '{platform}util.js' ],function(NEJ,_h,_p,_o,_f,_r){ /* * 查看数据是否指定类型 * @p ...

  2. vue.js源码精析

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

  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.js 源码构建(三)

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

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

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

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

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

随机推荐

  1. 认识正则RegExp;

    1.什么是正则??? 就是一条规则,用于检验字符串的格式,目标就是字符串. *只要是表单提交的数据都是字符串 2.正则的定义??? (1)var reg=new RegExp() (2)var reg ...

  2. iDoc「文档」功能强势升级!一键分享,即刻预览!(201903-1版本更新)

    小摹很想知道小伙伴们在面对众多杂乱的文档时,都是如何管理起来的呢?iDoc的「文档」功能,很多小伙伴还没有用起来,甚至都没有注意到iDoc还有这样一个功能.今天小摹就给大家介绍一下iDoc的「文档」功 ...

  3. python2/3 利用psycopg2 连接postgreSQL数据库。

    psycopg2 是一个通过python连接postgreSQL的库, 不要被它的名称蒙蔽了,你可能发现它的版本是psyconpg2.7.*, 以为它只能在python2上使用,实际上,这只是一个巧合 ...

  4. debug,菜鸟必备的求生技能

    突然想写个关于 debug 的文章,来纪念我2天前被自己坑的蠢事…… 前两天,项目的四期送去电科院审查了.因为一些不可描述的原因,我很不喜欢四期.做起来就很烦~临近验收,发现了个比较严重的bug,记录 ...

  5. Pivot For和UNPivot For

    一.使用PIVOT和UNPIVOT命令的SQL Server版本要求 1.数据库的最低版本要求为SQL Server 2005 或更高. 2.必须将数据库的兼容级别设置为90 或更高. 3.查看我的数 ...

  6. php循环

    while 例子: /* example 1 */ $a = 0; while (true) { $a++; echo $a.'<br>'; if($a >= 10){ break; ...

  7. Eclipse进行远程调试(Tomcat远程调试)

    1.配置tomcat Linxu系统: tomcat/bin/catalina.sh或者startup.sh开始处中增加如下内容: declare -x CATALINA_OPTS="-Xd ...

  8. _ZNote_Qt_QtCreator_Tips_粘贴_历史剪切板

    发现 快捷键 Shift+Command + V 能够出现历史剪切板. 厉害了我的歌

  9. DE1-SOC资源

    1,digital solution lab 网站上的de1soc QT教程. 内容包括: Install Qt 5.4 Designer Install the Altera SoC Tool-Ch ...

  10. C# Thread、ThreadPool、Task、Invoke、BeginInvoke、async、await 汇总

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...