兼容 IE ?不存在的好吗。
其实使用新语法配合 babel 的转码,已经可以解决这一些问题了。既然如此,那就多使用新语法去探索一下怎么更好的去写代码吧。
下面分享个人开发中常用的 js 写法技巧,希望对各位有所帮助。
使用 let / const
var 命令会发生”变量提升“现象,即变量可以在声明之前使用,值为 undefined。这种现象多多少少是有些奇怪的。
个人认为,对声明的变量确定后面不会发生更改时,即使性能上没有太大提升差异在,但使用 const, 代码的可读性也会增强很多。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。let变量指向的内存地址,保存的只是一个指向实际数据的指针
补充 const 定义的变量不是数据不可变,而是保存的引用地址不能发生改变。例子如下:
1 | const person = { age: 22 } |
详情看 let 和 const 命令
解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
好处就是:解决了访问多层嵌套的对象或数组的命名,减少代码量
声明多个变量:
1 | let [age, name, sex] = [22, 'guodada', 1] |
使用在对象中:
1 | const obj = { |
使用在函数中:
1 | // 在参数中结构赋值,获取参数, 当参数多的使用时候十分方便 |
更多用法见 变量的解构赋值
ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。
1 | function f(x, y) { |
扩展符的运用
es6 扩展符有很多用法,他可以使你的代码更加简洁,易懂。这里就举例常用的用法
在对象中的用法:
1 | let obj = { |
在数组中的用法:
1 | const arr = [1, 2, 3] |
扩展符的其他用法请自行查资料。
数组用法
1 | const arr = [1, 2, 3, 4] |
find/findIndex : 找出第一个符合条件的数组成员之后不再匹配,一定程度下优化查找。includes: 返回 true/false, 相较于 indexOf, 实用多了
flat(): 扁平化数组,常用于将数组转化为一维数组1
2
3
4
5
6
7
8const arr = [1, 2, [3, 4]]
arr.flat() // [1, 2, 3, 4] 扁平化数组, 默认展开一层。
const arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat() // [1, 2, 3, 4, [5, 6]]
arr2.flat(2) // [1, 2, 3, 4, 5, 6] flat(3) 也是展开两层...flatMap(): 在数组执行map方法后执行flat, 用的不多,其实可以写map后写flat更好懂点。1
2
3;[2, 3, 4].flatMap(x => [x, x * 2]) // [ 2, 4, 3, 6, 4, 8 ]
// 1. [2, 3, 4].map(d => [d, d * 2]) => [[2, 4], [3, 6], [4, 8]]
// 2. [[2, 4], [3, 6], [4, 8]].flat()
补充常用的对象转数组的用法:
1 | const obj = { name: 'guodada' } |
模板字符串
用的挺多的,注意不兼容 IE !
1 | const name = 'guodada' |
使用 async / await
async/await 实际上就是 generator 的语法糖, 主要用来解决异步问题,具体网上很多文章都有介绍,这里就不做多的解释吧。
1 | async function test() { |
ps 虽然好用,但是有时候适用场景不好,比如我们在拉取列表和用户信息需要同时进行时,await 后才执行下一条语句,这不是我们希望看到的。解决方法如下:
1 | // 结合 Promise.all |
传送门:async 函数
利用 class 封装代码
主要是抽离代码逻辑,使得代复用性加强。同时,class 的形式会让结构变得更加清晰,譬如:
1 | class MyForm { |
使用:
1 | import MyForm from './MyForm' |
static:静态属性,类可以直接调用constructor: 实例化类的时候调用,即new MyForm(), 这里没用到
更多知识请阅 Class 的基本语法
优化 if/else 语句
当逻辑或
||时,找到为true的分项就停止处理,并返回该分项的值,否则执行完,并返回最后分项的值。当逻辑与
&&时,找到为false的分项就停止处理,并返回该分项的值。
1 | const a = 0 || null || 3 || 4 |
减少 if / else地狱般的调用
1 | const [age, name, sex] = [22, 'guodada', 1] |
提一下 react 的坑点, 在 render 中
1 | render(){ |
使用 Array.includes 来处理多重条件:
1 | const ages = [18, 20, 12] |
如果是较少的判断逻辑则可以使用三元运算符:
1 | const age = 22 |
优化 switch/case 语句
switch/case 比 if/else 代码结构好点,但也和它一样有时十分冗长。
这里以自己实际项目中代码举例:
有时我们可能需要对不同类型的字段进行不一样的正则验证,防止用户错误地输入。譬如
1 | const [type, value] = [1, '20'] |
我们如何巧妙的解决这个代码冗长的问题呢,如下:
1 | function func3(type, value) { |
利用对象去匹配属性值,可以减少你的代码量,也使你的代码看起来更加简洁。你也可以使用 Map 对象去匹配。
1 | function func4(type, value) { |
Map 是一种键值对的数据结构对象,它的匹配更加严格。它会区分开你传递的是字符串还是数字,譬如:
1 | limitMap.get(1) // /^(\d|[1-4]\d|50)$/g |
更多详见 Set 和 Map 数据结构
其他
函数参数默认值
1
2
3
4
5function func(name, age = 22) {}
// 等同于
function func(name, age) {
age = age || 22
}使用
===代替==。其实大家都懂这个的。。。- 箭头函数,es6 最常用的语法。
- return boolean
1
2
3
4const a = 1
return a === 1 ? true : false
// 多此一举了,其实就等于
return a === 1
敬请各位补充。交流才能进步,相视一笑,嘿嘿。