练习一
封装函数检查字符串结尾是否以 参数二 结尾:
例如:输入confirmEnding("He has to give me a new name", "me")返回true
分别采用字符串截取的几种方式解决问题
function aa(str, b) {
var len = b.length;
// var newstr = str.substr(str.length - len,len);
//截取字符串方法一substr(开始位置,个数)
// var newstr = str.substr(str.length - len);//第二个参数可以不传
// var newstr = str.substr(- len)//也可以传个负数
// if(newstr == b ){
// return true
// }else{
// return false
// }
// var newstr = str.substring(str.length - len ,str.length);
//截取字符串方法二 substring(开始位置,结束位置)不包含结束位置
// var newstr = str.substring(str.length - len ,str.length);
//第二个参数可以不传。不支持传负数
// 截取字符串方法三slice(开始,结束)
// var newstr = str.slice(str.length - len ,str.length);
// var newstr = str.slice(str.length - len );//可以一个参数
var newstr = str.slice(- len);//可以负数,比substring多了可以传负数的写法
return newstr == b; //这是比三目更简的写法 return newstr == b ?true:false;
}
var bol = aa("How are you,I am fine.What is your name", "me")
console.log("返回结果bol为", bol);
也可以采用字符串切割为数组的方式解决,判断切割后的数组最后一项是不是空字符串
function aa(str, b) {
var arr = str.split(b)
console.log(arr);
return arr[arr.length - 1] === '' ? true:false;
// return !arr[arr.length - 1]//可以简写为 三目或if的条件结果就是true或false,注意要取反,因为去掉是否等于空字符串了 === ''
}
var bol = aa("How are you,I am fine.What is your name", "me")
console.log("返回结果bol为", bol);
练习二封装函数 用来反转数字
例如:输入reverseNumber(123456);返回654321
方法一利用数字取模
function aa(num){
var res = 0;
while(num){
res = res *10 + num % 10;
num = parseInt(num / 10);
}
return res;
}
console.log(aa(123456789));
方法二利用字符串循环(通过字符串的长度控制循环次数)
function aa(num){
var res = 0;
var len = (num + "").length;
for(var i=0;i<len;i++){
res = res *10 + num % 10;
num = parseInt(num / 10);
}
return res;
}
console.log(aa(123456789));
方法三利用字符串
function aa(num){
var res = '';
var str = num +'';
var len = str.length;
for(var i = len-1; i >= 0 ; i--){ //采用从大到小i-- i要大于等于零
res += str[i]
}
return +res;
}
console.log(aa(123456789));
方法四 转为字符串,切割为数组,再反向reverse
function aa(num){
var res = '';
var str = num +'';
var arr = str.split("")
arr.reverse(); //数组反向倒序后会修改自己本身
res = arr.join("");
return +res;
}
console.log(aa(123456789));
练习三 在数组中查询某个数字出现了几次
var arr = [ 10,20,30,40,30,60,20,40,60,10,40]//查询40出现了几次
var index = arr.indexOf(40);
console.log(index);
var arrs=[];
while(index > 0){
arrs.push(index);
index = arr.indexOf(40,index+1);
}
console.log(arrs)
练习四去除字符串前后中间空格
var str=" hello world ";
console.log(str);
var arr = str.split("");
for(i=arr.length-1;i>=0;i--){
if(arr[i]==" "){
arr.splice(i,1)
}
}
console.log(arr.join(""));
练习五字符串首字母大写
var str="hello siri you are rubbish";
var arr=str.split(" ");
var newstr="";
var newArr=[];
for(i=0;i<arr.length;i++){
newstr = (arr[i][0]).toUpperCase() + arr[i].substr(1);
newArr.push(newstr);
}
console.log(newArr);
console.log(newArr.join(" "));
练习六写一个函数对传入的字符串输出所有子字符串组合
例如:输入substrings('dog'); 返回['d', 'do', 'dog', 'o', 'og', 'g']
function aa(str){
var arr= [];
var len = str.length;
console.log(len);
for(var i=0; i < len; i++){
for(var j=1; j<len - i; j++){
arr.push(str.substr(i,j));
}
}
return arr;
}
var result = aa("xincun");
console.log(result);
练习七写一个函数对传入的字符串重新按字母排序
(排序有 sort 和 reserse)
例如:输入reorderStr('webmaster');返回 abeemrstw
function aa(str){
return str.split("").sort().join("");
}
console.log(aa('dfadsghtwerwaqr'));
练习八写一个函数对传入的字符串中每个单词的首字母大写
例如:输入myCap('the quick brown fox'); 返回654321 The Quick Brown Fox
方法一采用字符串切割的方法
function aa(str){
var arr = str.split(" ");
var len = arr.length;
for(var i = 0;i <len; i++){
arr[i]= arr[i].substr(0,1).toUpperCase() + arr[i].substr(1);
}
arr = arr.join(" ");
return arr;
}
console.log(aa("you are right thanks"));
方法二 用替换的方法replace()
function aa(str){
var arr = str.split(" ");
var len = arr.length;
for(var i = 0;i <len; i++){
arr[i]= arr[i].replace(arr[i][0],arr[i][0].toUpperCase());
}
arr = arr.join(" ");
return arr;
}
console.log(aa("you are right thanks"));
练习九 写一个函数找出传入的字符串中最长的单词
例如:输入findLongest('Web Development Tutorial'); 返回 Development
方法一:利用变量存当前数组中最长长度及其索引
function aa(str){
var arr = str.split(" ");
var len = 0;
var index = 0;
for(var i = 0 ;i < arr.length; i++){
if(arr[i].length > len){
len = arr[i].length;
index = i;
}
}
return("句子中最长字符串为" + arr[index] +"长度为"+ len + "下标为" + index)
}
console.log(aa("aaa bbbbb cccccccc ddddddddddddd eee fffff"));
方法二:利用变量直接存最长的字符串
function aa(str){
var arr = str.split(" ");
var Maxstr = '';
for(var i = 0 ;i < arr.length; i++){
if(arr[i].length > Maxstr.length){
Maxstr = arr[i]
}
}
return("句子中最长字符串为" + Maxstr +"长度为"+ Maxstr.length)
}
console.log(aa("aaa bbbbb cccccccc ddddddddddddd eee fffff"));
练习十封装函数 实现toUpperCase方法
例如: 输入myUpperCase("hello"); 返回HEllo
function aa(str){
str = str || '';// 如果用户不传参,要提前想到,不传参默认是undefined,undefined的length不存在就会报错,空字符的length为0
var len = str.length;
var newstr = '';
for(var i = 0;i <len; i++){
var charcode = str.charCodeAt(i)//获取字符的ASCII
if(charcode<=122 && charcode >=97){
newstr += String.fromCharCode(charcode -32)
}else{
newstr += str[i]
}
}
return newstr;
}
console.log(aa('dafgd134fafsdf!,dsfsd123'));
练习十一封装函数 实现数组sort的方法(参考冒泡排序)
例如:输入mySort([2,33,41,10,5]); 返回 [2,5,10,33,41]
function mysort(arr){
var len = arr.length;
for(var i=0;i<len-1;i++){
for(var j=0;j<len-1-i;j++){
if(arr[j] < arr[j+1]){ //如果从大到小就改为<
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] =temp;
}
}
}
return arr
console.log(arr);
}
console.log(mysort([10,46,33,48,21,18,4,13]));
练习十二删除数组中的假值去除数组的负项
例如:输入bouncer([7, "ate", "", false, 9]); 返回[7,"ate",9]
方法一从前往后
function bouncer(arr){
for(var i=0 ;i<arr.length;i++){ //实时获取数组的长度,使用i<arr.length
if(!arr[i]){
arr.splice(i ,1);
i--; //如果条件符合,length就会减一,所以i要回归一次,防止跳过,如果改为从后往前就不存在跳过的问题
}
}
return arr;
}
console.log(bouncer([7, "ate", "", false, 9,0,00,NaN,99]));
方法一从后往前
function bouncer(arr){
for(var i=arr.length-1;i>=0;i--){
if(!arr[i]){
arr.splice(i ,1);
}
}
return arr;
}
console.log(bouncer([7, "ate", "", false, 9,0,00,NaN,99]));
练习十三比较字符串,如果第一个字符串中包含了第二个字符串的所有字母,则返回true
,否则返回false
例如:输入compare(["hello", "heo"]); 返回true
方法一 字符串方法indexOf()
function compare(arr){
var str = arr[1];
var len = arr[1].length;
for(var i=0; i<len; i++){
if((arr[0].indexOf(str[i]))=== -1){
return false;
}
}
return true;
}
console.log(compare(["hello", "heo"]));
方法二 数组方法indexOf()
function compare(arr){
var arr2 = arr[1].split("");
var arr3 = arr[0].split("");
var len = arr2.length;
for(var i=0; i<len; i++){
if((arr3.indexOf(arr2[i]))=== -1){
return false;
}
}
return true;
}
console.log(compare(["hello", "he1o"]));
方法三数组方法包含includes()
function compare(arr){
var arr2 = arr[1].split("");
var arr3 = arr[0].split("");
var len = arr2.length;
for(var i=0; i<len; i++){
if(!arr3.includes(arr2[i])){
return false;
}
}
return true;
}
console.log(compare(["hello", "heo"]));
练习十四封装函数 用指定字符串替换字符串的
例如:输入replaceStr('l am wuwei','wuwei','sixsixsixx')
方法一:(只能替换一次)
function replaceStr(str,aa,bb){
var newstr = str.replace(aa,bb)
return newstr;
}
console.log(replaceStr("wo shi jing,jing shi mama","jing","xincunmeihao"));
方法二 多个时使用循环语句,while只要条件满足就循环
function replaceStr(str,aa,bb){
var newStr=str;//尽量不修改原数据,防止后面会用到,所以定义newStr
while(newStr.indexOf(aa) !== -1){
newStr = newStr.replace(aa,bb)
}
return newStr
}
console.log(replaceStr("wo shi jing,jing shi mama,jing jing","jing","xincunmeihao"));
方法三可以改为for循环
function replaceStr(str,aa,bb){
var newStr=str;//尽量不修改原数据,防止后面会用到,所以定义newStr
for(;newStr.indexOf(aa) !== -1;){ //只要保证for循环的判断条件能从true到false的变化就行
newStr = newStr.replace(aa,bb)
}
return newStr
}
console.log(replaceStr("wo shi jing,jing shi mama,jing jing","jing","xincunmeihao"));
方法四 递归
function replaceStr(str,aa,bb){
if (str.indexOf(aa) == -1){
return str;
}
var newStr=str.replace(aa,bb);
return replaceStr(newStr,aa,bb)
}
console.log(replaceStr("wo shi jing,jing shi mama,jing jing he jing","jing","xincunmeihao"));
练习十五封装函数 实现push方法
方法一数组可以通过下标加值,每次只能加一个值
function mypush(arr,num){
arr[arr.length]=num;
return arr;
}
var oldarr=[10,30,20];
console.log(mypush(oldarr,50));
console.log(mypush(oldarr,60));
console.log(mypush(oldarr,70));
方法二通过实参列表arguments[]实现用户传多个参数
function mypush(arr,num){
for(var i=1;i<arguments.length;i++){
arguments[0].push(arguments[i])
}
return arguments[0];
}
var oldarr=[10,30,20];
console.log(mypush(oldarr,50,61,72,83,94,105));
方法三把自己写的方法添加给数组的属性(或者直接添加到原型链上,方便所有数组调用)
function myPush() {
// arguments; [arr,30,40,50)]
for (var i = 0; i < arguments.length; i++) {
this.push(arguments[i]) //this是对象
}
return this
}
var arr = [10, 20]
// arr.myPush=myPush; //给数组添加方法,只有arr可以使用myPush
Array.prototype.myPush=myPush; //给原型链添加方法,每个调用myPush的数组都可以使用myPush方法了
console.log(arr.myPush(30, 40, 50, 60,70, 80)) //隐式的this绑定
var arr2=[11,22,33,44,55,66,77];
console.log(arr2.myPush(30, 40, 50, 60,70, 80));
练习十六封装函数 获取字符串中的数字,并按照数组输出
例如:输入returnArr('shdkfh1234cxj5665sdkj2121') 返回[1234,5665,2121]
采用分割字符串,判断ASCII码48-57范围内的就是数字
function returnArr(str){
var arr=[];
var len = str.length;
var num1 = 0,num2 = 0;//保存ASCII码
var start = 0,end = 0;//数字开始索引,结束索引
aa:for(var i = 0; i < len ; i++){
num1 = str.charCodeAt(i);
start = i;
if(48 <= num1 && num1 <= 57){
// 是数字进入
for(var j = start;j<len;j++){
num2 =str.charCodeAt(j);
if(!(48 <= num2 && num2 <= 57)|| j == len-1){
end =(48 <= num2 && num2 <= 57)&& j == len-1 ? j+1:j;//保证最后一位是数字时也能截取出来
arr.push(str.slice(start,end))//不是数字就截取
i = j;//将结束索引给开始
continue aa;//结束内层循环,直接进入外层循环,外层打标签
}
}
}
}
return arr;
}
console.log(returnArr('shdkfh1234cxj5665sdd555k444j2121'));
练习十七封装函数 查找出第一个只出现一次的字符
例如:unquie("wuwei"); 返回"u"
方法一思路:从前往后,从后往前查询字符索引一样,说明只有一个,不一样至少两个
function unquie(str){
var len = str.length;
for(var i=0;i<len;i++){
var char = str[i];
if(str.indexOf(char) === str.lastIndexOf(char)){
return char;
}
}
return "字符串中没有只出现一次的字符"
}
console.log(unquie("wuweieiaau"));
练习十八封装函数 实现字符串去重
例如:输入deweightStr("wuweiwu"); 返回'wuei'
方法一同一个字符的索引不同,表示这个字符是重复的
function unquie(str){
var len =str.length;
for(var i=0;i<len;i++){
var char =str[i];
if(str.indexOf(char) !== str.lastIndexOf(char)){ //字符串中同一个字符的索引不同,表示这个字符是重复的
str=str.replace(char,"")
i--;
}
}
return str
}
console.log(unquie("wuweieiaaulilijingji"));
方法二思路定义一个新空字符串,查询里面是否有相应的字符,如果没有,值为-1,就拼接进去,如果有了值就为相应的索引值,就不拼接
function unquie(str){
var len =str.length;
var newStr = "";
for(var i=0;i<len;i++){
if(newStr.indexOf(str[i]) === -1){
newStr += str[i];
}
}
return newStr
}
console.log(unquie("wuweieiaaulilijingji"));
console.log(unquie("aabbcdwegha"));
方法三思路对象的属性是不能重复的,所以利用对象的属性来处理
function unquie(str){
var obj={};
var len=str.length;
var newStr="";
for(var i=0;i<len;i++){
var char =str[i];
obj[char] = char;
}
for(var key in obj){
newStr += key
}
return newStr;
}
console.log(unquie("wuweieiaaulilijingji"));
console.log(unquie("aabbcdwegha"));
console.log(unquie("jinhuajinhua"));
练习十九封装函数 输出指定字符串的长度:
提示: 一个中文占2个字节,一个英文占一个字节 str.length 得到的是字符的长度,中文英文都是占一个字符
方法一
function bytelen(str){
var len = str.length;
var bytelen = 0;
for(var i=0;i<len;i++){
if(str.charCodeAt(i)>255){
bytelen += 2;
}else{
bytelen++
}
}
return bytelen;
}
console.log(bytelen("abcENGLISH中文汉语"));
方法二
function bytelen(str){
var len = str.length;
var bytelen = len; //中文只是少算一个字节,循环里加一
for(var i=0;i<len;i++){
if(str.charCodeAt(i)>255){
bytelen ++;
}
}
return bytelen;
}
console.log(bytelen("abcENGLISH中文汉语"));
练习二十封装函数 获取浏览器url中的数据 要求:函数返回值是一个对象(字符串切割成对象后可以直接访问属性)
var url =
'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=wuwwei&rsv_pq=becd1331000082fd&rsv_t=0f84&rqlang=cn&rsv_enter=1&rsv_sug3=14&rsv_sug1=12&rsv_sug7=100&rsv_sug2=0&rsp=0&inputT=9344&rsv_sug4=3518432'
function paramsStrToObj(url){
var obj={};
var paramsStr = url.split('?')[1];
var paramsArr =[];
var milddleArr =[];
if(paramsStr){//防止paramsStr中只有域名 https://www.baidu.com/s
paramsArr = paramsStr.split("&")
}
for(var i=0 ;i<paramsArr.length;i++){
milddleArr =paramsArr[i].split("=");
obj[milddleArr[0]] = milddleArr[1];
}
return obj;
}
var result = paramsStrToObj(url)
console.log(result);
console.log(result.wd);
反向拼接回去(知道对象,域名,拼接字符串地址url)
结果 http://www.baicu.com?wd=123&time=123456
var params = {
wd: '123',
time: 123456
}
var url = 'http://www.baidu.com'
function paramsObjToStr(obj){
var str="?";
if(obj){ //判断对象是否存在
for(var key in obj){
str += key + "=" + obj[key]+"&"
}
}
return str.slice(0,str.length-1);
}
console.log(paramsObjToStr(params));
console.log(url + paramsObjToStr(params));
网友评论