操作字符串的方法有哪些?
字符串是不可变的, 字符串中的所有方法实际上返回的都是一个新的字符串值
字符串的连接
str.concat(str2)
去掉字符串前后的空白
str.trim()
字符串的截取
str.substring(1, 4)
str.substr(1, 4), str.substr(-2)
str.splice(1, 2, 'a', 'b')
str.slice(0), str.slice(0, -1)
字符串转数组
str.split('-')
字符串的替换
str.replace(/abc/gi, 'dd')
str.replace(pattern, (match, key) => {})
str.splice(1, 2, 'a', 'b')
str.toUpperCase(), str.toLowerCase()
字符串的查找
- str.indexOf('a'), str.lastIndexOf('a'), str.indexOf('a', 3)
- str.charAt(2), str[2]
- str.charCodeAt(2)
- String.fromCharCode(65, 66, 67)
操作数组的方法有哪些
数组的出栈入栈操作
arr.push(), arr.pop(), arr.unshift(), arr.shift()
数组转字符串
arr.join('-')
数组元素的排序
arr.reverse()
arr.sort((a, b)=>{return a-b})
数组的连接
arr.concat([3, 4])
数组的截取
arr.slice(0), arr.slice(0, -1), arr.slice(0, 2)
arr.splice(1, 2, 'a', 'b')
数组元素的查找
- arr.indexOf(), arr.lastIndexOf()
数组元素的遍历
- arr.forEach(), arr.map()
- arr.filter(), arr.reduce((prev, cur) => { return (prev+cur); }, 10);
- arr.some(), arr.every(), arr.find()
模拟实现API
字符串API的实现
trim
String.prototype.trimPolyfill = function() {
let str = this;
let pattern = /^\s*|\s*$/g;
return str.replace(pattern, '');
} 数组API的实现
reduce
Array.prototype.reducePolyfill = function(...args) {
const arr = this; // 存储数组
let initialValue = 0; // 设置最开始归并的初始值
let prev = 0; // 每次归并后的返回值, 归并前的第一个值
let fn = args[0]; // 回调函数
// 异常处理
if(args.length === 0)throw new TypeError('undefined is not a function');
if(typeof args[0] !== 'function')throw new TypeError(`${args[0]} is not a function`);
if(arr.length === 0 && args.length === 1)throw new TypeError('Reduce of empty array with no initial value');
initialValue = args[1] === undefined ? 0 : args[1];
prev = fn(initialValue, arr[0], 0, arr);
for(let i = 1; i < arr.length; i++) {
prev = fn(prev, arr[i], i, arr);
}
return prev;
} map
Array.prototype.mapPolyfill = function(...args) {
const arr = this; // 存储数组
let result = []; // 最终的返回值
let fn = args[0]; // 回调函数
let cbThis = null;
// 异常处理
if(args.length === 0) throw new TypeError('undefined is not a function');
if(typeof args[0] !== 'function') throw new TypeError(`${args[0]} is not a function`);
cbThis = args[1] === undefined ? null : args[1];
for(let i = 0; i < arr.length; i++) {
result.push(fn.call(cbThis, arr[i], i, arr));
}
return result;
} filter
Array.prototype.filterPolyfill = function(...args) {
const arr = this; // 存储数组
let cbThis = null; // 回调函数的this
let fn = null; // 回调函数
let result = []; // 最终的返回值
// 异常处理
if(args.length === 0)throw new TypeError('undefined is not a function');
if(typeof args[0] !== 'function')throw new TypeError(`${args[0]} is not a function`);
cbThis = args[1] === undefined ? null : args[1];
fn = args[0];
for(let i = 0; i < arr.length; i++) {
if(Boolean(fn.call(cbThis, arr[i], i, arr)) === true) result.push(arr[i]);
}
return result;
} find
Array.prototype.findPolyfill = function(...args) {
const arr = this; // 存储数组
let cbThis = null; // 回调函数的this
let fn = null; // 回调函数
let result = undefined; // 最终的返回值
// 异常处理
if(args.length === 0) throw new TypeError('undefined is not a function');
if(typeof args[0] !== 'function') throw new TypeError(`${args[0]} is not a function`);
cbThis = args[1] === undefined ? null : args[1];
fn = args[0];
for(let i = 0; i < arr.length; i++) {
if(Boolean(fn.call(cbThis, arr[i], i, arr)) === true) {
result = arr[i];
break;
}
}
return result;
} 
京公网安备 11010502036488号