keydown、keypress、keyup的区别
-
keydown
任意按键按下,按住不放会连续触发 -
keypress
与keydown基本没差别,任意按键按下,按住不放会连续触发,触发顺序排在keydown后面 -
keyup
任意按键抬起
concat深入理解
concat方法用于连接数组或字符串,连接字符串比较鸡肋,且不说ES6有模版字符串大行其道,ES5的简单的+
号连接字符串也让concat在字符串连接方面毫无优势可言。
用于连接数组时,concat方法返回一个新数组,不会改变原数组。接收的参数也很*,可以是一堆数组元素,也可以是一个或多个数组。
请记住这个准则,concat
会扁平化传入的最外层数组,但不会递归扁平化。也就是说,这个扁平的操作层级只有一层,如果扁平化后还存在引用类型,会将该引用类型的指针放入目标数组。
[1,2].concat(3, 4) // 返回[1,2,3,4]
[1,2].concat([3,4]) // 返回[1,2,3,4]
[1,2].concat(3,[4]) // 返回[1,2,3,4]
[1,2].concat([3,[4]]) // 返回[1,2,3,[4]]
[1,2].concat({name: ‘zhang‘}) // 返回[1,2,{name: ‘zhang‘}]
[1,2].concat([{name: ‘zhang‘}]) // 返回[1,2,{name: ‘zhang‘}]
正则对象的test和exec
正则对象的test用于检测某个字符串是否符合该正则对象的规则,符合返回true
,不符合返回false
。
exec相比test会更复杂一些,它的作用是对某个字符串进行正则规则的搜索匹配,如果能匹配上,返回一个详情数组;如果匹配不上,返回null
。
但是这里有一点复杂的是,对于正则对象,全局匹配和非全局匹配的行为表现会略有不同:
-
非全局匹配的正则对象。无状态,它无论执行多少次,匹配的结果都是一样的,都会返回匹配到的第一个结果的详情(比如下标,被检测的字符串等);
-
全局匹配的正则对象。有状态,它更类似于那种一步步匹配的逻辑:匹配到第一个就停下来,再次执行则匹配下一个,再次执行则继续匹配下一个......,当匹配完最后一个时,就返回开始位置,重新匹配第一个。这种行为很类似生活中的一个场景:比如网易云音乐的循环播放某个歌单。
// 非全局匹配的正则对象,重复执行结果不变
const exp = /ok/;
exp.lastIndex // 0
exp.exec(‘are you ok? I am very ok‘) // ["ok", index: 8, input: "are you ok? I am very ok", groups: undefined]
exp.lastIndex // 0
exp.exec(‘are you ok? I am very ok‘) // ["ok", index: 8, input: "are you ok? I am very ok", groups: undefined]
exp.lastIndex // 0
// 全局匹配的正则对象,每次执行都会动态更新自身状态
const globalExp = /ok/g;
globalExp.lastIndex // 0
globalExp.exec(‘are you ok? I am very ok‘); // ["ok", index: 8, input: "are you ok? I am very ok", groups: undefined]
globalExp.lastIndex // 10
globalExp.exec(‘are you ok? I am very ok‘); // ["ok", index: 22, input: "are you ok? I am very ok", groups: undefined]
globalExp.lastIndex // 24
globalExp.exec(‘are you ok? I am very ok‘); // null
globalExp.lastIndex // 0
写在最后
总结:
- keydown先于keypress触发,两者表现类似
- concat对入参会进行一层扁平化
- exec用于搜索字符匹配详情,全局正则有状态,非全局正则无状态
工作已经两年了,需要对知识进行梳理学习,不要因为有一些东西基础就视而不见,也不要因为一些基础高级就趋之若鹜,眼高手低。希望今年自己能更加耐心,沉下心来思考,不要浮躁。