Я хочу сказать сначала. Очень новичок. Будь добрым. Тем не мение. Я пытаюсь изменить строку. Поместите строку в функцию в качестве аргумента и отмените ее порядок. Например, "привет" должен вернуть "olleh" и т.д.
Я выполнил это, выполнив следующие действия:
function revString(stringArg) {
return stringArg.split("").reverse().join(");
}
Тем не мение. Сделав это так:
function revString (stringArg) {
stringArg.split("");
stringArg.reverse();
stringArg.join("");
return stringArg;
}
Результирующий вывод для второй функции заключается в том, что reverse() не является функцией. Может ли кто-нибудь сказать мне, в чем разница?
Это происходит из-за того, что 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;
}
Однако это, хотя проще понять, возможно, излишне многословно. Я рекомендую придерживаться оригинальной функции.
Функция 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'));
Это связано с тем, что .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;
}
Первый пример .split()
результаты предыдущего вызова метода, где .split()
возвращает массив в качестве первой ссылки в цепочке.
Второй пример выполняет отдельную задачу в исходной строке в каждой строке, а не в цепочке к первой строке, которая возвращает массив.
.reverse()
не является методом, определенным в String.prototype
, что приводит к ошибке в stringArg.reverse()
во второй строке вызова функции.
String.split() возвращает новое значение. Который является массивом всех символов в str Array.reverse возвращает массив с его содержимым обратный. Join возвращает строку. Эти функции не изменяют свои значения, хотя наоборот, я не уверен, Ниже переменной stringArgs установлено значение возврата каждой функции. Попробуйте:
function revString ( stringArg ) {
stringArg=stringArg . split ( "" );
stringArg=stringArg . reverse ();
stringArg=stringArg . join ( "" ); return stringArg ; }
stringArg.split("");
- возвращает массив. Массивы имеют метод reverse()
. Вот почему в первом случае все в порядке.
Во втором случае вы пытаетесь вызвать метод reverse()
строки stringArg
. И прототип строки не имеет метода reverse()
:
console.log(String.prototype.reverse); // undefined
console.log(Array.prototype.reverse); // function reverse() { [native code] }
Вот почему вы видите на консоли
reverse() не является функцией
Однако вы можете определить свой собственный reverse
в прототипе String. Проверьте этот вопрос и ответ.
.split()
возвращает массив. Во втором фрагменте вы игнорируете возвращаемые значения функций.