实现一个方法,总结重要的几点:参数、返回值、this指向、最后才是功能
我们都知道trim是一个去字符串空格的方法,返回的是一个新的字符串。
调用方式:string.trim()
从上面一句话就可以知道,trim不需要传参,直接是对当前调用对象进行处理,二是需要一个返回值,函数里面的this指的就是调用对象,因此不需要进行传参。
实现思路:
写在前面的话:我们应该避免使用for循环来实现类似的需求,效率慢,而且判断容易出错。
- 使用正则实现,\s 用来匹配空格,^ 用来匹配空格开头,空格可以为1个或者多个,* 来表示匹配一个或多个
- 使用字符串方法实现:subtring,截取从第一个不是空格的字符到最后一个不是空格中间的字符即可 。
- 使用for循环:每次发现一个空格就替换原字符串,以此类推
具体实现:
1、正则实现
let str = ` hello world ! `;
let _trim = function () {
if (typeof this == "number") new Error("Invalid or unexpected token");
if (typeof this !== "string")
new Error("Cannot read property 'trim' of" + this);
let reg = /^\s*|\s*$/g;
return this.replace(reg, "");
};
String.prototype._trim = _trim;
2、substring实现
//2、使用字符串方法实现:查找出第一个不是空格的字符和最后一个不是空格的字符,截取中间的内容即可
String.prototype._trim1 = function () {
let startIndex = Math.max(this.search(/\S/), 0);
let endIndex = this.search(/\S\s*$/) + 1;
return this.substring(startIndex, endIndex);
};
3、for循环实现
先把所有的空字符串的字符集列出来,然后进行从前从后进行匹配
String.prototype._trim2 = function () {
var str = this,
whitespace =
" \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000";
for (var i = 0, len = str.length; i < len; i++) {
if (whitespace.indexOf(str.charAt(i)) === -1) {
str = str.substring(i);
break;
}
}
for (i = str.length - 1; i >= 0; i--) {
if (whitespace.indexOf(str.charAt(i)) === -1) {
str = str.substring(0, i + 1);
break;
}
}
return whitespace.indexOf(str.charAt(0)) === -1 ? str : "";
};
最糟糕的情况,前面和后面空字符很多,但是需要操作很多次字符串,参考文章上写的这个效率很高,但是我觉得频繁的操作字符串也是对内存的一种浪费。
然后我在本地打印了一下_trime1和_trime2代码执行时间的差别,结果打脸了。。。
我运行了10多次,显示结果基本上都是_trime2的效率更高,不是很明白,为什么重复的操作字符串还能保持这么高的执行效率。
不知道怎么测试代码执行时间的同学看下面这两个方法:
console.time();//开发时间
console.timeEnd(); //结束时间
参考链接:https://www.cnblogs.com/rubylouvre/archive/2009/09/18/1568794.html