【问题标题】:How to reverse a string in JavaScript using a "for...in" loop?如何使用“for...in”循环反转 JavaScript 中的字符串?
【发布时间】:2018-06-13 23:33:58
【问题描述】:

我有一段 JavaScript 代码使用 for 循环来反转字符串。但是,我想知道是否可以使用 for in 循环,我将如何处理?

     function reverse(str){
         var reversedString = '';
         for (var i = str.length - 1; i >= 0; i--){
            reversedString = reversedString + str[i];
     }
     return reversedString;
   }

   alert(reverse('hello'));

【问题讨论】:

  • 不要在字符串上使用 for...in 它将遍历不是数字索引的属性
  • for in 用于循环遍历可枚举的属性。规范甚至不保证按顺序迭代,尽管在实践中确实如此。没有使用for in 完成此任务的正确方法。

标签: javascript loops


【解决方案1】:

来自MDN Docs

for...in 不应用于迭代索引所在的数组 顺序很重要。

数组索引只是可枚举的属性 整数名称,其他方面与一般对象相同 特性。不能保证 for...in 将返回 任何特定顺序的索引。 for...in 循环语句将 返回所有可枚举的属性,包括那些非整数的 名字和继承的名字。

因为迭代的顺序是依赖于实现的,迭代 在一个数组上可能不会以一致的顺序访问元素。所以 最好使用带有数字索引的 for 循环(或 Array.prototype.forEach() 或 for...of 循环)迭代时 访问顺序很重要的数组。

let iterable = '1234567';
String.prototype.hello = "hello";  // doesn't affect
let reversed = "";
for (let value of iterable) {
  reversed = value + reversed;
}

console.log(reversed);
Feature        Chrome   Edge    Firefox Internet Explorer   Opera   Safari
Basic support   38       12       131       No                25        8

打破for..in(看到你好悄悄进来)

let iterable = '1234567';
String.prototype.hello = "hello";
let reversed = "";
for (let index in iterable) {
  reversed = iterable[index] + reversed;
}

console.log(reversed);

【讨论】:

  • 这是因为 for in 循环中的“index”值起始值确实是 4(hello.length)
【解决方案2】:

即使使用箭头函数,您也可以反转字符串。

 const reverseString = (str) => str.split("").reverse().join("");
 console.log(reverseString("hello"))

【讨论】:

    【解决方案3】:

    不需要用for in

    'mystring'.split('').reverse().join('')
    

    【讨论】:

    • 不错的答案,但我仍然认为“如果它没有坏,就不要修复它”。您也可以争辩说 OP 当前的方法更具可读性。
    • 我认为OP知道这个内置reverse函数的解决方案,但他需要自己的reverse()函数。实际上,OP 已经得到它,但想要一些改进。 :)
    • 这不能回答问题
    【解决方案4】:

    在这种情况下,您不应使用 for...infor...in 设计用于迭代对象字面量,而不是字符串或数组。

    [...'mystring'].reverse().join('')
    Array.from('mystring').reverse().join('')
    

    我建议您使用扩展语法或Array.from 将字符串转换为数组而不是.split(''),因为split('') 在多字节unicode 字符的情况下不起作用。

    console.log([...'\uD83D\uDE80']);
    console.log('\uD83D\uDE80'.split(''));
    

    【讨论】:

    • 不错的答案,比所有其他复制粘贴的更好。
    【解决方案5】:

    您可以使用 split() 和 reduce() 函数

    let str = "hello";
    return  str.split('').reduce((rev,char) =>
       char + rev,
    '');
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2017-04-13
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 2020-05-22
      相关资源
      最近更新 更多