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)
好吧,有几个问题会让您的代码变得有趣
x[i] === 'm' || 'I'
始终为真,因为 'I'
为真 - 如果不清楚,您可以使用 if ('I') { console.log('Merry Christmas') }
[= 进行测试42=]
你的循环产生一个新的字符串,每个循环都有一个替换,即它产生与没有循环和
相同的结果
y = x.replace(x[x.length - 1], 's')
替换将替换第一个匹配字符 - 字符串中的最后一个字符是 k
,因此替换会将第一个匹配 k
更改为 s
所以,你的代码的结果是
'Hello I lise milk'
希望这有助于解决问题![=22=]
顺便说一句,用 s
:
替换所有 m
和 I
的最简单方法
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)
}
}
所以如果你运行上面的,你会看到输出两行。
- 你好像牛奶
- 你好我喜欢牛奶
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]);
}
}
看到了吗?好多了:)
我已经通过 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)
好吧,有几个问题会让您的代码变得有趣
[= 进行测试42=]x[i] === 'm' || 'I'
始终为真,因为'I'
为真 - 如果不清楚,您可以使用if ('I') { console.log('Merry Christmas') }
你的循环产生一个新的字符串,每个循环都有一个替换,即它产生与没有循环和
相同的结果y = x.replace(x[x.length - 1], 's')
替换将替换第一个匹配字符 - 字符串中的最后一个字符是
k
,因此替换会将第一个匹配k
更改为s
所以,你的代码的结果是
'Hello I lise milk'
希望这有助于解决问题![=22=]
顺便说一句,用 s
:
m
和 I
的最简单方法
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)
}
}
所以如果你运行上面的,你会看到输出两行。
- 你好像牛奶
- 你好我喜欢牛奶
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]);
}
}
看到了吗?好多了:)