Replace (), заменив значение, не указанное - PullRequest
0 голосов
/ 14 декабря 2018

Я изучаю Javascript через FCC уже 6 недель, и решил потратить неделю на изучение и изучение методов, чтобы по-настоящему приблизиться и использовать их в циклах и в выражениях.Просто играя со струнами, я пытался заменить строку «Я люблю молоко» на «Я люблю шелк».Мой код выполняет это, и я это понимаю, но я решил добавить оператор ||, и результат меня изумляет.Если я говорю 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)

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Таким образом, вы в основном сталкиваетесь с проблемой потока кода.

Давайте начнем с первого вопроса: почему 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?

Как написано в другом комментарии, «Я» всегда будет правдой.Истина в основном означает, что значение не является нулевым, неопределенным, 0 и т. Д. «I» имеет значение, которое означает, что оно всегда будет истинным.

Значит, K заменяется?Хорошо, если мы запустим этот код, последняя буква, которая будет проверена и заменена, будет k..replace заменяет только (по умолчанию) первый экземпляр той буквы, с которой он сталкивается.В вашем случае этот K - это первый K, который виден.

Так что, чтобы исправить это, не проверяйте проверку "I": x [i] === "I"

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш вопрос о том, почему последнее письмо имеет значение

Итак, последняя буква имеет значение здесь, потому что у вас есть то, что в основном равно:

if("I"){} 

Так что вышеупомянутый фрагмент, вопреки тому, что вы можете подумать, на самом деле означает, что это имеет значение, которое потомуявляется действительным символом, всегда будет сообщать об истине.Так что для вашего цикла, все на самом деле проверяется, независимо от характера, потому что я всегда буду правдой.

Вот простой способ проверить это:

Допустим, у меня есть массив целых чисел от 1 до 10. У меня есть (псевдокод):

если значение массива<10 ИЛИ Я печатаю это значение </p>

С учетом того, что вы думаете в данный момент, вы ожидаете, что оно прекратит печать, если значения меньше 10, верно?Нету!Еще раз, потому что я всегда правдив, и мы говорим ИЛИ значение I (true), поэтому мы всегда будем получать отпечаток!

Пример кода:

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, они все еще распечатываются.Зачем?Потому что «я» всегда верно!Теперь давайте немного отредактируем это, чтобы сделать его более строгим при проверке:

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]);
       }
    }

Видите?Гораздо лучше :)

0 голосов
/ 14 декабря 2018

хорошо, есть пара ошибок, которые делают ваш код интересным

  1. x[i] === 'm' || 'I' всегда верно, потому что 'I' верно, если это не ясно, вы можете проверитьэто с if ('I') { console.log('Merry Christmas') }

  2. ваш цикл создает новую строку с одной заменой на каждый цикл, т.е. он дает тот же результат, что и без цикла, и

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

  3. замена заменит первый соответствующий символ - последний символ в вашей строке будет k, поэтому замена заменит первое совпадение k на s

Итак, результат вашего кода:

'Hello I lise milk'

Надеюсь, что это поможет разобраться!

Кстати, самый простой способ заменить все m s иI с s:

console.log(x.replace(/[mI]/g, 's'))
...