【问题标题】:Js for loop changing a string - how does it know?Js for循环更改字符串-它怎么知道?
【发布时间】:2021-10-21 00:34:38
【问题描述】:

这个简单的函数接受一个包含 10 个单个数字的数组,并将这些数字输出为以通用电话号码格式编写的字符串。遍历数组,程序如何“知道”它应该替换格式中的每个“x”,而不是每次循环时只替换第一个“x”?我知道如果它只替换第一个“x”,那么这个函数就没有意义了。但我不明白程序“知道”在遍历数组时替换每个“x”是如何发生的。

function createPhoneNumber(numbersArr){
  var format = "(xxx) xxx-xxxx";
  for(var i = 0; i < numbersArr.length; i++)
  {
    format = format.replace('x', numbersArr[i]);
  }
  return format;
}

【问题讨论】:

  • 在第二次循环迭代中,第一个x已经被正确的值替换了,所以它将替换新的第一个x(实际上是原来的第二个x字符串)
  • 我会说这是一个聪明的问题解决方案。我没有想到这个解决方案。

标签: javascript for-loop iteration


【解决方案1】:

您正在替换第一个 x,但同时也更新了 format

format = format.replace("x", numbersArr[i]);

让我们一步一步来

  • i = 0前格式为"(xxx) xxx-xxxx",替换后格式为'(1xx) xxx-xxxx'

  • i = 1 前格式为"(1xx) xxx-xxxx",替换后格式为'(12x) xxx-xxxx'

  • i = 2 前格式为"(12x) xxx-xxxx",替换后格式为'(123) xxx-xxxx'

...

  • i = 8 前格式为"(123) 456-789x" 替换后格式为'(123) 456-7890'

function createPhoneNumber(numbersArr) {
  var format = "(xxx) xxx-xxxx";
  for (var i = 0; i < numbersArr.length; i++) {
    format = format.replace("x", numbersArr[i]);
    console.log("AFter - " + format);
  }
  return format;
}

createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);

【讨论】:

  • 非常感谢,您的回答启发了我。对格式字符串的操作是在循环函数内部完成的,因此每次迭代程序都会“记住”更新的字符串并对该更新的字符串进行操作。换句话说,每次迭代都会(临时)创建一个新的格式字符串,它会随着后续迭代再次更新。在最后一次迭代之后,更新过程就完成了。
  • 我还有一个问题。我把return语句放在循环里面,第一次循环后就结束了,为什么?函数 createPhoneNumber(numbersArr) { var format = "(xxx) xxx-xxxx"; for (var i = 0; i
  • 一旦 Js 解释器遇到 return 语句,则执行结束并返回值,如果您已指定要返回的值,如 return format 否则它将返回 undefined。跨度>
  • 更多内容可以阅读官方docs from mdn
【解决方案2】:

之所以有效,是因为 replace 方法一次只替换一个“x”字符。

所以在每次迭代中,找到的第一个“x”字符与数字数组位置相对应。

【讨论】:

  • 谢谢。但我还是不明白。我的想法是:每次循环数组完成时,程序应该“跳转”到格式化并开始从头开始更改它(从第一个“x”开始)。每次循环后,它如何“记住”它已经替换了之前的“x”es?
  • 它会“记住”,因为您正在覆盖循环内的“格式”变量:format = format.replace('x', numbersArr[i])
  • 谢谢!我想我现在明白了。对格式字符串的操作全部发生在循环内部,因此它在每次迭代期间“知道”并“记住”更新的格式字符串。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2021-10-11
  • 2015-12-26
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
相关资源
最近更新 更多