Каково значение использования: string.split («»). Reverse (). Join (")?

1

Я хочу сказать сначала. Очень новичок. Будь добрым. Тем не мение. Я пытаюсь изменить строку. Поместите строку в функцию в качестве аргумента и отмените ее порядок. Например, "привет" должен вернуть "olleh" и т.д.

Я выполнил это, выполнив следующие действия:

function revString(stringArg) {
    return stringArg.split("").reverse().join(");
}

Тем не мение. Сделав это так:

function revString (stringArg) {
    stringArg.split("");
    stringArg.reverse();
    stringArg.join("");
    return stringArg;
}

Результирующий вывод для второй функции заключается в том, что reverse() не является функцией. Может ли кто-нибудь сказать мне, в чем разница?

  • 0
    .split() возвращает массив. Во втором фрагменте вы игнорируете возвращаемые значения функций.
  • 0
    Можно исправить это следующим образом: someVar = stringArg.reverse ();
Теги:
reverse

6 ответов

1

Это происходит из-за того, что split() не разделяет строку на месте, а вместо этого возвращает строку разделения как новое значение. В вашей второй функции вы выполняете stringArg.split(), но поскольку эта операция не выполняется на месте, stringArg никогда не мутируется. Он сохраняет то же значение и тип, что приводит к ошибке, которую вы видите.

Причина, по которой работает первая функция, заключается в том, что вызовы функций применяются к возвращаемому значению предыдущего вызова. Другими словами:

  • split() вызывается в stringArg
  • reverse() вызывается на возвращаемое значение split(), которое является массивом и поэтому может быть обращено в обратном направлении
  • join() вызывается для возвращаемого значения reverse()

Но во второй функции вы вызываете их все на одной и той же переменной, stringArg, которая остается неизменной во всем. Чтобы ваша функция работала, вам необходимо изменить ее так:

function revString (stringArg) {
    a = stringArg.split(""); // Array
    b = a.reverse(); // Reversed array
    c = b.join(""); // String
    return c;
}

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

0

Функция String#split не работает in situ (не мутирует исходную строку). Вот почему вы не можете использовать функцию Array#reverse которую можно вызывать только на массивах. Вы можете попытаться назначить новый, полученный массив в новую переменную, а затем использовать Array#reverse, которая работает in situ (мутирует исходный массив), а затем возвращает объединенный массив.

function revString(stringArg) {
    let arr = stringArg.split("");
    arr.reverse();
    return arr.join("");
}

console.log(revString('hello'));
0

Это связано с тем, что .reverse() используется на выходе .split("").

Использование .reverse() само по себе не работает, потому что строка перед ним напрямую не меняет его, если вы не переназначаете его с помощью stringArg = stringArg.split(""); , Первая строка вернет массив символов, но не изменит stringArg напрямую.

Так:

stringArg.split("").reverse().join("");

означает join всех элементов в массиве, элементы которого находятся в reverse порядке, основываясь на split строки. Другими словами, .reverse() используется в stringArg.split(""), а не только stringArg и тот же с .join(""): он применяется к stringArg.split("").reverse() не просто stringArg,

Таким образом, решение будет:

function revString2 (stringArg) {
    a = stringArg.split("");
    b = a.reverse();
    c = b.join("");
    return c;
}
0

Первый пример .split() результаты предыдущего вызова метода, где .split() возвращает массив в качестве первой ссылки в цепочке.

Второй пример выполняет отдельную задачу в исходной строке в каждой строке, а не в цепочке к первой строке, которая возвращает массив.

.reverse() не является методом, определенным в String.prototype, что приводит к ошибке в stringArg.reverse() во второй строке вызова функции.

0

String.split() возвращает новое значение. Который является массивом всех символов в str Array.reverse возвращает массив с его содержимым обратный. Join возвращает строку. Эти функции не изменяют свои значения, хотя наоборот, я не уверен, Ниже переменной stringArgs установлено значение возврата каждой функции. Попробуйте:

function revString ( stringArg ) { 
stringArg=stringArg . split ( "" ); 
stringArg=stringArg . reverse (); 

stringArg=stringArg . join ( "" ); return stringArg ; } 
0

stringArg.split(""); - возвращает массив. Массивы имеют метод reverse(). Вот почему в первом случае все в порядке.

Во втором случае вы пытаетесь вызвать метод reverse() строки stringArg. И прототип строки не имеет метода reverse():

console.log(String.prototype.reverse); // undefined
console.log(Array.prototype.reverse); // function reverse() { [native code] }

Вот почему вы видите на консоли

reverse() не является функцией

Однако вы можете определить свой собственный reverse в прототипе String. Проверьте этот вопрос и ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню