妙啊,我在开发中常用的JavaScript小技巧

554 阅读7分钟

这是大冰块2021年第12篇原创文章,和大冰块一起在前端领域努力吧!!!💪


写在前面

今天整理了一些日常开发中常用的JavaScript小技巧,都是经常使用的,写出来整理一下供大家参考。

1. 基本类型转换 —— + 和 !

使用场景:

  • 给后端传值,后端给的是string(number),再传给后端的时候,后端要求这个值传参类型为number(string)。
  • 拿到后端给的string(number)值之后,前端展示需要当作number(string)处理。

使用方法:

吾有真言如下:

类型转换不可怕,使用 + 号走天下。!号还能转布尔,下次一定要用它。

  • string类型+number类型会拼接成string类型
  • +string类型会转为number类型
  • number类型 + '' 会转为string类型
  • !取反,!!取反再取反,对0, "",null,undefined,NAN取反为true,其它取反均为false

代码案例:

let a = "1.2"
let b = 1
let c = "0"
let d = 0

a+b // "1.21"
+a // 1.2
b+'' // "1"
!a // false
!!a // true
!d // true
!!d // false

2. 逻辑运算符 —— && 和 ||

使用场景:

  • if嵌套过多,多个条件判断有依赖关系

使用方法:

  • && 左边成立才会执行右边的,左边的是必定执行的。如果左边成立会继续执行右边的;左边不成立则右边的就不再执行。左右两边都为 true 则返回 ture ,任一边返回 false 则返回 false。
  • || 左边执行完就会执行右边的,左边的是必定执行的。如果左边成立则右边的就不再执行;左边不成立则会继续执行右边的。左右两边任一边返回 ture 则返回 ture ,两边都为false 时才返回false。

代码案例:

if(obj){
	if(obj.id){
		if(obj.id === xxx){
			// doSomething
		}
	}
    if(obj.uid){
       // doSomething
    }
}
// 可改为:
if(obj && ((obj.id && obj.id === xxx) || obj.uid)){
    // doSomething
}
// 或者配合三元表达式:(注意:三元表达式里不能写return语句,只能写表达式)
(obj && ((obj.id && obj.id === xxx) || obj.uid)) ? doSomething : ''

3. 解构赋值 —— [ ] 和 { }

使用场景:

  • 给元素赋对象或数组的值
  • 变量交换

使用方法:

  • 针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
  • 对数组模型解构
  • 对对象模型解构

代码案例:

数组模型解构

let [a, b, c] = [1, 2, 3]
// a = 1
// b = 2
// c = 3

// 嵌套也可以哦
let [a, [[b], c]] = [1, [[2], 3]]
// a = 1
// b = 2
// c = 3

// 可忽略
let [a, , b] = [1, 2, 3]
// a = 1
// b = 3

// 不完全解构
let [a = 1, b] = []
// a = 1
// b = undefined

// 剩余运算符
let [a, ...b] = [1, 2, 3]
//a = 1
//b = [2, 3]

// 可遍历对象
let [a, b, c, d, e] = '嘻!你好啊'
// a = '嘻'
// b = '!'
// c = '你'
// d = '好'
// e = '啊'

// 设置解构默认值
let [a = 3, b = a] = [];     // a = 3, b = 3
let [a = 3, b = a] = [1];    // a = 1, b = 1
let [a = 3, b = a] = [1, 2]; // a = 1, b = 2

// 变量交换
let {a,b} = {a:1, b:2}
[a,b] = [a,b]

对象模型解构

let { foo, bar } = { foo: 'aaa', bar: 'bbb' }
// foo = 'aaa'
// bar = 'bbb'
let { baz : foo } = { baz : 'ddd' }
// foo = 'ddd'

// 嵌套也可以哦
let obj = {p: ['hello', {y: 'world'}] }
let {p: [x, { y }] } = obj
// x = 'hello'
// y = 'world'

// 可忽略
let obj = {p: ['hello', {y: 'world'}] }
let {p: [x, {  }] } = obj
// x = 'hello'

//不完全解构
let obj = {p: [{y: 'world'}] }
let {p: [{ y }, x ] } = obj
// x = undefined
// y = 'world'

// 剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
// a = 10
// b = 20
// rest = {c: 30, d: 40}

// 设置解构默认值
let {a = 10, b = 5} = {a: 3}
// a = 3; b = 5
let {a: aa = 10, b: bb = 5} = {a: 3}
// aa = 3; bb = 5

4. 高级解构使用 —— [ ] 和 { }

这个其实还是属于解构赋值,只是更有技巧一些,用到的也多,所以单独列出来写一下。

使用场景:

  • 把数组项赋值给特定的变量

使用方法:

{0:a, 1:b} = [1,2]

代码案例:

把数组下标为 0 的值 "今天" 赋给变量 today, 下标为 2 的值 "明天" 赋给变量 afterTomorrow

let arr = ["今天","明天","后天"]
let { 0: today, 2: afterTomorrow } = arr
console.log(today) // "今天"
console.log(today) // "后天"

5. 模板字符串 —— ``

使用场景:

  • 字符串的拼接,变量的拼接,路径的拼接等

使用方法:

${}

代码案例:

let a = "(●'◡'●)"
let b = "昨天的月亮一点也不亮,"
let c = "因为不是从你的窗子里看到的。"
let d = `${a}${b}${c}` 
// "(●'◡'●)昨天的月亮一点也不亮,因为不是从你的窗子里看到的。"

6. 数组截取 —— length

使用场景:

  • 后端返回m条数据,只需展示前n个

使用方法:

Array.length = n

代码案例:

let arr = [1,2,3,4,5,6,7,8,9]
arr.length = 3
// [1,2,3]

7. 数组去重 —— Set

使用场景:

  • 对后端返回数组数据去重
  • 前端添加tag标签时去重处理

使用方法:

只使用Set 和展开运算符,就可以轻松实现数组去重 : [...new Set(arr)]

代码案例:

let arr = [11,'嘻嘻',11,22,'哈哈','哈哈',true,true]
let formatArr = [...new Set(arr)]
// [11, "嘻嘻", 22, "哈哈", true]

8. 格式化 JSON 代码 —— JSON.stringify

使用场景:

  • 在打印台检查当前json字符串是否正确,格式化 JSON 的输出。

使用方法:

JSON.stringify(value, replacer, space)

  • value:

    必需, 要转换的 JavaScript 值(通常为对象或数组)。

  • replacer:

    可选。用于转换结果的函数或数组。

    如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。

    如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。

  • space:

    可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。

代码案例:

let obj1 = { 
    obj2: { 
        arr: [1, 2, 3, 4], 
        obj3: { a: 1, b: '2' } 
    } 
}
JSON.stringify(obj1, null, 4)

// "{
//     "obj2": {
//         "arr": [
//             1,
//             2,
//             3,
//             4
//         ],
//         "obj3": {
//             "a": 1,
//             "b": "2"
//         }
//     }
// }"

9. 扁平化多维数组 —— (...Array)

使用场景

  • 多重嵌套数组的展开提取

使用方法

(...Array)

代码案例

const arr = [11, [22, 33], [44, 55], 66]
const flatArr = [].concat(...arr)
//=> [11, 22, 33, 44, 55, 66]

如果想操作多维数组,可以通过递归来解决:

function formatArray(arr) {
  let flattened = [].concat(...arr)
  return flattened.some(item => Array.isArray(item)) ? 
    formatArray(flattened) : flattened
}

let arr = [11, [22, 33], [44, [55, 66, [77, [88]], 99]]]
let flatArr = formatArray(arr)
// [11, 22, 33, 44, 55, 66, 77, 88, 99]

10. 向上向下取整 —— ~~

使用场景

数字向上向下取整

使用方法

~ 先向下取整,再加1,再取反。即:~(A) = -(A+1)

~~ 取绝对值,再向下取整。

代码案例

let a = 11
let b = 11.11
let c = 11.89
let d = -11
let e = -11.11
let f = -11.89

~a // -12
~b // -12
~c // -12
~d // 10
~e // 10
~f // 10

~~a // 11
~~b // 11
~~c // 11
~~d // 11
~~e // 11
~~f // 11

总结

这些都是常用的方法技巧,平时多用学写自然就记住了,一起加油吧~


如果你看完觉得意犹未尽,可以看看大冰块《看完就懂系列》的文章,《看完就懂系列》旨在把一些常见的概念或方法以通俗易懂的方式呈现出来。欢迎大家点击一起讨论学习:

原创不易,如有错误,欢迎指正。

如果有帮助到你,请给大冰块悄悄点赞关注,你的点赞关注就是我写下去的动力。

让我们一起在前端的路上进步吧~🤭