Какие символы допустимы для имен переменных в JavaScript?
Какие символы можно использовать для именования переменной в JavaScript?
Я хочу создать небольшую "библиотеку расширений" для пользователей, которые не знакомы с JavaScript в моей компании (похоже, они все немного опасаются этого языка). Мне нравится, что jQuery и Prototype используют символ $
, и, поскольку я использую jQuery, я ищу другой красивый одиночный символ для использования.
Я понимаю, что мог бы просто протестировать различные символы, но надеюсь сначала сузить список символов (учитывая возможную интеграцию с другой популярной библиотекой в будущем).
5 ответ(ов)
На самом деле, в ECMAScript на странице 15 указано, что идентификатор может начинаться с символа $
, нижнего подчеркивания или знака UnicodeLetter. Далее, в том же месте уточняется, что UnicodeLetter может быть любым символом из категорий Unicode: Lo, Ll, Lu, Lt, Lm и Nl. Если вы посмотрите эти категории, то увидите, что это открывает гораздо больше возможностей, чем просто латинские буквы. Просто введите в Google "категории Unicode", и вы сможете найти эту информацию.
В целом, в виде регулярного выражения: [a-zA-Z_$][0-9a-zA-Z_$]*
. Другими словами, первый символ может быть буквой, символом _ или $, а остальные символы могут быть буквами, символами _ или $ или цифрами.
Примечание: Хотя другие ответы указывали на то, что в идентификаторах JavaScript можно использовать символы Unicode, фактический вопрос был "Какие символы следует использовать для именования расширительных библиотек, таких как jQuery?" Это ответ на этот вопрос. Вы можете использовать символы Unicode в идентификаторах, но не стоит этого делать. Кодировки часто могут давать сбои. Держите ваши публичные идентификаторы в диапазоне 32-126 ASCII, где это безопасно.
В случае, если использование регулярных выражений не является обязательным, лучше всего позволить браузеру самостоятельно решить, является ли название переменной допустимым, используя eval
или Function
. Вот пример функции, которая проверяет валидность названия переменной:
function isValidVarName(name) {
try {
// Раньше здесь использовался eval
// eval('(function() { var ' + name + '; })()');
Function('var ' + name);
} catch(e) {
return false;
}
return true;
}
isValidVarName('my_var'); // true
isValidVarName('1'); // false
Эта функция создает новую функцию, которая включает переменную с указанным именем. Если имя переменной недопустимо, будет выброшено исключение, и функция вернет false
. В противном случае, если имя допустимо, функция вернет true
.
Вот один быстрый совет по созданию имен переменных.
Если вы хотите избежать конфликтов при использовании в Firefox, не используйте имя переменной "_content", так как это имя уже используется браузером. Я узнал об этом на собственном опыте и мне пришлось изменить все места, где я использовал переменную "_content" в большом приложении на JavaScript.
В ответ на ваш вопрос, я улучшил идею Анаса Накавы. Во-первых, нет необходимости на самом деле выполнять объявляемую функцию. Нам важно, чтобы код правильно парсился, а не чтобы он работал. Во-вторых, использование литерального объекта является лучшим контекстом для нашей цели, так как из него труднее "выбраться".
Вот улучшенная версия функции, которая проверяет, является ли переданное имя переменной допустимым:
function isValidVarName(name) {
try {
return name.indexOf('}') === -1 && eval('(function() { a = {' + name + ':1}; a.' + name + '; var ' + name + '; }); true');
} catch (e) {
return false;
}
}
// так мы можем видеть тестовый код
var _eval = eval;
window.eval = function(s) {
console.log(s);
return _eval(s);
}
console.log(isValidVarName('name'));
console.log(isValidVarName('$name'));
console.log(isValidVarName('not a name'));
console.log(isValidVarName('a:2,b'));
console.log(isValidVarName('"a string"'));
console.log(isValidVarName('xss = alert("I\'m in your vars executing mah scrip\'s");;;;;'));
console.log(isValidVarName('_;;;'));
console.log(isValidVarName('_=location="#!?"'));
console.log(isValidVarName('ᾩ'));
console.log(isValidVarName('ĦĔĽĻŎ'));
console.log(isValidVarName('〱〱〱〱'));
console.log(isValidVarName('जावास्क्रिप्ट'));
console.log(isValidVarName('KingGeorgeⅦ'));
console.log(isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid'));
console.log(isValidVarName('if'));
Вывод функции isValidVarName
будет показывать, является ли каждое переданное имя допустимым согласно правилам JavaScript для имен переменных.
Повторить строку в JavaScript заданное количество раз
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"