String操作方法底層實現!!!

不愛寫程式碼的程式設計師發表於2018-03-08

以下程式碼純屬個人寫著玩。為了加深理解和熟悉字串提供的方法的思路。但是我發現我寫完之後還是忘了。沒啥鳥用。分享給大家指點。String操作方法底層實現!!!

大家說如果面試的話,讓面試者寫一個字串底層方法實現思路。是否能快速寫出來。

1:charAt

/*
* charAt()方法
* 功能  :  返回指定位置的字元
* 引數  :  傳遞一個下標
* 官方使用
* var str = "abcdefg";
* str.charAt(2);	        //c
* str.charAt("CCCC");		//輸入其他字元都預設返回下標為0的字元   輸出a
* str.charAt(-1);		//傳遞負值返回空字串
*/

String.prototype.ycCharAt = function(){
	var parma = arguments[0];
	var returnStr = parma >= 0 ? this[parma] : !isNaN(parma) ?  "" : this[0];
	return returnStr;
}
複製程式碼


2:concat

/*
* concat()方法
* 功能  :  用於連線兩個字串
* 引數  :  傳遞一個字串
* 官方使用
* var str = "abcdefg";
* str.concat(123);			//"abcdefg123"
* str.concat([1,2,3]);			//"abcdefg1,2,3"
* str.concat({name:"123"});		//"abcdefg[object Object]"
*/
String.prototype.ycConcat = function(){
	return this + arguments[0];
}
複製程式碼


二:三個字串擷取方法實現

1:slice

/*
* slice() 方法
* 功能  :  擷取字串。
* 引數  :  第一個引數是子字串的開始位置,第二個引數是子字串的結束位置(不含該位置)
* 注意  : 
* 	1:第一個引數不能大於第二個引數的值  否則返回空
* 	2:如果引數是負值。當引數是負數時候  字串長度會預設加上負數 
* 官方使用
* var str = "abcdefg";
* str.slice(1);					//"bcdefg"
* str.slice(1,4);				//"bcd"
* str.slice(1,-4);				//結束位置就相當於 字串長度7+-4 =  3 === slice(1,3)  = bc
* str.slice(-3,-4);				//""
*/
String.prototype.ycSlice = function(){
	var _str = "";
	//獲取開始位置
	var _start = arguments[0] >= 0 ? arguments[0] : this.length+arguments[0] ;
	//獲取結束位置
	var _end = arguments[1] >= 0 ? arguments[1] : this.length+arguments[1] ;
	for(var i=0;i<this.length;i++){
		if(i >= _start  && i < _end){
			_str += this[i];
		}
	}
	return _str;
}
複製程式碼


2:substring

/*
* substring() 方法
* 功能  :  擷取字串。如果引數是負值。當引數是負數或者時候  字串長度會預設加上負數 
* 引數  :  第一個引數是子字串的開始位置,第二個引數是子字串的結束位置(不含該位置)
* 注意	: 
* 	1:第一個引數不能大於第二個引數的值  否則返回空
* 	2:當傳遞不是數字則預設轉換為0
* 官方使用
* var str = "abcdefg";
* str.substring(1);					//"bcdefg"
* str.substring(1,4);				//"bcd"
* str.substring(1,-4);				//結束位置就相當於 字串長度substring(1,0)  = b
* str.substring(-3,-4);				//""
*/
String.prototype.ycSubstring = function(){
	var _str = "";
	//獲取開始位置
	var _start = arguments[0] >= 0 ? arguments[0] : 0 ;
	//獲取結束位置
	var  _end  = arguments[1] >= 0 ? arguments[1] : 0 ;
	for(var i=0;i<this.length;i++){
		if(i >= _start  && i < _end){
			_str += this[i];
		}
	}
	return _str;
}
複製程式碼


3:substr

/*
* substr() 方法
* 功能  :  擷取字串。如果引數是負值。當引數是負數或者時候  字串長度會預設加上負數 
* 引數  :  第一個引數是子字串的開始位置,第二個引數是子字串的長度
* 注意	: 
* 		1:第一個引數是負值。當引數是負數時候  字串長度會預設加上負數 
* 		2:第二個引數當傳遞不是數字則預設轉換為0
* 官方使用
* var str = "abcdefg";
* str.substr(1);					//"bcdefg"
* str.substr(1,4);					//"bcd"
* str.substr(1,-4);					//結束位置就相當於 字串長度substring(1,0)  = b
* str.substr(-3,-4);				//""
*/
String.prototype.ycSubstr = function(){
	var _str = "";
	//獲取開始位置
	var _start = arguments[0] >= 0 ? arguments[0] : this.length+arguments[0];
	//獲取結束位置
	var  _end  = arguments[1] >= 0 ? arguments[1] : 0 ;
	for(var i=0;i<this.length;i++){
		if(i >= _start  && i < (_start+_end)){
			_str += this[i];
		}
	}
	return _str;
}
複製程式碼


三:檢索匹配字串對應的下標

1:indexOf

/*
* indexOf() 方法
* 功能  :  返回指定字元在當前字串第一次出現的位置。
* 引數  :  第一個引數:匹配的字串   第二個引數 :從哪個位置開始匹配
* 官方使用
* var str = "abcdefga";
* str.indexOf("a");				//"0"
* str.indexOf("a",2);				//"7"
* str.indexOf(1);				//-1
*/

String.prototype.ycIndexOf = function(){
	var _parma = arguments[0];
	var _start = arguments[1] || 0;
	var _index = -1;
	for(var i=_start;i<this.length;i++){
		if(this[i] == _parma){
			_index = i;
			return _index;
		}
	}
}
複製程式碼

2:lastIndexOf

/*
* lastIndexOf() 方法
* 功能  :  返回當前字串最後一個匹配的字元索引
* 引數  :  第一個引數:匹配的字串   第二個引數 :從哪個位置開始匹配
* 官方使用
* var str = "abcdefga";
* str.lastIndexOf("a");					//"7"
* str.lastIndexOf("a",2);				//"0"
* str.lastIndexOf(1);					//-1
*/

String.prototype.ycLastIndexOf = function(){
	var _parma = arguments[0];
	var _start = arguments[1] ||  this.length;
	var _index = -1;
	for(var i=_start;i >= 0;i--){
		if(this[i] == _parma){
			_index = i;
			return _index;
		}
	}
}
複製程式碼


後續有時間了 可能會繼續寫下去。發現把字串和陣列的底層方法自己實現一遍的話。再去做什麼陣列去重 排序。。。思路自然而然就來了。


相關文章