如果定义了一个函数,能够通过传入的不同参数进行不同的操作,那最好写成一个对象,通过不同的参数,去调用这个对象的对应方法,如下(不要使用switch哈
代码语言:javascript复制function doSth(type, a, b) {
return sthObj[type](a, b)
}
const sthObj = {
add(a, b) {
return a b
},
sub(a, b) {
return a - b
}
}
const res = doSth('add', 1, 2)
console.log(res)
- 怎么判断一个对象的键值相不相同,我现在学会两种方法
(1)
代码语言:javascript复制const obj1 = { name: 'yft', age: 20 }
const obj2 = { name: 'yft', age: 20 }
console.log(obj1 === obj2) //false 因为对象的地址肯定是不同的,所以为false
const res = Object.keys(obj1).every(i => obj1[i] === obj2[i])
console.log(res) //true
(2) 但是不适用于复杂类型
代码语言:javascript复制const obj1 = { name: 'yft', age: 20 }
const obj2 = { name: 'yft', age: 20 }
const res = JSON.stringify(obj1) === JSON.stringify(obj2)
console.log(res) //true
如下,函数类型会被排除在外,无法判断
代码语言:javascript复制const obj1 = { name: 'yft', age: 20, b: (a) => { return } }
const obj2 = { name: 'yft', age: 20, a: (a) => { return } }
const res = JSON.stringify(obj1) === JSON.stringify(obj2)
console.log(res) //true
- 关于枚举类型,基本类型比如字符串/数字/布尔值并不是对象而是原始值,是不可变的,没有属性,因此也没有可不可枚举的问题。 而对象和数组中,可枚举属性就是在循环中能循环到的属性,相反就是不可枚举的属性,在Object.defineProperty中可以将属性定义为不可枚举的。这样的话循环的时候不会循环到这个属性。一般来说,自定义添加的属性都是可以枚举的,而一些内建的属性是不可枚举的,比如length,还有原型链上的属性。(个人理解吧不一定对)
- 如何用一行代码实现kebabCase
const str = 'DataSource'
const res = str.replace(/([A-Z])/g, ($0, $1, index) => index === 0 ? $1.toLowerCase() : '-' $1.toLowerCase())
// data-source
好好学一下replace的用法,十分强大
- 在学习ts的过程中知道了extends的神奇之处,如果extends前面的是泛型,且泛型的类型是联合类型的时候,他会使用分配律计算结果,然后讲结果再组成一个联合类型,真的涨知识了。阮一峰的ts是真的强,讲得狠狠狠细致
- 正则的规则是可以复用的,比如你将一部分的规则用括号()括起来,这就是第一组规则,当你想复用的时候,就用1即可,如果你第一次匹配的是xx,下一次复用的时候匹配的也得是一样的内容,我发现一个使用场景,就是匹配标签之间的内容, 标签的两边肯定都是一样的,h1肯定对应的还是h1, div对应的还是div,这时候就可以复用规则了。
let res = '<h1>你好<111>我是内容</h1>'
.replace(/<([0-9a-z] )>(.*)</1>/gi, ($0, $1, $2) => $2);
// 其中的$2就是匹配到的标签内的内容
- 经过同事的指点,明白了不要什么事都等准备好了再去做,要边实践边学习,自然而然的就会了
- 快捷键,怎么向上插一行: Ctrl Shift Enter, 这个还是很实用的。
- 了解一下正则的贪婪匹配和懒惰匹配。