# 1. 带有多个条件的 if 语句
把多个值放在一个数组中,然后调用数组的 includes 方法。
| |
| if (x === 'abc' || x === 'def' || x === 'ghi' || x ==='jkl') { |
| |
| } |
| |
| if (['abc', 'def', 'ghi', 'jkl'].includes(x)) { |
| |
| } |
# 2. 简化 if true...else
对于不包含大逻辑的 if-else 条件,可以使用下面的快捷写法。我们可以简单地使用三元运算符来实现这种简化。
| |
| let test: boolean; |
| if (x > 100) { |
| test = true; |
| } else { |
| test = false; |
| } |
| |
| let test = (x > 10) ? true : false; |
| |
| let test = x > 10; |
| console.log(test); |
如果有嵌套的条件,可以这么做。
| let x = 300, |
| test2 = (x > 100) ? 'greater 100' : (x < 50) ? 'less 50' : 'between 50 and 100'; |
| console.log(test2); |
# 3. 声明变量
当我们想要声明两个具有相同的值或相同类型的变量时,可以使用这种简写。
| |
| let test1; |
| let test2 = 1; |
| |
| let test1, test2 = 1; |
# 4. null、undefined 和空值检查
当我们创建了新变量,有时候想要检查引用的变量是不是为非 null 或 undefined。JavaScript 确实有一个很好的快捷方式来实现这种检查。
| |
| if (test1 !== null || test1 !== undefined || test1 !== '') { |
| let test2 = test1; |
| } |
| |
| let test2 = test1 || ''; |
# 5. null 检查和默认赋值
| let test1 = null, |
| test2 = test1 || ''; |
| console.log("null check", test2); |
# 6. undefined 检查和默认赋值
| let test1 = undefined, |
| test2 = test1 || ''; |
| console.log("undefined check", test2); |
一般值检查
| let test1 = 'test', |
| test2 = test1 || ''; |
| console.log(test2); |
另外,对于上述的 4、5、6 点,都可以使用??操作符。
如果左边值为 null 或 undefined,就返回右边的值。默认情况下,它将返回左边的值。
| const test= null ?? 'default'; |
| console.log(test); |
| |
| const test1 = 0 ?? 2; |
| console.log(test1); |
| |
# 7. 给多个变量赋值
当我们想给多个不同的变量赋值时,这种技巧非常有用。
| |
| let test1, test2, test3; |
| test1 = 1; |
| test2 = 2; |
| test3 = 3; |
| |
| let [test1, test2, test3] = [1, 2, 3]; |
# 8. 简便的赋值操作符
在编程过程中,我们要处理大量的算术运算符。这是 JavaScript 变量赋值操作符的有用技巧之一。
| |
| test1 = test1 + 1; |
| test2 = test2 - 1; |
| test3 = test3 * 20; |
| |
| test1++; |
| test2--; |
| test3 *= 20; |
# 9. if 判断值是否存在
这是我们都在使用的一种常用的简便技巧,在这里仍然值得再提一下。
| |
| if (test1 === true) or if (test1 !== "") or if (test1 !== null) |
| |
| if (test1) |
注意:如果 test1 有值,将执行 if 之后的逻辑,这个操作符主要用于 null 或 undefinded 检查。
# 10. 用于多个条件判断的 && 操作符
如果只在变量为 true 时才调用函数,可以使用 && 操作符。
| |
| if (test1) { |
| callMethod(); |
| } |
| |
| test1 && callMethod(); |
# 11. for each 循环
这是一种常见的循环简化技巧。
| |
| for (var i = 0; i < testData.length; i++) |
| |
| for (let i in testData) or for (let i of testData) |
遍历数组的每一个变量。
| function testData(element, index, array) { |
| console.log('test[' + index + '] = ' + element); |
| } |
| [11, 24, 32].forEach(testData); |
| |
# 12. 比较后返回
我们也可以在 return 语句中使用比较,它可以将 5 行代码减少到 1 行。
| |
| let test; |
| function checkReturn() { |
| if (!(test === undefined)) { |
| return test; |
| } else { |
| return callMe('test'); |
| } |
| } |
| var data = checkReturn(); |
| console.log(data); |
| function callMe(val) { |
| console.log(val); |
| } |
| |
| function checkReturn() { |
| return test || callMe('test'); |
| } |
# 13. 箭头函数
| |
| function add(a, b) { |
| return a + b; |
| } |
| |
| const add = (a, b) => a + b; |
更多例子:
| function callMe(name) { |
| console.log('Hello', name); |
| } |
| callMe = name => console.log('Hello', name); |
# 14. 简短的函数调用
我们可以使用三元操作符来实现多个函数调用。
| |
| function test1() { |
| console.log('test1'); |
| }; |
| function test2() { |
| console.log('test2'); |
| }; |
| var test3 = 1; |
| if (test3 == 1) { |
| test1(); |
| } else { |
| test2(); |
| } |
| |
| (test3 === 1? test1:test2)(); |
# 15. switch 简化
我们可以将条件保存在键值对象中,并根据条件来调用它们。
| |
| switch (data) { |
| case 1: |
| test1(); |
| break; |
| case 2: |
| test2(); |
| break; |
| case 3: |
| test(); |
| break; |
| |
| } |
| |
| var data = { |
| 1: test1, |
| 2: test2, |
| 3: test |
| }; |
| data[something] && data[something](); |
# 16. 隐式返回
通过使用箭头函数,我们可以直接返回值,不需要 return 语句。
| |
| function calculate(diameter) { |
| return Math.PI * diameter |
| } |
| |
| calculate = diameter => Math.PI * diameter |
# 17. 指数表示法
| |
| for (var i = 0; i < 10000; i++) { ... } |
| |
| for (var i = 0; i < 1e4; i++) { |
# 18. 默认参数值
| |
| function add(test1, test2) { |
| if (test1 === undefined) |
| test1 = 1; |
| if (test2 === undefined) |
| test2 = 2; |
| return test1 + test2; |
| } |
| |
| add = (test1 = 1, test2 = 2) => (test1 + test2); |
| add() |
# 19. 延展操作符简化
| |
| |
| const data = [1, 2, 3]; |
| const test = [4 ,5 , 6].concat(data); |
| |
| |
| const data = [1, 2, 3]; |
| const test = [4 ,5 , 6, ...data]; |
| console.log(test); |
我们也可以使用延展操作符进行克隆。
| |
| |
| const test1 = [1, 2, 3]; |
| const test2 = test1.slice() |
| |
| |
| const test1 = [1, 2, 3]; |
| const test2 = [...test1]; |
# 20. 模板字面量
如果你厌倦了使用 + 将多个变量连接成一个字符串,那么这个简化技巧将让你不再头痛。
| |
| const welcome = 'Hi ' + test1 + ' ' + test2 + '.' |
| |
| const welcome = `Hi ${test1} ${test2}`; |
# 21. 跨行字符串
当我们在代码中处理跨行字符串时,可以这样做。
| |
| const data = 'abc abc abc abc abc abc\n\t' |
| + 'test test,test test test test\n\t' |
| |
| const data = `abc abc abc abc abc abc |
| test test,test test test test` |
# 22. 对象属性赋值
| let test1 = 'a'; |
| let test2 = 'b'; |
| |
| let obj = {test1: test1, test2: test2}; |
| |
| let obj = {test1, test2}; |
# 23. 将字符串转成数字
| |
| let test1 = parseInt('123'); |
| let test2 = parseFloat('12.3'); |
| |
| let test1 = +'123'; |
| let test2 = +'12.3'; |
# 24. 解构赋值
| |
| const test1 = this.data.test1; |
| const test2 = this.data.test2; |
| const test2 = this.data.test3; |
| |
| const { test1, test2, test3 } = this.data; |
# 25. 数组 find 简化
当我们有一个对象数组,并想根据对象属性找到特定对象,find 方法会非常有用。
| const data = [{ |
| type: 'test1', |
| name: 'abc' |
| }, |
| { |
| type: 'test2', |
| name: 'cde' |
| }, |
| { |
| type: 'test1', |
| name: 'fgh' |
| }, |
| ] |
| function findtest1(name) { |
| for (let i = 0; i < data.length; ++i) { |
| if (data[i].type === 'test1' && data[i].name === name) { |
| return data[i]; |
| } |
| } |
| } |
| |
| filteredData = data.find(data => data.type === 'test1' && data.name === 'fgh'); |
| console.log(filteredData); |
# 26. 条件查找简化
如果我们要基于不同的类型调用不同的方法,可以使用多个 else if 语句或 switch,但有没有比这更好的简化技巧呢?
| |
| if (type === 'test1') { |
| test1(); |
| } |
| else if (type === 'test2') { |
| test2(); |
| } |
| else if (type === 'test3') { |
| test3(); |
| } |
| else if (type === 'test4') { |
| test4(); |
| } else { |
| throw new Error('Invalid value ' + type); |
| } |
| |
| var types = { |
| test1: test1, |
| test2: test2, |
| test3: test3, |
| test4: test4 |
| }; |
| var func = types[type]; |
| (!func) && throw new Error('Invalid value ' + type); func(); |
# 27. indexOf 的按位操作简化
在查找数组的某个值时,我们可以使用 indexOf () 方法。但有一种更好的方法,让我们来看一下这个例子。
| |
| if(arr.indexOf(item) > -1) { |
| } |
| if(arr.indexOf(item) === -1) { |
| } |
| |
| if(~arr.indexOf(item)) { |
| } |
| if(!~arr.indexOf(item)) { |
| } |
按位 (~) 运算符将返回 true(-1 除外),反向操作只需要!~。另外,也可以使用 include () 函数。
| if (arr.includes(item)) { |
| |
| } |
# 28. Object.entries()
这个方法可以将对象转换为对象数组。
| const data = { test1: 'abc', test2: 'cde', test3: 'efg' }; |
| const arr = Object.entries(data); |
| console.log(arr); |
| |
| [ [ 'test1', 'abc' ], |
| [ 'test2', 'cde' ], |
| [ 'test3', 'efg' ] |
| ] |
| **/ |
# 29. Object.values()
这也是 ES8 中引入的一个新特性,它的功能类似于 Object.entries (),只是没有键。
| const data = { test1: 'abc', test2: 'cde' }; |
| const arr = Object.values(data); |
| console.log(arr); |
| |
| [ 'abc', 'cde'] |
| **/ |
# 30. 双重按位操作
| |
| Math.floor(1.9) === 1 |
| |
| ~~1.9 === 1 |
# 31. 重复字符串多次
为了重复操作相同的字符,我们可以使用 for 循环,但其实还有一种简便的方法。
| |
| let test = ''; |
| for(let i = 0; i < 5; i ++) { |
| test += 'test '; |
| } |
| console.log(str); |
| |
| 'test '.repeat(5); |
# 32. 查找数组的最大值和最小值
| const arr = [1, 2, 3]; |
| Math.max(…arr); |
| Math.min(…arr); |
# 33. 获取字符串的字符
| let str = 'abc'; |
| |
| str.charAt(2); |
| |
| str[2]; |
# 34. 指数幂简化