一、for循环遍历字符串
let str = 'hello world'; for(let i=0; i<str.length; i++){ console.log(str[i]) }
for循环是最常用的遍历字符串的方法,通过控制变量i的值,可以依次访问到字符串的每一个字符。需要注意的是,在JavaScript中,字符串是以UTF-16编码方式存储的,因此一个字符可能占据1个或2个字节,所以字符串长度并不等于字符个数,可以通过字符串对象的.length属性获取实际长度。
for循环可以拆成两个部分,即初始化部分和循环条件部分。这里的初始化部分为let i=0,即将计数器i初始化为0;循环条件部分为i<str.length,即当i小于字符串长度时执行循环语句;每次循环完毕后,都会将计数器i+1。
需要注意的是,在字符串中,每个字符都是以0开始编号的,因此循环条件部分要用小于号<而不是小于等于号<=。如果使用错误的循环条件,会导致越界或产生不必要的错误结果。
二、for...in遍历字符串
let str = 'hello world'; for(let i in str){ console.log(str[i]) }
for...in语句可以遍历对象的属性,对于字符串来说,它会将字符串视为一个字符数组,依次遍历每个字符。与for循环不同,for...in会遍历所有可枚举属性,包括字符串对象的原型中的属性,所以需要使用hasOwnProperty()方法判断是否为自身属性。
需要注意的是,在使用for...in遍历字符串时,获取到的每个字符都是一个字符串类型,需要通过调用charAt()方法或直接将索引值转换为数字类型来获得实际字符。
三、for...of遍历字符串
let str = 'hello world'; for(let value of str){ console.log(value) }
for...of语句是ES6新增的遍历方法,可以直接遍历字符串的值而不是索引。与for...in遍历对象的属性类似,for...of也会遍历所有可迭代的对象,包括数组、Set、Map等。
for...of与传统的for循环和for...in遍历最大的不同点就在于它处理的不是索引,而是元素本身,因此遍历结果与原始数据结构保持一致。
四、forEach遍历字符串
let str = 'hello world'; Array.prototype.forEach.call(str, function(value){ console.log(value) })
forEach是Array原型对象上的方法,可以遍历数组中的每个元素,但对于字符串并没有直接提供forEach方法。因此,可以借助Array.prototype.call()方法来将字符串强制转换为数组,并调用数组的forEach()方法执行遍历操作。
需要注意的是,在使用forEach遍历字符串时,需要将字符串强制转换成字符数组,这会产生额外的开销。另外,forEach方法是一个高阶函数,它接收一个回调函数作为参数,因此需要传入一个匿名函数来实现遍历字符串的操作。
五、map遍历字符串
let str = 'hello world'; Array.prototype.map.call(str, function(value){ console.log(value) })
与forEach类似,map也是Array原型对象上的方法,用来遍历数组并对每个元素执行操作,并将结果存放在一个新数组中。对于字符串并没有提供map方法,因此需要借助Array.prototype.call()方法将字符串转换到数组上进行操作。
需要注意的是,在使用map对字符串进行遍历时,需要将返回值存放在一个新数组中,否则遍历结果会被覆盖。另外,由于map方法返回的是一个新数组,因此在遍历进行完毕后,需要手动输出结果。