Обратная обратная коса JavaScript (\) в переменных вызывает ошибку

В Javascript, когда я помещаю обратную косую черту в некоторые переменные, например:

var ttt = "aa ///\\\";
var ttt = "aa ///\"; 

Javscript показывает ошибку.

Если я попытаюсь ограничить пользователя при вводе этого символа, я также получаю сообщение об ошибке:

(("aaa ///\\\").indexOf('"') != -1)

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

Почему я получаю ошибку с обратным слэшем?

Ответ 1

Обратная косая черта (\) является escape-символом в Javascript (наряду с множеством других C-подобных языков). Это означает, что когда Javascript встречает обратную косую черту, он пытается избежать следующего символа. Например, \n - символ новой строки (а не обратная косая черта, сопровождаемая буквой n).

Чтобы вывести буквенную обратную косую черту, вам нужно ее избежать. Это означает, что \\ выдаст один обратный слэш (и \\\\ выведет два и т.д.). Причина "aa ///\" не работает, потому что обратная косая черта сбрасывает " (который будет печатать литеральную цитату), и поэтому ваша строка не будет надлежащим образом завершена. Аналогично, "aa ///\\\" не будет работать, потому что последняя обратная косая черта снова ускользает от цитаты.

Просто помните, что для каждой обратной косой черты, которую вы хотите вывести, вам нужно дать Javascript два.

Ответ 2

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

function stringEscape(s) {
    return s ? s.replace(/\\/g,'\\\\').replace(/\n/g,'\\n').replace(/\t/g,'\\t').replace(/\v/g,'\\v').replace(/'/g,"\\'").replace(/"/g,'\\"').replace(/[\x00-\x1F\x80-\x9F]/g,hex) : s;
    function hex(c) { var v = '0'+c.charCodeAt(0).toString(16); return '\\x'+v.substr(v.length-2); }
}

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

Ответ 3

Вам нужно избежать каждого \, чтобы быть \\:

var ttt = "aa ///\\\\\\";

Обновлено: Я думаю, что этот вопрос касается не только символа escape в строке. Ответчик, кажется, не объясняет проблему правильно.

потому что вам нужно было показать пользователю сообщение, что пользователь не может указать имя, имеющее символ (\).

Я думаю, что сценарий похож:

var user_input_name = document.getElementById('the_name').value;

Затем спрашивающий хочет проверить, содержит ли user_input_name любое [\]. Если да, тогда предупреждайте пользователя.

Если пользователь вводит [ aa ///\] в поле ввода HTML, то если вы alert(user_input_name), вы увидите [aaa ///\]. Вам не нужно бежать, т.е. Заменить [\] на [\\] в JavaScript-коде. Когда вы выполняете экранирование, это происходит потому, что вы пытаетесь создать строку, содержащую специальные символы в исходном коде JavaScript. Если вы этого не сделаете, он не будет корректным. Поскольку вы уже получаете строку, вам не нужно передавать ее в функцию экранирования. Если вы это сделаете, я предполагаю, что вы генерируете другой код JavaScript из кода JavaScript, но здесь это не так.

Я предполагаю, что искатель хочет имитировать вход, поэтому мы можем понять проблему. К сожалению, искатель не очень хорошо разбирается в JavaScript. Поэтому нам предоставляется код ошибки синтаксиса:

var ttt = "aa ///\";

Следовательно, мы предполагаем, что у айзера возникла проблема с экранированием.

Если вы хотите симулировать, код должен быть действительным на первом месте.

var ttt = "aa ///\\"; // <- This is correct
// var ttt = "aa ///\"; // <- This is not.

alert(ttt); // You will see [aa ///\] in dialog, which is what you expect, right?

Теперь вам нужно только

var user_input_name = document.getElementById('the_name').value;
if (user_input_name.indexOf("\\") >= 0) { // There is a [\] in the string
  alert("\\ is not allowed to be used!"); // User reads [\ is not allowed to be used]
  do_something_else();
  }

Изменить. Я использовал [] для цитирования текста, который будет показан, поэтому он будет менее запутан, чем с помощью "".

Ответ 4

Обратная косая черта \ зарезервирована для использования в качестве escape-символа в Javascript.

Чтобы использовать обратную косую черту буквально, вам нужно использовать две обратные косые черты

\\

Ответ 6

Если вы хотите использовать специальный символ в значении переменной javascript, требуется Escape Character (\).

Обратный слэш в вашем примере также является специальным символом.

Итак, вы должны сделать что-то вроде этого,

var ttt = "aa ///\\\\\\"; // --> ///\\\

или

var ttt = "aa ///\\"; // --> ///\

Но символ Escape не требуется для ввода пользователем.

Когда вы нажимаете / в поле подсказки или в поле ввода, затем отправляйте, это означает, что один /.