数组方法
常用的传统数组对象方法
修改原数组※
1
2
3
4
5
6
7arr.push(item) // 向数组的末尾添加一个或更多元素,并返回新的长度
arr.unshift(item) // 向数组的开头添加一个或更多元素,并返回新的长度
arr.pop() // 删除并返回数组的最后一个元素
arr.shift() // 删除并返回数组的第一个元素
arr.sort() // 对数组的元素进行排序
arr.reverse() // 颠倒数组中元素的顺序
arr.splice(index, 1) // 删除元素 index num不修改原数组※
1
2
3arr.concat([1, 2, 4]) // 连接两个或更多的数组,并返回新数组
arr.join(',') // 通过指定的分隔符分割数组,拼接成字符串并返回
arr.slice(start, end) // 返回start end (不包括该位置) 之间的内容组成的新数组es5新增数组方法
不修改原数组※
1
2
3
4
5
6
7
8
9arr.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
3arr.find(item => {}) // 找出第一个符合条件的数组成员 找不到返回 undefined
arr.findIndex(item => {}) // 返回第一个符合条件的数组成员的位置 找不到返回 -1
arr.includes(item) // 判断数组是否包含给定的值 返回 true / false (es7)
字符串方法
字符串是 不可变 的 !!!
es5
1
2
3
4
5
6
7
8
9
10str.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
4str.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))
}