æ¤ç¯ä»ç´¹ Javascript ç lexical grammarãECMAScript çåå§ç¢¼å¾å·¦å°å³è¢«ææä¸¦è¢«è½ææä¸ç³»åçè¼¸å ¥å ç´ ä¹å°±æ¯ tokenãæ§å¶åå ãè¡çµæ¢åå ãè¨»è§£ææ¯ç©ºç½åå ãECMAScript ä¹å®ç¾©äºä¸äºç¹å®çééµåå實é«èªæ³éæç¨ä¾èªåæå ¥åèä¾çµæé³è¿°å¼çè¦åã
æ§å¶åå æ§å¶åå æ¯ç¨ä¾æ§å¶å°ææ¬çè§£éï¼ä½ç¡æ³è¢«é¡¯ç¤ºåºä¾ã
編碼ä½ç½® å稱 縮寫 說æU+200C
é¶å¯¬ä¸é£å <ZWNJ> æ¾ç½®å¨å
©ååå
ä¹éä¾é¿å
卿äºèªè¨ä¸éå
©ååå
è¢«ç¶æé£åï¼ç¶åºç¾ç§ï¼ U+200D
é¶å¯¬é£å <ZWJ> æ¾ç½®å¨å
©åé叏䏿ç¼çé£åçåå
ä¸é卿äºèªè¨ ä¾è®ä»åæçºé£åï¼ç¶åºç¾ç§ï¼ U+FEFF
ä½å
çµé åºè¨è <BOM> åºç¾å¨è
³æ¬çéé ï¼ç¨ä¾æ¨è¨æ¤è
³æ¬æ¯å¦çº Unicode éæææ¬çä½å
çµé åºï¼ç¶åºç¾ç§ï¼ 空ç½åå
空ç½åå æåäºç¨å¼ç¢¼çå¯è®æ§ä¹è½å° tokens åéãéäºåå é常å°ç¨å¼çå·è¡æ¯ä¸å¿ è¦çãå£ç¸®æºç¢¼å·¥å ·é常æç§»é¤ä¸å¿ è¦ç空ç½ä¾æ¸å°è³æå³è¼¸éã
編碼ä½ç½® å稱 縮寫 說æ è·³è«åå U+0009 å®ä½åå <HT> æ©«åå®ä½åå \t U+000B 縱åå®ä½åå <VT> 縱åå®ä½åå \v U+000C æé åå <FF> æ§å¶æé åå ï¼ç¶åºç¾ç§ï¼ \f U+0020 ç©ºæ ¼ <SP> ä¸è¬ç空ç½åå U+00A0 ä¸ä¸æ·ç©ºæ ¼ <NBSP> ä¸è¬ç空ç½åå ï¼ä½ç¦æ¢èªåæè¡æåä½µå¤å空ç½ï¼ç¶åºç¾ç§ï¼ å ¶ä» å ¶ä» Unicode 空ç½åå <USP> ç¶åºç¾ç§ è¡çµæ¢åå é¤äºç©ºç½åå ä¹å¤ï¼è¡çµæ¢åå ä¹ç¨ä¾æåæºç¢¼å¯è®æ§ãç¶èï¼å¨æäºæ æ³ä¸è¡çµæ¢åå æå½±é¿ Javascript ç¨å¼çå·è¡ï¼æä»¥æäºå°æ¹æ¯è¢«ç¦æ¢ä½¿ç¨çãè¡çµæ¢åå åæä¹æå½±é¿èªåæå ¥åèçéä½ã卿£è¦è¡¨éå¼ä¸ï¼è¡çµæ¢åå å±¬æ¼ \s çé¡å¥ã
å¨ ECMAScript ä¸ï¼åªæä»¥ä¸ç Unicode 碼ä½è¢«è¦çºè¡çµæ¢åå ï¼å ¶ä»å¦ Next Line, NEL, U+0085 ççè¡çµæ¢åå 被è¦çºç©ºç½åå ã
編碼ä½ç½® å稱 縮寫 說æ è·³è«åå U+000A æè¡åå <LF> å¨ UNIX é¡ç系統ä¸çæè¡åå \n U+000D æ¸ä½åå <CR> å¨ Commodore èæ©æç Mac 系統ä¸çæè¡åå \r U+2028 è¡åéåå <LS> ç¶åºç¾ç§ U+2029 段åéåå <PS> ç¶åºç¾ç§ è¨»è§£å¨ Javascript ç¨å¼ä¸ï¼è¨»è§£é常被ç¨ä¾å¯«æç¤ºã註éãå»ºè°æè¦åãéå¯ä»¥è®ç¨å¼æ´å¥½è®ä¹æ´å¥½çè§£ï¼åæä¹æ¯ä¸åå¾å¥½çé¤é¯å·¥å ·ï¼å¯ä»¥è®ä¸äºç¨å¼ç¢¼ä¸è¢«å·è¡ã
Javascript æå ©ç¨®æ¹å¼å¯«è¨»è§£ã
第ä¸ç¨®æ¯ //
; å®å°å¨å®ä¹å¾çææ¬è®æè¨»è§£ãä¾å¦ï¼
function comment() {
// 鿝ä¸è¡ Javascript 註解
console.log("Hello world!");
}
comment();
第äºç¨®æ´æå½æ§çæ¹å¼æ¯ /* */
ã
ä¾å¦ï¼ä½ å¯ä»¥å°å®ç¨å¨å®è¡ä¸ï¼
function comment() {
/* 鿝ä¸è¡ Javascript 註解 */
console.log("Hello world!");
}
comment();
ä½ ä¹å¯ä»¥å°å®ç¨ä¾å¯«å¤è¡è¨»è§£ï¼
function comment() {
/* éå註解å¯ä»¥è·¨è¶å¤è¡ã注æåªæç¶æåè¦çµæè¨»è§£ææå¯«
å¤è¡è¨»è§£ççµæ¢ç¬¦è */
console.log("Hello world!");
}
comment();
å¦æä½ æ³è¦ä½ ä¹å¯ä»¥æå®æå¨ä¸è¡çä¸å¤®ï¼éç¶å®æè®ä½ çç¨å¼è®å¾é£è®æä»¥è«è¬¹æ 使ç¨ï¼
function comment(x) {
console.log("Hello " + x /* æå
¥ x çå¼ */ + " !");
}
comment("world");
æ¤å¤ï¼ä½ ä¹å¯ä»¥æä¸æ®µç¨å¼ç¨è¨»è§£å èµ·ä¾è®å®ä¸è¢«å·è¡ï¼
function comment() {
/* console.log('Hello world!'); */
}
comment();
å¨éåæ
æ³ï¼ console.log()
æ°¸é ä¸æè¢«å¼å«å çºå®å¨è¨»è§£è£¡é¢ãä»»æè¡æ¸çç¨å¼ç¢¼é½å¯ä»¥ç¨éåæ¹æ³ä¾ä½¿ä¹å¤±å»ä½ç¨ã
æ ¹æ ECMAScript çè¦æ ¼ï¼ä»¥ä¸çééµå被ä¿ç便ªä¾ä½¿ç¨ãä»åç®åæ²æåç¨ä½æªä¾å¯è½æï¼æä»¥ä¸è½å°ä»åç¨ä½èå¥åã
以ä¸ééµåå°æ°¸é 被ä¿çï¼
enum
以ä¸ééµååªæå¨å´æ ¼æ¨¡å¼åºä¸æè¢«ä¿çï¼
implements
interface
let
package
private
protected
public
static
以ä¸ééµååªæå¨åºç¾å¨æ¨¡çµç¨å¼ç¢¼ä¸ææè¢«ä¿çï¼
await
以ä¸ééµåå¨èç ECMAScript è¦æ ¼ä¸ (ECMAScript 1 å° 3) çºæªä¾ä¿çééµï¼
abstract
boolean
byte
char
double
final
float
goto
int
long
native
short
synchronized
throws
transient
volatile
æ¤å¤ï¼å¦ null
, true
è false
ç實é«èªæ³ (literal) å¨ ECMAScript ä¸ä¸è½è¢«ç¨ä½èå¥åã
åªæç¶ç¨å¨èå¥åçæåä¿çééµåææè¢«ä¿ç (ç¸å°æ¼ IdentifierNames
) ãå¦ es5.github.com/#A.1 æè¿°ï¼ä»¥ä¸ä¿çééµåçç¨æ³é½å±¬æ¼IdentifierNames
å æ¤æ¯åæ³çã
a.import
a['import']
a = { import: 'test' }.
åä¹ï¼ä»¥ä¸ç¨æ³ä¸åæ³å çºç¨å¨èå¥åä¸ï¼èå¥åå±¬æ¼ IdentifierName
ä½ä¸å
å«ä¿çåãèå¥åç¨å¨ FunctionDeclaration, FunctionExpression, VariableDeclaration
çç?ãè IdentifierName
被ç¨å¨ MemberExpression, CallExpression
ççã
function import() {} // ä¸åæ³.
實é«èªæ³ Null
æ´å¤èªªæè«åé± null
ã
æ´å¤èªªæè«åé± Boolean
ã
1234567890
42
// 謹æ
使ç¨åå°é¶
0888 // 888 被解ææåé²å¶
0777 // 被解ææå
«é²å¶, åé²å¶å¼çº 511
æ¸å¼ç實é«èªæ³å¯ä»¥å¯ä»¥ä»¥é¶ (0
) çºé¦åè¡ä¸å
¶ä»åé²å¶æ¸åãç¶èä¸ä½é¶å¾é¢ççæ¸åé½å°æ¼ 8 æï¼éåæ¸å¼æè¢«è§£è®æå
«é²å¶æ¸åï¼éåè¡çºä¸æä¸åºä¾å¤ï¼è«åé± Firefox bug 957513ãä¹è«åé± parseInt()
ã
äºé²å¶æ¸åçèªæ³çºä¸åèµ·é¦é¶å ä¸å°å¯«æå¤§å°çæä¸åå
ãBãï¼0b
æ 0B
ï¼ãå çºéåèªæ³æ¯å¨ ECMAScript 2015 ææ°å¢çï¼è«åé±åºä¸çç覽å¨ç¸å®¹è¡¨ã妿 0b
ä¹å¾çæ¸å䏿¯ 0 æ 1ï¼ã0b ä¹å¾æ¾ä¸å°äºé²å¶æ¸åãç SyntaxError
æè¢«ä¸åºã
0b10000000000000000000000000000000 // 2147483648
0b01111111100000000000000000000000 // 2139095040
0B00000000011111111111111111111111 // 8388607
å
«é²å¶
å
«é²å¶æ¸åçèªæ³çºä¸åèµ·é¦é¶å ä¸å°å¯«æå¤§å°çæä¸åå
ãOãï¼0o
æ 0O
ï¼ãå çºéåèªæ³æ¯å¨ ECMAScript 2015 ææ°å¢çï¼è«åé±åºä¸çç覽å¨ç¸å®¹è¡¨ã妿 0o
ä¹å¾çæ¸å䏿¯ï¼01234567ï¼å
¶ä¸ä¹ä¸ï¼ã0o ä¹å¾æ¾ä¸å°å
«é²å¶æ¸åãç SyntaxError æè¢«ä¸åºã
0O755 // 493
0o644 // 420
åå
é²å¶
åå
é²å¶æ¸åçèªæ³çºä¸åèµ·é¦é¶å ä¸å°å¯«æå¤§å°çæä¸åå
"X" (0x
æ 0X
)ã妿 0x
ä¹å¾çæ¸å䏿¯ (0123456789ABCDEF) å
¶ä¸ä¹ä¸ï¼"èå¥åç·æ¥å¨æ¸å¼å¯¦é«èªæ³å¾"ç SyntaxError æè¢«ä¸åºã
0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF // 81985529216486900
0XA // 10
ç©ä»¶
æ´å¤èªªæè«åé± Object
å Object initializerã
var o = { a: "foo", b: "bar", c: 42 };
// ç°¡çè¡¨ç¤ºæ³ (ES2015 æ°å¢)
var a = "foo",
b = "bar",
c = 42;
var o = { a, b, c };
// ES2015 以åå¿
é 鿍£å¯«
var o = { a: a, b: b, c: c };
é£å
æ´å¤èªªæè«åé± Array
ã
ä¸å Unicode è·³è«åºåç± \u
æ¥ä¸ 4 ååå
é²å¶çæ¸å¼æçµæãæ¯ä¸ååå
é²å¶çæ¸å¼è¡¨ç¤ºä¸å UTF-16 編碼ç 2 ä½å
çµåå
ãå°æ¼ç·¨ç¢¼ä½ç½®å¨ 0~FFFF ä¹éçåå
ï¼å
¶ Unicode 表示æ³è編碼ä½ç½®ç¸åãèæ´é«ç編碼ä½ç½®éè¦å
©åè·³è«åºåä¾è¡¨ç¤ºï¼å稱çºä»£çå°(surrogate pair)ï¼ä»£çå°è¡¨ç¤ºçæ¸å¼è編碼ä½ç½®ä¸å (代çå°è¨ç®è¦å wiki)ã
ECMAScript 2015 æ°å¢ãä½¿ç¨ Unicode è·³è«ç·¨ç¢¼ä½ç½®è¡¨ç¤ºæ³ï¼å³å¯ä½¿ç¨è編碼ä½ç½®å®å
¨ç¸åçè¡¨ç¤ºæ³ (æé«å° 0x10FFFF
) èä¸å編碼ä½ç½®é«æ¼ FFFF éç¨ä»£çå°è¡¨ç¤ºçéå¶ã
æ´å¤èªªæè«åé± String.fromCodePoint()
æ String.prototype.codePointAt()
ã
"\u{2F804}"
// ç广¼ä»£çå°è¡¨ç¤ºæ³
"\uD87E\uDC04"
æ£è¦è¡¨éå¼
æ´å¤èªªæè«åé± RegExp
ã
/ab+c/g
// ä¸åç©ºçæ£è¦è¡¨ç¤ºæ³ã
// å
©åæç·ä¹éä¸å¾çºç©ºï¼å¦åå°è¢«è¦çºå®è¡è¨»è§£ã
/(?:)/
ç¯æ¬å串
æ´å¤èªªæè«åé± template strings ã
`string text`
`string text line 1
string text line 2`
`string text ${expression} string text`
tag `string text ${expression} string text`
èªåæå
¥åè
å¦äº JavaScript statements å¿ é 以åèä½çµï¼å æ¤æåå°èªåæå ¥åè (ASI) è¦åå½±é¿ã
let
, const
, è®æ¸å®£åimport
, export
, 模çµå®£ådebugger
continue
, break
, throw
return
ECMAScript è¦æ ¼é¡æ èªåæå ¥åèçä¸åè¦åã
1. 妿 è¡çµæ¢åå æ "}" åºç¾å¨ä¸ç¬¦ææ³çå°æ¹ï¼ä¸ååèæè¢«èªåæå ¥å¨å ¶ä¹åã
{ 1 2 } 3
// æè¢« ASI è½ææ
{ 1 2 ;} 3;
2. ç¶ä¸å token è¼¸å ¥æµå°äºçµå°¾èè§£æå¨ä»ç¶ç¡æ³å°å ¶è§£æçºä¸å宿´çç¨å¼ï¼ä¸ååèæè¢«èªåæå ¥æ¼å ¶å¾ã
å¨é裡 ++
ä¸¦ä¸æè¢«ç¶ä½ä½ç¨æ¼è®æ¸b
ç å¾ç¶´éç®å
ï¼å çºè¡çµæ¢åå
åºç¾å¨b
å ++
ä¹éã
a = b
++c
// æè¢« ASI è½ææ
a = b;
++c;
3. ç¶ä¸åéç®å¼ä¸åºç¾ restricted productions å¾é¢æ¥èä¸åè¡çµæ¢å ï¼ä¸ååèæè¢«èªåæå ¥æ¼è¡çµæ¢å ä¹åã以ä¸éäºé³è¿°å¼æ"ä¸å 許åºç¾è¡çµæ¢å "è¦åï¼
++
and --
)continue
break
return
yield
, yield*
module
return
a + b
// æè¢« ASI è½ææ
return;
a + b;
è¦æ ¼ ç覽å¨ç¸å®¹æ§ åé±
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4