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()

最新文章

  1. 严重: Exception loading sessions from persistent storage Java.io.EOFException
  2. 常用HTTP状态码和CURL 000问题
  3. hiho 第119周 最大权闭合子图
  4. <math.h>与<float.h>
  5. Jmeter实现WebSocket协议的接口和性能测试方法
  6. hdu 4455 Substrings(找规律&DP)
  7. Python 迭代器、生成器、递归、正则表达式 (四)
  8. 浅谈html入门
  9. Crazyflie笔记五: CRTP 实时通信协议(一)(转)
  10. 2017 ICPC/ACM 沈阳区域赛HDU6228
  11. [机器学习Lesson4]多元线性回归
  12. mysql_建立索引的优缺点
  13. 网页布局中页面内容不足一屏时页脚footer固定底部
  14. 支持pc和移动端的手写签批功能
  15. Canvas入门到高级详解(中)
  16. Linux使用ntpdate和ntpd进行时间同步
  17. 如何安装Visio
  18. 《锋利的JQuery》中的动画效果:
  19. golang使用Nsq(转)
  20. iphone导入照片不显示,不同步怎么整

热门文章

  1. 9月19日上午JavaScript数组
  2. ListView的addHeaderView()方法相关问题
  3. DG_Oracle DataGuard作用和概念(概念)
  4. s3c2440之cache
  5. 06_WebService与Socket的区别
  6. 修改MYSQL最大连接数的2种方法
  7. js正则验证手机号码有效性
  8. adm下载器
  9. redi安装
  10. leetcode之旅(10)-Roman to Integer
  11. 编码与Python的基础
  12. 基于maven的spring-boot的pom文件详解
  13. 2019-04-15 Python之利用matplotlib和numpy的简单绘图
  14. C# 7.1中default关键字的新用法
  15. Python-每日习题-0009-time
  16. 视觉和imu融合的算法研究
  17. Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)
  18. POJ 2410
  19. tp 邮件发送
  20. BZOJ 1875 【SDOI2009】 HH去散步