Replace(),替换一个未指定的值

Replace(), replacing a value not specified

我已经通过 FCC 学习 Javascript 6 周了,并决定花一周的时间学习和尝试各种方法,以真正接近和熟悉在循环和语句中使用它们.只是玩弄字符串,我试图用 "I like silk" 替换字符串 "I like milk"。我的代码实现了这一点,我理解它,但我决定添加一个 || 运算符,结果让我感到困惑。如果我说 if(x[i]=== 'm' || x[i] === 'I',它不会替换 'I',而是替换 'm' 如果我保持原样,它会生成字符串 'I lise milk',即使 'k' 从未被提及。这是怎么回事?

let x = 'Hello I like milk';
let y = '';

for(let i = 0; i < x.length; i++) {
    if(x[i] === 'm' || 'I') {
      y =  x.replace(x[i], 's' )
    }
}
console.log(y)

好吧,有几个问题会让您的代码变得有趣

  1. x[i] === 'm' || 'I' 始终为真,因为 'I' 为真 - 如果不清楚,您可以使用 if ('I') { console.log('Merry Christmas') }

    [= 进行测试42=]
  2. 你的循环产生一个新的字符串,每个循环都有一个替换,即它产生与没有循环和

    相同的结果

    y = x.replace(x[x.length - 1], 's')

  3. 替换将替换第一个匹配字符 - 字符串中的最后一个字符是 k,因此替换会将第一个匹配 k 更改为 s

所以,你的代码的结果是

'Hello I lise milk'

希望这有助于解决问题![​​=22=]

顺便说一句,用 s:

替换所有 mI 的最简单方法
console.log(x.replace(/[mI]/g, 's'))

所以您基本上 运行遇到了代码流动方式的问题。

让我们从问题一开始:为什么 m 被覆盖而不是 y?

所以基本上你有在整个循环中更新的 var x 和 y。

你的代码的工作方式基本上是:如果字母等于 m 或者我用 s 替换它。

然而,您将在这里遇到的问题是您从不存储此后更新的值。因此,当它再次循环时,它采用默认值 x(实际上尚未更新)并将其写入 y。这将每次都覆盖该值。

我们可以通过简单地登录循环内部来演示它。

let x = 'Hello I like milk';
let y = '';

for(let i = 0; i < x.length; i++) {
    if(x[i] === 'm' || x[i] === 'I') {
      y =  x.replace(x[i], 's' )
      console.log(y)
    }
}

所以如果你运行上面的,你会看到输出两行。

  1. 你好像牛奶
  2. 你好我喜欢牛奶

m 是唯一被打印的,但是因为日志是在最终更新之后。

那么下一个问题:为什么要替换那个 k?

正如另一位发表评论的那样,"I" 永远是真实的。 Truthy 基本上意味着该值不为空、未定义、0 等。"I" 有一个值,这意味着它永远为真。

所以K被替换了?好吧,如果我们 运行 该代码,则检查和替换的最后一个字母是 k。 .replace 仅替换(默认情况下)它遇到的该字母的第一个实例。在您的情况下,该 K 是看到的第一个 K。

所以要修复它,不要检查 "I" 检查:x[i] === "I"

编辑:回答关于为什么最后一封信很重要的问题

所以最后一个字母在这里很重要,因为你有基本上等同于:

if("I"){} 

所以上面的代码片段,与你可能认为的实际意思相反,如果它有一个值,因为 I 是一个有效的字符,它将始终报告为真。因此,对于您的循环,实际上正在检查所有内容,无论角色如何,因为 I 永远是真实的。

这里有一个简单的检查方法:

假设我有一个从 1 到 10 的整数数组。我有(伪代码):

如果数组值 < 10 或者我 打印该值

按照您目前的想法,如果值小于 10,您会希望它停止打印,对吗?没有!再一次因为 I 总是真实的,我们说的是 OR 值 I(真)所以我们总是会打印出来!

代码示例:

var x = [0, 1, 2, 3, 4 , 50, 60, 70, 80];

    for(var i = 0; i < x.length; i++){
       if(x[i] < 10 || "I") {
           console.log(x[i]);
       }
    }

看到了吗?一切都打印出来了!即使一半的值超过 10,它们仍会打印出来。为什么?因为 "I" 永远是真的!现在让我们稍微修改一下,使其在检查时更加严格:

let x = [0, 1, 2, 3, 4 , 50, 60, 70, 80];

    for(var i = 0; i < x.length; i++){
       if(x[i] < 10 || x[i] === "I") {
           console.log(x[i]);
       }
    }

看到了吗?好多了:)