JavaScript 数组与字符串常用方法详解

作者:木棉

时间:2026-10-21

浏览:283

本文系统梳理了JavaScript中字符串与数组的核心操作方法。详细对比了substring、slice和substr在截取字符串时的参数处理差异,特别是负数索引的行为。深入解析了数组的增删改查方法,重点区分了splice与slice对原数组的影响,并介绍了forEach、map等遍历技巧。此外,还涵盖了数组排序、去重及常见综合应用场景。

文章目录

JavaScript基础梳理

近期在整理JavaScript基础知识,先从数组和字符串的基础操作开始梳理。

字符串常用方法详解

字符串(String)的常用方法如下:

1. substring(start, end):用于截取字符串,包含起始位置字符,不包含结束位置字符。若只提供一个参数,则表示从该位置截取至字符串末尾。


   var str='abcdefg';  
   str.substring(1) //得到bcdefg  str.substring(1,3) //得到bc

当传入负数参数时,负数会被视为0,且实际开始位置取两个参数中较小的值。

例如:str.substring(-1, 1) 等效于 str.substring(0, 1),返回首字符;str.substring(1, -2) 等效于 str.substring(0, 1),同样返回首字符。

2. slice(start, end):功能与substring类似,主要区别在于处理负数参数的逻辑不同。


var str='abcdefg'; 
str.slice(1)  //bcdefg      str.substring(1,3) // bc

当传入负数时,该值会与字符串长度相加来计算实际索引。

例如:str.slice(-1) 等效于 str.slice(6),返回最后一个字符;str.slice(1, -2) 等效于 str.slice(1, 5),返回中间部分;str.slice(-2, -1) 等效于 str.slice(5, 6),返回倒数第二个字符。

若负数的绝对值大于字符串长度,则将其视为0。

例如:str.slice(-22) 等效于 str.substring(0),返回整个字符串。

若第二个参数的绝对值大于字符串长度,则返回空字符串。

3. substr(start, length):用于截取字符串,第二个参数指定返回的字符个数。


var str='abcdefg'; 
str.substr(1) //bcdefg      str.substr(1,1) //b

当start为负数时,会与字符串长度相加确定起始位置;若end为负数,则视为0。


 str.substr(-1) =>str.substr(6)//g         
 str.substr(-2,-3) // ''

4. charAt(index):返回指定索引位置的单个字符。若索引超出有效范围(0到字符串长度减1),则返回空字符串。


 var str='abcdefg';
 str.charAt(2) // c

5. indexOf(string):返回子字符串在String对象中首次出现的位置。若未找到,则返回-1。

 var str='abcdefga'  str.indexOf('a')  // 0   str.indexOf('h') //-1

6. lastIndexOf(string):从后向前查找,返回子字符串最后一次出现的位置。

若未找到子字符串,lastIndexOf同样返回-1。

var str='abcdefga'     str.lastIndexOf('a') // 7

7. split(str):以指定参数为分隔符,将字符串分割为数组。

var str='abcadeafg'     str.split('a') //["", "bc", "de", "fg"]

8. toLowerCase():返回将字符串中所有字母转换为小写后的新字符串。

9. toUpperCase():返回将字符串中所有字母转换为大写后的新字符串。

10. match():在字符串内检索指定值,或查找与正则表达式匹配的一个或多个结果。

11. search():返回与正则表达式匹配的第一个子字符串的位置。

12. replace():用于查找与正则表达式匹配的子字符串,并用新字符串替换匹配部分。

参考链接:http://www.cnblogs.com/bijiapo/p/5451924.html

数组常用操作方法

数组(Array)的常用方法如下:

1. push():在数组末尾添加元素,返回添加后的数组长度。

2. unshift():在数组开头添加元素,返回添加后的数组长度。

3. shift():删除数组第一个元素,返回被删除的元素。

4. pop():删除数组最后一个元素,返回被删除的元素。

5. reverse():反转数组元素顺序,返回处理后的数组。

6. join():将数组元素连接为字符串,可指定分隔符。


   var arr=[1,2,3,4,5], str=arr.join('--'); 
    console.log(str); // 1--2--3--4--5 以join内的参数切割数组
    console.log(arr); // [1,2,3,4,5]  原数组未变

7. slice(start, end):截取数组,从start开始到end结束(不包含end)。

该方法返回新数组,原数组保持不变。


    var arr=[1,2,3,4,5],new=arr.slice(2,4);
    console.log(new);  // [3,4]
    console.log(arr);  // [1,2,3,4,5]     
   

8. concat():用于合并两个或多个数组,返回新数组。

9. splice(start, count, ele1, ele2...):用于插入、删除或替换数组元素。

(1) 仅一个参数:从指定位置截取至末尾,若为负数则类似slice处理,返回截取部分,原数组发生变化。


     var arr=[1,2,3,4,5];
     console.log(arr.splice(1));  // [2,3,4,5]
     console.log(arr);       // [1]
     console.lgo(arr.splice(-1))  // [5]    

(2) 两个参数:指定截取开始位置和个数,返回截取部分,原数组发生变化。


     var arr=[1,2,3,4,5];
     console.log(arr.splice(1,3)); // [2,3,4]
     console.log(arr)       // [1,5]
     arr.splice(0,1) =>arr.shift()
     arr.splcie(arr.length-1,1) =>arr.pop()

(3) 添加元素:在指定位置插入新元素,原数组增加元素。


     var arr=[1,2,3,4,5];
     console.log(arr.splice(1,0,13)); // []
     console.log(arr);        // [1,13,2,3,4,5]

(4) 替换元素:通过指定个数和后续参数实现替换操作。


     var arr=[1,2,3,4,5];
     console.log(arr.splice(1,2,'a','b')) // [2,3]
     console.log(arr);        // [1,'a','b',4,5]
     arr.splice(0,0,1) =>arr.unshift(1);
     arr.splice(arr.length,0,1) => arr.push(1)

10. arr.forEach(item, index, array) {}:遍历数组,功能类似jQuery的each。

其中item为数组元素,index为索引,array为数组本身。


var arr=[1,2,3,4,5];
      arr.forEach(function(item,index,array){
      })

注意:在嵌套循环中跳出循环可能存在未解决的问题,需根据具体场景处理。

11. map():映射方法,用法与forEach类似,但返回一个新数组。


   var men=[
          {'name':1,'age':12},
          {'name':2,'age':22},
          {'name':3,'age':33}
      ],
      age=men.map(function(item){
          return item.age;
      })

数组排序与去重算法

12. arr.sort():对数组进行排序。


  var arr=[1,2,22,11,33,3,5,4];
    console.log(arr.sort()) // [1,11,2,22,3,33,4,5] 

默认情况下,sort方法按ASCII字符顺序排序,而非数值大小。

       arr.sort(function(a,b){ return a-b})

可通过比较函数实现排序:(a, b) => a - b为从小到大,b - a为从大到小。

13. 常见排序算法实现:

(1) 冒泡排序:每次比较相邻两个数,若后一个比前一个小则交换位置。


  function bSort(arr){
      var tmp;
      for(var i=0,len=arr.length-1;i<len;i++){
        for(var j=0;j<len;j++){
          if(arr[j]>arr[j+1]){
            //换位置
            tmp=arr[j+1];
            arr[j+1]=arr[j];
            arr[j]=tmp;
          }
        }
      }
      return arr;
    } 
    function bSort(arr){
      var tmp;
      arr.forEach(function(item,i){
        arr.forEach(function(item,i){
          if(item>arr[i+1]){
            //换位置
            tmp = arr[i + 1];
            arr[i + 1] = arr[i];
            arr[i] = tmp;
          }
        })
      })
      return arr
    }

(2) 快速排序:采用分治法,选取中间值,将小于中间值的放左边,大于的放右边,递归处理。


 function fastSoft(arr){
        var len=arr.length;
        if(len<=1){ return arr}
        var  cIndex=Math.floor(len/2),
           c=arr.splice(c,1),
           left=[],
           right=[];
        arr.forEach(function(item,i){
            if(item<c[0]){
            left.push(item);
          }else{
            right.push(item);
          }
        })
     return fastSoft(left).concat(c,fastSoft(right));
   }   
 

14. 数组去重方法:

(1) 双层循环:效率较低,不推荐。


    var arr=[2,3,2,2,2,4,5],
          arr2=[];
            function find(arr2,ele){
             for(var i= 0,len=arr2.length;i<len;i++){
               if(arr2[i]==ele) return true;
             }
              return false;
            }
            for(var i= 0,len=arr.length;i<len;i++){
              if(!find(arr2,arr[i])){
                arr2.push(arr[i]);
              }
            }

(2) 利用对象Key无重复特性:将数组元素作为Key存入对象,再提取Key。


  var arr=[2,3,2,2,2,4,5],
          json={},
          arr2=[];
            arr.forEach(function(item,i){
              if(!json[item]){
                json[item]=222;
              }
            });
            for(var name in json){
              arr2.push(Number(name));//类型发生变化了
            }

(3) 利用sort排序后去重:排序后相邻元素相同,遍历去除重复项。


   var arr=[2,3,2,4,4,4,5],
      arr2=[];
        arr.sort();
        for(var i=0;i<arr.length;i++){
          if(arr[i]==arr[i+1]){
            arr.splice(i--,1);
          }
        }

综合应用场景示例

一些常见的数学方法应用。


        math.abs() 取绝对值  math.ceil() 向上取整 math.floor() 向下取整
        math.round() 四舍五入 math.roundom
    function getRan(n,m){
      return Math.floor(Math.random()*(m-n)+n);
    }  
  

数组和字符串的一些综合应用场景:

1. 截取文件后缀名。

(1) 示例代码:var str='1.xxx.avi';

           str=str.substring(str.lastIndexOf('.')+1);

(2) 处理逻辑示例:var str='1.xxx.avi';


        var arr=str.split('.');
        console.log(arr[arr.length-1]);

2. 字母翻转及首字母大写处理。


     var str='wo shi yi ge demo',
        arr=str.split(' ');
        for(var i=0;i<arr.length;i++){
          console.log()
         arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substring(1);
        }
        arr.reverse();
        str=arr.join(' ');

3. 统计字符串中字符出现次数。


     var str='aaaandkdffsfsdfsfssq12345',
        json={},
        n= 0,
        sName;
        for(var i= 0,len=str.length;i<len;i++){
          var Letter=str.charAt(i);
          //统计次数
          if(json[Letter]){
            json[Letter]++;
          }else{
            json[Letter]=1;
          }
        }
        //找最大
        for(var name in json){
          if(json[name]>n){
            n=json[name];
            sName=name;
          }
        }
        console.log('出现最多的字母'+sName+'次数为'+n);

4. 简单的URL参数解析方法。


  function getData() {
          var search = window.location.search.substring(1);
          if (!search) {
            return;
          }
          var arr = search.split('&'),
              arr2 = [],
              json = {},
              key,
              alue;
          for (var i = 0; i < arr.length; i++) {
            arr2 = arr[i].split('=');
            key = arr2[0];
            value = arr2[1];
            json[key] = value;
          }
          return json;
         }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章