6

Какие символы допустимы для имен переменных в JavaScript?

1

Какие символы можно использовать для именования переменной в JavaScript?

Я хочу создать небольшую "библиотеку расширений" для пользователей, которые не знакомы с JavaScript в моей компании (похоже, они все немного опасаются этого языка). Мне нравится, что jQuery и Prototype используют символ $, и, поскольку я использую jQuery, я ищу другой красивый одиночный символ для использования.

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

5 ответ(ов)

0

На самом деле, в ECMAScript на странице 15 указано, что идентификатор может начинаться с символа $, нижнего подчеркивания или знака UnicodeLetter. Далее, в том же месте уточняется, что UnicodeLetter может быть любым символом из категорий Unicode: Lo, Ll, Lu, Lt, Lm и Nl. Если вы посмотрите эти категории, то увидите, что это открывает гораздо больше возможностей, чем просто латинские буквы. Просто введите в Google "категории Unicode", и вы сможете найти эту информацию.

0

В целом, в виде регулярного выражения: [a-zA-Z_$][0-9a-zA-Z_$]*. Другими словами, первый символ может быть буквой, символом _ или $, а остальные символы могут быть буквами, символами _ или $ или цифрами.

Примечание: Хотя другие ответы указывали на то, что в идентификаторах JavaScript можно использовать символы Unicode, фактический вопрос был "Какие символы следует использовать для именования расширительных библиотек, таких как jQuery?" Это ответ на этот вопрос. Вы можете использовать символы Unicode в идентификаторах, но не стоит этого делать. Кодировки часто могут давать сбои. Держите ваши публичные идентификаторы в диапазоне 32-126 ASCII, где это безопасно.

0

В случае, если использование регулярных выражений не является обязательным, лучше всего позволить браузеру самостоятельно решить, является ли название переменной допустимым, используя 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.

0

Вот один быстрый совет по созданию имен переменных.

Если вы хотите избежать конфликтов при использовании в Firefox, не используйте имя переменной "_content", так как это имя уже используется браузером. Я узнал об этом на собственном опыте и мне пришлось изменить все места, где я использовал переменную "_content" в большом приложении на JavaScript.

0

В ответ на ваш вопрос, я улучшил идею Анаса Накавы. Во-первых, нет необходимости на самом деле выполнять объявляемую функцию. Нам важно, чтобы код правильно парсился, а не чтобы он работал. Во-вторых, использование литерального объекта является лучшим контекстом для нашей цели, так как из него труднее "выбраться".

Вот улучшенная версия функции, которая проверяет, является ли переданное имя переменной допустимым:

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 для имен переменных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь