Какие символы можно использовать для именования переменной JavaScript?
Я хочу создать небольшую «библиотеку расширений» для моих не-JavaScript пользователей здесь, на работе (которые кажутся брезгливыми, когда дело доходит до языка). Мне нравится, что в jQuery и Prototype оба используют $
знак доллара, и, поскольку я использую jQuery, я ищу другой хороший односимвольный символ для использования.
Я понимаю, что мог бы просто протестировать несколько символов, но я надеюсь сузить список символов для начала (возможно, с учетом будущей интеграции с другой популярной библиотекой).
javascript
character
Ричард Клейтон
источник
источник
Ответы:
Чтобы процитировать действительные имена переменных JavaScript , моя статья обобщает соответствующие разделы спецификации:
Я также создал инструмент , который сообщит вам, является ли введенная вами строка действительным именем переменной JavaScript в соответствии с ECMAScript 5.1 и Unicode 6.1:
PS Чтобы дать вам представление о том, как неправильный ответ Энтони Миллса: если бы вы суммировали все эти правила в одном регулярном выражении только для ASCII для JavaScript, его длина составляла бы 11 236 символов . Вот:
источник
¢
в качестве дополнения$
... да ладно ...)-:
Из спецификации ECMAScript в разделе 7.6 Имена и идентификаторы идентификаторов действительный идентификатор определяется как:
что создает много возможностей для именования переменных, а также для игры в гольф. Давайте попробуем несколько примеров.
Действительный идентификатор может начинаться с либо
UnicodeLetter
,$
,_
, или\ UnicodeEscapeSequence
. Буква Unicode - это любой символ из этих категорий ( см. Все категории ):Одно это объясняет некоторые безумные возможности - рабочие примеры . Если это не работает во всех браузерах, то назовите это ошибкой, потому что это должно.
источник
В основном в форме регулярного выражения:
[a-zA-Z_$][0-9a-zA-Z_$]*
. Другими словами, первый символ может быть буквой или _ или $, а другие символы могут быть буквами или _ или $ или цифрами.Примечание. Хотя в других ответах указывалось, что в идентификаторах JavaScript можно использовать символы Unicode, реальным вопросом было: «Какие символы следует использовать для имени библиотеки расширений, такой как jQuery?» Это ответ на этот вопрос. Вы можете использовать символы Unicode в идентификаторах, но не делайте этого. Кодировки все время испорчены. Держите ваши открытые идентификаторы в диапазоне 32-126 ASCII, где это безопасно.
источник
Console.WriteLine("привет")
C # и заставить его работать !До JavaScript 1.5:
^[a-zA-Z_$][0-9a-zA-Z_$]*$
На английском языке: должно начинаться со знака доллара, подчеркивания или одной из букв алфавита из 26 символов, прописных или строчных. Последующие символы (если они есть) могут быть одним из них или десятичной цифрой.
JavaScript 1.5 и более поздние версии * :
^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$
Это сложнее выразить на английском языке, но концептуально это похоже на более старый синтаксис с добавлением, что буквы и цифры могут быть из любого языка. После первого символа также допускаются дополнительные символы подчеркивания (вместе называемые «соединителями») и дополнительные знаки объединения символов («модификаторы»). (Другие символы валюты не включены в этот расширенный набор.)
JavaScript 1.5 и более поздние версии также допускают escape-последовательности Unicode при условии, что результатом является символ, который будет разрешен в приведенном выше регулярном выражении.
Идентификаторы также не должны быть текущим зарезервированным словом или словом, которое рассматривается для будущего использования.
Нет практического ограничения на длину идентификатора. (Браузеры различаются, но у вас будет 1000 символов и, возможно, на несколько порядков больше.)
Ссылки на категории персонажей:
(объединены в регулярном выражении выше как «L»)
* nb Это регулярное выражение Perl предназначено только для описания синтаксиса - оно не будет работать в JavaScript, который (пока) не включает поддержку свойств Unicode. (Есть некоторые сторонние пакеты, которые утверждают, что добавляют такую поддержку.)
источник
"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
несмотря на то, что «test» является допустимым именем переменной JS\uD87E\uDC00
), которые не соответствуют ни одному из разрешенных Unicode категории. Ваше регулярное выражение, однако, позволило бы такого персонажа. Кроме того, U + 200C и U + 200D отсутствуют.На самом деле ECMAScript говорит на странице 15: что идентификатор может начинаться с символа $, символа подчеркивания или UnicodeLetter, а затем он (чуть ниже) указывает, что UnicodeLetter может быть любым символом из категорий Unicode, Lo, Ll , Lu, Lt, Lm и Nl. И когда вы посмотрите на эти категории, вы увидите, что это открывает гораздо больше возможностей, чем просто латинские буквы. Просто выполните поиск по «категориям Unicode» в Google, и вы сможете найти их.
источник
Переменные Javascript
Вы можете начать переменную с любой буквы
$
или_
символа. Пока это не начинается с числа, вы можете также включать числа.Начните:
[a-z], $, _
содержать:
[a-z], [0-9], $, _
JQuery
Ты можешь использовать
_
свою библиотеку, чтобы она стояла рядом с jQuery. Однако есть конфигурация, которую вы можете установить, чтобы jQuery не использовал$
. Вместо этого он будет использоватьjQuery
. Для этого просто установите:Эта страница объясняется, как это сделать.
источник
Насколько я понимаю, принятый ответ исключил бы множество допустимых идентификаторов . Вот регулярное выражение, которое я собрал, которое должно следовать спецификации (см. Главу 7.6 об идентификаторах). Создал его с помощью RegexBuddy, и вы можете найти экспорт объяснения на http://samples.geekality.net/js-identifiers .
Кроме того, имя не может быть одним из следующих зарезервированных слов.
источник
^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$
. Теперь даже с исправлением я не могу заставить это регулярное выражение работать."test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
несмотря на то, что «test» является допустимым именем переменной JStest
принимается.\uD87E\uDC00
), которые не соответствуют ни одному из допустимых Unicode категории. Ваше регулярное выражение, однако, позволило бы такого персонажа.eval
,arguments
,NaN
,Infinity
иundefined
крайних случаях .Переменные Javascript могут иметь буквы, цифры, знаки доллара ($) и подчеркивания (_). Они не могут начинаться с цифр.
Обычно библиотеки используют
$
и_
как ярлыки для функций, которые вы будете использовать везде. Хотя названия$
или_
не имеют смысла, они полезны из-за их краткости, и поскольку вы будете использовать функцию везде, где вы должны знать, что они значат.Если ваша библиотека не состоит в том, чтобы повсеместно использовать одну и ту же функцию, я бы порекомендовал вам использовать более значимые имена, так как они помогут вам и другим понять, что делает ваш код, не ставя под угрозу точность исходного кода .
Например, вы можете взглянуть на потрясающую библиотеку DateJS и на синтетический сахар, который она позволяет без необходимости использования каких-либо символов или переменных с короткими именами .
Сначала вы должны сделать свой код практичным, и только после того, как попытаетесь сделать его красивым.
источник
если регулярные выражения не обязательны, не лучше ли попросить браузер принять решение об использовании
eval
?источник
xss = alert("I'm in your vars executin mah scrip's");;;;;
Например, недопустимое имя переменной JavaScript.xss;alert("try again");
name
на(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )
? Если это строка, она заменит круглые скобки (определенно не допускается в переменных), поэтому я думаю, что выполнить что-либо будет почти невозможно.isValidVarName('aler(t')
становится правдой. ИisValidVarName('_;;;')
остается верным. Но вы можете проверить в начале, соответствует ли оно чему-то вроде,/[;,\(\)]/
но затем вы все равно можете выполнить_=location="#!?"
его, добавив=
в список, но вы все равно можете выполнить'_\ndelete foo'
(который проходит тест как допустимое имя переменной), поэтому вы должны исключить\n
s и\r
s и, возможно, какой-нибудь юникод newline? Но `$` не является допустимым идентификатором, поэтому вы должны исключить все пробелы ... Это проигрышная битва. Я думаю, что это насколько я могу пойти против себяif(/[;,\(\)=\s]/.exec(name))return!1
Вот одно быстрое предложение для создания имен переменных. Если вы хотите, чтобы переменная не конфликтовала при использовании в FireFox, не используйте имя переменной « _content », так как это имя переменной уже используется браузером. Я нашел это нелегко, и мне пришлось поменять все места, где я использовал переменную "_content" в большом приложении JavaScript.
источник
Я взял идею Анаса Накавы и улучшил ее. Прежде всего, нет никаких причин фактически запускать объявленную функцию. Мы хотим знать, правильно ли он анализирует, а не работает ли код. Во-вторых, буквальный объект - лучший контекст для нашей цели, чем
var XXX
его труднее вырвать.источник
isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
}
должна исключить это.isValidVarName("delete") === true
Написал рабочую область сбоя, которая перебирает все кодовые точки и испускает символ, если
eval('var ' + String.fromCodePoint(#) + ' = 1')
работает.Он просто продолжает идти и идти, и идти ....
источник