function format(str, object) {
let arr = [].slice.call(arguments, 1);
return str.replace(/\?#{([^{}]+)}/gm, (match, name) => {
if(match.charAt(0) == '\') return match.slice(1);
let index = +name;
if(index >= 0) return arr[index];
if(object && object[name] !== void(0)) return object[name];
return '';
})
}
format('#{0} is a #{1}', 'huruji', 'boy') // huruji is a boy
format('#{name} is a #{sex}', {name: 'huruji', sex: 'boy'}) // huruji is a boy
16.原生实现数组的 indexOf 方法
Array.prototype.indexOf = function(item, index) {
let n = item.length, i = ~~index;
if(i < 0) i += n;
for(; i < n; i++)
if(this[i] === item) return i;
return -1
}
发布评论
评论(7)
25. Promise 化 callback 调用
将 callback 的调用转化为 Promise 调用
测试
21.Safari Date对象返回NaN
Safari使用
new Date('2018-08-09 09:12')
返回 NaN,原因是safari的Date对象不支持这种格式,可以将-
转换为/
即可兼容所有浏览器22.判断是否是XML文档
方法一:
XML相对于HTML来说,XML没有className、getElementById,并且NodeName是区分大小写的。
通过获取文档的顶层文档对象(在html文档中就是HTML节点,判断nodeName是否为HTML),关于属性
ownerDocument
可在这里查阅方法二:
以上是sizzle的实现,但是事实上,XML的节点是有可能是HTML标签的(虽然这种情况极其少),moottools的slick的实现是通过大量属性判断的:
方法三:
标准浏览器中暴露了HTML文档的构造器HTMLDocument,而IE下的XML元素有selectNodes属性,因此可以判断是否是HTMLDocument的实例以及是否拥有selectNodes属性。
方法四:
面对属性,其实使用JavaScript就可以随意添加属性,因此属性判断方法很容易被攻破,因此功能法才会更加有效,XML和HTML都支持createElement方法,但是XML区分大小写,因此可以创建两个大小写元素,判断是否相等即可,这是比较严谨的方法:
23.判断节点是否包含另一个节点
contains
是IE的私有属性,现在chrome、firfox也有这个方法。compareDocumentPosition
方法是判断两个节点的位置,具体有以下:有时候两个元素的位置可能满足上表的两种情况,如返回20,因此判断中使用了与运算来判断是否包含这个情况,我们需要注意到所有的结果都是2的倍数,因此与运算可以保证这点。
关于
compareDocumentPosition
24.判断两个节点的顺序
两个节点相同返回0,a节点在前返回-1,b节点在前返回1
思路是:先判断两个节点是否相同,判断两个节点的父节点是否相同(相同则使用nextSibling属性),这里需要注意的是,如果节点就是根节点,就没有父节点(这个估计很多人会漏掉),最后也是最核心的方法就是不断向上取父元素,直到根元素,之后不断pop出来,判断是否父元素相等。(最最核心)。
很明显,上面的整个函数可以作为数组sort方法的参数,只要将取得的元素节点数组化就行了。
24.chrome 66之后video与audio标签autoplay属性失效
一定需要自动播放时,可以添加静音muted属性即可
ref:
Chrome 66禁止声音自动播放之后
17.使用
~i
代替i > -1
我们有时需要判断数组、字符串存在某个元素时,进行某项操作:
这时候可以使用否操作
~
来装X18.柯里化
bind
、apply
、call
出自 JavaScript 框架设计,非常骚气的黑魔法
使用
用一张简单的代码图表示其中的原理:
柯里化之后给了我们多一次传参的机会,这样就可通过判断返回不同的结果了。
19.最简单的柯里化函数
1.支持每次只传一个参数的 正宗柯里化函数
使用:
2.支持一次传多个参数的 简化柯里化函数
使用
20.最简单的partial技术实现
与柯里化相似,柯里化缺点在于每次参数都是通过push的,但有些时候有些参数是已经拥有的,我们需要做的是填充没有的参数,这个时候我们可以使用占位操作来代表需要填充的参数,如undefined,不过推荐使用
Object.create(null)
,因为纯空对象没有原型,因此没有toString、valueOf等一系列继承自Object的方法。这种技术和柯里化技术很适合在延迟调用的场景中使用。
使用
13.将字符串HTML转义
14.数组前导置0
最常见的就是月份和天前面置0
思路一:使用0作为数组的join的方法参数组合之后再截取字符串
可以将new数组的个数先计算出来,这样就省去了截取字符串的一步
思路二:先创建一个含有n个零的大数,再截取
创建这个大数可以使用
Math.pow
、使用左移运算符 << 、或者使用科学计数法。思路三:创建拥有N个0的小数,用toFixed方法就行
15.创建类似与C语言的
printf
方法来格式化字符串16.原生实现数组的
indexOf
方法这段代码第一个神奇的地方在于使用了双否
~~
运算将其他类型的参数转换为0,先使用Number方法转换得到再使用否运算
,而~NaN === -1
第二个神奇的地方在于使用
i += n
实现负数从数组尾部算起的功能9.使用void操作符得到undefined值
相对于直接使用
undefined
可以节省几个字符例如检查一个值是否是
undefined
10.将字符串转换为驼峰风格
11.将字符串转换为下划线风格
12.移除字符串中的html标签
在实际运用中,我们需要考虑
<script>
标签,不应该让script
标签内的脚本显示出来,因此需要一个函数删除script
标签内的内容5.判断是否为纯净的javascript对象
6.位运算取整
这是最快的取整方法,位运算取整需要注意的是只是取的整数,如果需要和
Math.floor
结果一致,负数应该再减一取反操作
左移运算符
右移运算符
异或运算符
7.使用右移运算符取得整除2的值
右移一位即可
8.将一个字符串重复N次
核心就是使用数组的join方法
方法一
方法二,创建类数组对象
方法三,利用闭包缓存方法与对象
方法四,使用数组的concat方法
方法五,利用算法提高效率,使用二分法
1.实现千分位分隔符
使用正则表达式
这里涉及到了
B
匹配非单词边界、零宽正向先行断言、零宽负向先行断言,参考:正则表达式的先行断言(lookahead)和后行断言(lookbehind)使用
toLocaleString
方法2.精确到指定位数的小数
使用科学计数法
3.统计数组中同项出现的次数
4.使用解构赋值删除不必要的对象属性