数组字符串-方法归纳

wujiawen 发布于

数组方法

  • 常用的传统数组对象方法

    修改原数组※

    1
    2
    3
    4
    5
    6
    7
    arr.push(item) // 向数组的末尾添加一个或更多元素,并返回新的长度
    arr.unshift(item) // 向数组的开头添加一个或更多元素,并返回新的长度
    arr.pop() // 删除并返回数组的最后一个元素
    arr.shift() // 删除并返回数组的第一个元素
    arr.sort() // 对数组的元素进行排序
    arr.reverse() // 颠倒数组中元素的顺序
    arr.splice(index, 1) // 删除元素 index num

    不修改原数组※

    1
    2
    3
    arr.concat([1, 2, 4]) // 连接两个或更多的数组,并返回新数组
    arr.join(',') // 通过指定的分隔符分割数组,拼接成字符串并返回
    arr.slice(start, end) // 返回start end (不包括该位置) 之间的内容组成的新数组
  • es5新增数组方法

    不修改原数组※

    1
    2
    3
    4
    5
    6
    7
    8
    9
    arr.indexOf(item) // 返回对应下标 没有则返回 -1
    arr.forEach(item => {}) // 遍历数组
    arr.map(item => {}) // 对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
    arr.filter(item => {}) // 过滤 返回满足条件的新数组
    arr.some(item => {}) // 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true
    arr.every(item => {}) // 判断数组中是否都满足所给条件,当所有项都满足条件,才会返回true
    arr.reduce((pre, cur) => {}) // 对数组中的每个值(从左到右)作累计操作 最终计算为一个值
    Array.isArray(arr) // 判断参数是否是”Array”返回true或false
    Array.from(set) // 将Set集合转换成数组 可用于去重
  • es6(之后)新增数组方法

    不修改原数组※

    1
    2
    3
    arr.find(item => {}) // 找出第一个符合条件的数组成员 找不到返回 undefined
    arr.findIndex(item => {}) // 返回第一个符合条件的数组成员的位置 找不到返回 -1
    arr.includes(item) // 判断数组是否包含给定的值 返回 true / false (es7)

字符串方法

字符串是 不可变 的 !!!

  • es5

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    str.indexOf(item) // 与数组方法相似 返回对应下标 没有则返回 -1
    str.slice(start, end) // 返回start end (不包括该位置) 之间的内容组成的新字符串
    str.substring(start, stop) // 截取内容为 start stop-1
    str.trim() // 去首尾空格 返回新字符串
    str.trimLeft() // 去左边空格 返回新字符串
    str.trimRight() // 去右边空格 返回新字符串
    str.split(',') // 按给定值分割字符串
    str.replace(substr, replacement) // 替换指定的字符 可正则查找需替换的字符
    str.toLowerCase() // 将字符串转小写 返回新字符串
    str.toUpperCase() // 将字符串转小写 返回新字符串
  • es6

    1
    2
    3
    4
    str.includes(item) // 判断字符串是否包含给定字符 返回 true / false
    str.startsWith(value, start) // 判断字符串是否以给定值开头 start 可指定开始位置
    str.endsWith(value, start) // 判断字符串是否以给定值开头 start 可指定开始位置
    str.repeat(counts) // 返回一个新字符串,表示将原字符串重复n次

浅拷贝与深拷贝

  • 浅拷贝方法 —-—-—slice()、concat()、扩展运算符…
    1
    2
    3
    4
    5
    6
    7
    8
    // 数组
    const arr = [1, 2, 3, 4, 5]
    const newArr = arr.slice() // 返回浅拷贝后的的数组
    const newArr = arr.concat() // 返回浅拷贝后的的数组
    const newArr = [...arr] // 扩展运算符 跟arr.slice()是一样的效果

    // 对象
    Object.assign(obj) // 拷贝对象属性的引用 所以只能拷贝一层 是浅拷贝 Object.assign(target, source1, source2, ...) 合并对象 第一个是目标对象 后面都是源对象 同名属性会被覆盖
  • 深拷贝 —-—-—深度遍历、JSON.parse()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    // 深度遍历 将每一个属性值赋给新对象
    /**
    * This is just a simple version of deep copy
    * Has a lot of edge cases bug
    * If you want to use a perfect deep copy, use lodash's _.cloneDeep
    * @param {Object} source
    * @returns {Object}
    */
    function deepClone(source) {
    if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'deepClone')
    }
    const targetObj = source.constructor === Array ? [] : {}
    Object.keys(source).forEach(key => {
    if (source[key] && typeof source[key] === 'object') {
    targetObj[key] = deepClone(source[key])
    } else {
    targetObj[key] = source[key]
    }
    })
    return targetObj
    }

    // 使用 JSON.parse()
    // 原理:先转json字符串 再转成json对象
    // 转json字符串后 因为已经不是对象,故肯定不会与旧对象有关联 再转回json对象 此时会重新分配堆栈空间
    function deepClone(initialObj) {
    return JSON.parse(JSON.stringify(initialObj))
     }