花了点时间整理了下以前的一些笔记,js提供了很多很多的方法,给我们的开发节省了很多的时间,它这些方法我们常见的有哪些?具体得怎么调用?这些方法的底层又是怎么实现的?我们可否自己尝试着写一个?有时候网上的一些方法去找比较零散,也就自己来整理整理,也当做以后自己的一本手册子吧,方便闲时的翻看或是备忘。
由于篇幅有限,我们先分类别吧,首先来一起看看数组字符串操作的常见方法吧:
想后续看更新的可以到这:github地址
我只列了其中比较常用的,以后可能会补充:
/** * 1、split : 将字符串转化为数组 (单词译为:使分离) * 2、join : 数组重组为字符串 (单词译为:连接) * 3、reserve : 数组里所有元素顺序倒置 (单词译为:储备) * 4、slice :数组或字符串片断截取 (单词译为:切片) * 5、splice : 数组增删元素 (单词译为:拼接) * 6、sort : 数组元素排序 (单词译为:分类) * 7、concat :用于连接两个或多个数组 (单词译为:合并多个数组或字符串,联结) * 8、shift :删除原数组中的第一项,并返回删除元素的值 * 9、unshift : 将参数添加到原数组开头(shift和unshift这两个其实比较鸡肋,且存在着低版本如ie6返回值不准确问题) * 10、push : 比较常见的方法,用于在数组末尾添加元素 (单词译为:堆栈) * */
上面这几个相对来说是我们比较常用的,那他们大概是用来干嘛的我们知道了,那具体得怎么用呢?
我一个个的列,并举例吧,相信看完你会比较清楚的。
//1、split(reg); //把字符串转换为数组,传入的参数是一个匹配单元,字符串会根据这个匹配 单元把字符串切割成一份份并形成一个数组 let str0 = "my name is dorsey!"; console.log(str0.split(''));// ['m','y',' ','n','a','m','e',' ','i','s',' ','d','o', 'r','s','e','y','!'];注意的是空格也是字符 console.log(str0.split(' ')); //["my","name","is","dorsey!"] //2、join(reg);//相对于上面的拆,这里是重组,即把数组重新连接成字符串,原理一致,参数也 是一个匹配单元,需注意的是join是数组的一个属性 let arr0 = ["my","name","is","dorsey!"]; console.log(arr0.join('-')); //传入“-”连接符号 my-name-is-dorsey! console.log(arr0.join(' ')); //传入“ ”空格连接符 my name is dorsey! 空格也是符 号,空格灾难地狱也是因为程序员的粗心导致的 //3、reverse(); 数组的一个对象,作用是将数组中的元素倒置 let arr1 = ["my","name","is","dorsey!"]; console.log(arr1.reverse());["dorsey!","is","name","my"]; //倒过来 // 1-2-3上面综合小案例 let str1 = "我是一名中国人!"; console.log(str1.split('').reverse().join('')); //4、slice(start,end); 字符串或数组切取,截取 let str2 = "my name is dorsey!"; console.log(str2.slice(3,7)); //截取这段字符串中的第4~第7 即4,5,6,7这几个字符 let arr2 = ["my","name","is","dorsey!"]; console.log(arr2.slice(1, 3)); //也可以用于数组,切取是数组的第2~3个元素 //5、splice(index,howmany,item1,item2...):数组增删元素,后面的item是要添加的项目,并 从index位置开始添加,index是从哪开始删除,howmany是要删除的个数 let str3 = ["my","name","is","dorsey!"]; str3.splice(2,2); //从str3[2]开始删除,删除2个,即"is" 和 "dorsey!" console.log(str3);//["my","name"] let arr3 = ["my","name","is","dorsey!"]; arr3.splice(2,0,2);//只添加项目就设置howmany值为零,这样它就删除0个,只添加 console.log(arr3);//["my","name",2,"is","dorsey!"]; //6、sort():对数组元素进行排序,注意这里的是以ASCLL码表做排序,且比对的是字符串的形式, 比如415跟6,415会让4跟6比对,4在前,所以415比6前 let arr4 = [1,2,6,3,'b','baoh',457,712,41,62,"a","A",'']; //比如这里的A是排在65,a是排在97,而0~9的ascll码序号则是是从48开始到57结束,所以数字排在 字母之前,而之所以是根据这个表是因为C语言而来的 arr4.sort(); console.log(arr4);//[1, 2, 3, 312, 41, 457, 6, 62, "A", "a"] //准确的说是Unicode码,即在ascll码的基础上拓展了一些新字符,比如汉字的二进制存储,这里可 以不用管,不知道为什么A排在a之前的可以去查一查 //这样的sort虽然具备拓展性和通用性,但显然不是我们想要的,比如我的数组只有数字,我只要数 字从小到大排序就好,怎么做呢?两个字,传参数 let arr5 = [1,25,10,7,100,2560,13,-3281,-23,0]; function mun1(a,b){ return a-b; } console.log(arr5.sort(mun1)); //7、concat():合并多个数组,既可以几个数组来,也可以直接传一个字符串,会被当成数组的一 个 let arr6 = ["my","name","is","dorsey!"]; let arr7 = ["I'm","from","China.",["你好啊","hello"]]; //这里数组里放数组我只是需要 让你直观的确认concat实际上只处理了两层,但够了。 console.log(arr6.concat(arr7)); //["my", "name", "is", "dorsey!", "I'm", "from", "China."]; console.log(arr6.concat('dahids')); //["my", "name", "is", "dorsey!", "dahids"] //8、shift():删除数组第一项的值,返回删除元素的值 let arr8 = ["my","name","is","dorsey!"]; console.log(arr8.shift()); //my console.log(arr8); //["name", "is", "dorsey!"] //9、unshift():将参数添加到原数组开头,且返回新数组的长度,注意的是部分浏览器返回结果 有误,如ie6还有firefox2.0 let arr9 = ["my","name","is","dorsey!"]; arr9.unshift('呵呵!', 'hello'); console.log(arr9); //10、push():将参数添加到原数组末尾,比较常用 let arr10 = ["my","name","is","dorsey!"]; arr10.push('呵呵!', 'hello'); console.log(arr10);
知道怎么用了,那它们的底层是如何实现的?我们可否自己来写一个?
答案肯定是可以的,我直接贴代码吧,解释很详细的,都在代码注释里面。这里就不再啰嗦了。
其中有些类似的,我就没写两个(比如join),可以自己尝试看看能否写出来,其实无论是什么,特别是我们编程行业,更需要我们那种对问题究根结底的求知欲,养成一种好的习惯,对于我们更深入的理解js,进阶更高层次有很大的帮助。
//1、split函数内部实现,join函数实现实际上是差不多的 //实际上它的内部应该是这样实现的:为了简化函数及方便理解,而split是作为一个属性存在于String这个对象里, //这里咱只是把要切成数组的字符串当参数传进来,为了方便直观我就不封在数组对象里了,一样的其实 //另外呢,由于我也没看过底层源码是怎样的,实际上肯定有更高级巧妙的方式,特别这个while()函数最好少用,不过整体思路应该差不多,下同 let Split = function(string,str){ let rule = new RegExp(str), accept = [], // str0 = string; //为了不影响原字符串,缓存一下 //这里的切取一般得是用C/C++的for循环一个个字符去遍历,这里直接用了slice,只是大致看看里面是怎么走的 while(1){ if(rule.test(str0) && str !== ''){ accept.push(str0.slice(0,str0.indexOf(str))); str0 = str0.slice((str0.indexOf(str)+str.length),str0.length); } else { if(str === '' ) { for(let i = 0; i < str0.length; i ++ ){ accept.push(str0[i]); } break; } else{ accept.push(str0);break; } } } return accept; } console.log(Split(str0,'')); console.log(str0.split('')); //3、函数reverse内部实现,实际上应该是有更好的办法的,这里我们了解下原理即可 let Reverse = function(arr){ let accept = []; for(let i = 0;i < arr.length;i++){ accept[i] = arr[arr.length-1-i]; } return accept; } console.log(Reverse(arr2)); console.log(arr2.reverse()); //4、slice函数内部实现:为了方便直观我就不封在数组或字符串对象里了,一样的其实 let Slice = function(start,end,val){ let accept; if(typeof(val) === "string"){ accept = ''; for(let i = start;i < (end > val.length ? val.length : end ); i++){ accept += val[i]; } } else { let j = 0; accept = []; for(let i = start;i < (end > val.length ? val.length : end ); i++){ accept[j] = val[i]; j++; } } return accept; } console.log(Slice(3, 100, str2)); console.log(str2.slice(3, 100)); console.log(Slice(2, 8, arr2)) console.log(arr2.slice(2, 8)); //6、sort方法实现:为了方便直观我就不封在数组对象里了,一样的其实,从它的实际应用来看应该内部逻辑很复杂,为了简化,我们 //只考虑了纯数字的排序,也不考虑用函数作为参数来传参,咱考虑正序和逆序即可 //注意!注意!注意!这里的排序只对数字有效 let Sort = function(arr,order){ //order只有StoL和LtoS,StoL代表正序(小-大),LtoS代表倒序(大-小) let accept = arr,mid; if(accept.length > 1){ for(let i = 1; i < accept.length; i ++ ){ for(let j = 0; j < i; j ++ ){ if((accept[i] < accept[j] && order === 'StoL') || (accept[i] > accept[j] && order === 'LtoS')){ //满足条件则交换位置 mid = accept[i]; //这里如果是纯number类型的,可以不用新增寄存器(变量mid) accept[i] = accept[j]; accept[j] = mid; // mid中间值 } } } } return accept; } // //基本sort排序 let sortTest = [1,25,10,7,100,2560,13,-3281,-23,0]; console.log(Sort(sortTest,'LtoS')); //7、concat方法实现:为了方便直观我就不封在数组对象里了,一样的其实 let Concat = function(){ let accept = []; for(let i = 0; i < arguments.length; i ++){ if(typeof (arguments[i]) !== "string"){ for(let j = 0; j < arguments[i].length; j++){ accept.push(arguments[i][j]); } } else { accept.push(arguments[i]); } } return accept; } console.log(Concat(arr6, 'dasoai','dsaoidha','我去你妹的')); //两者输出结果一致 console.log(arr6.concat('dasoai','dsaoidha','我去你妹的')); //["my", "name", "is", "dorsey!", "dasoai", "dsaoidha", "我去你妹的"] //8、shift方法实现 :删除数组第一个元素 let Shift = function(arr){ let firstVal = arr[0]; for(let i = 0; i < arr.length-1; i++){ arr[i] = arr[i + 1]; } arr.length -=1; return firstVal; } let shiftTest = [1,25,10,7,100,2560,13,-3281,-23,0]; console.log(Shift(shiftTest)); //返回第一个元素 console.log(shiftTest); //删除了第一个元素的数组 //9、unshift方法实现 : 将参数添加到数组开头 let Unshift = function(arr){ arr.length += arguments.length-1; for(let i = arr.length;i > arguments.length-1; i --){ arr[i-1] = arr[i-arguments.length]; } for(let i = 0 ; i < arguments.length-1 ; i ++){ arr[i] = arguments[i+1]; } return arr.length; } let unshiftTest = [1,25,10,7,100,2560,13,-3281,-23,0]; console.log(Unshift(unshiftTest,"hello","world")); //返回新数组长度12 console.log(unshiftTest); //返回新数组 //10、push方法实现 : 将参数添加到数组末尾,与unshift的原理实质上是一致的 let Push = function(arr){ arr.length += arguments.length - 1; for(let i = 1; i < arguments.length ; i ++){ arr[arr.length - arguments.length + i] = arguments[i]; } return arr.length; } let pushTest = [1,25,10,7,100,2560,13,-3281,-23,0]; console.log(Push(pushTest,"hello","world")); //返回新数组长度12 console.log(pushTest); //返回新数组
(原创首发于慕课网)