我遇到过某人的旧代码,其中的变量标识如下:@user_id@、@reference_id@ 等等。Wikipedia 说“在某些 JavaScript 实现中,at 符号 (@) 可以在标识符中使用......”在哪些 JS 实现中可以使用?我无法让它工作。
4 回答
这是完全有效的:
var π = Math.PI;
这似乎无效:
var @yourName = "Jamund";
这虽然有效:
var $yourName = "Jamund";
如果您感到无聊并想了解所有血腥细节: http: //mathiasbynens.be/notes/javascript-identifiers
至于您的具体问题,是的,它可能在评论中(JavaDoc在其评论中使用 @ 并且有时它的样式已在 JS 评论中使用)或者它旨在在服务器端进行处理和替换。
ECMA-262第 7.6 章第5.1 版定义了标识符是什么。由于@
不允许,即使某些浏览器可以接受,您也不应该使用它。如果可能,您应该始终争取在所有浏览器之间实现最广泛的兼容性。不使用@
in 标识符不应以任何方式妨碍您。
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeLetter
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
<ZWNJ>
<ZWJ>
单个@
通常是 JSDoc 参数(如果它在注释块中)。@
用听起来像是一个自定义模板功能来包装这个术语。但是前面的名称@@
通常是本地符号。我不相信您实际上可以在代码中使用它们,但它们通常在文档中以这种方式被引用。
例如Symbol.iterator
被称为@@iterator
,如:
Array.prototype[@@iterator]()
TypedArray.prototype[@@iterator]()
String.prototype[@@iterator]()
Map.prototype[@@iterator]()
Set.prototype[@@iterator]()
虽然在代码中你会这样使用它:
var myArray = [1, 2, 3, 4];
var it = myArray[Symbol.iterator]();
console.log(it.next().value); // 1
console.log(it.next().value); // 2
您可能还会看到对以下内容的引用:
@@match
-RegExp.prototype[@@match]()
@@replace
-RegExp.prototype[@@replace]()
@@split
-RegExp.prototype[@@split]()
@@search
-RegExp.prototype[@@search]()
@@species
-Map[@@species]
,Set[@@species]
@@toPrimitive
-Date.prototype[@@toPrimitive](hint)
,Symbol.prototype[@@toPrimitive]()
@@unscopables
-Array.prototype[@@unscopables]
π 是在希腊语单词中使用的标准希腊字符,因此可用于变量名。规则是您可以使用 $ _ 或除 JavaScript 关键字之外的任何单词字符。但是,如果您使用访问器,您可以使用包括空字符串在内的禁止关键字:var forbidden ={}; forbidden[""]="hello";
您甚至可以在全局对象上执行此操作:window['@weird name for a variable'] = "There are very few good reasons to do this!!"
但仅仅因为您可以并不一定意味着您应该这样做!以这种方式命名的变量与任何其他 var 相同,唯一的限制是您必须使用带字符串的方括号来访问这些值。