è¿é¨åæè¿°äº JavaScript çè¯æ³ï¼lexical grammarï¼ãECMAScript æºç ææ¬ä¼è¢«ä»å·¦å°å³æ«æï¼å¹¶è¢«è½¬æ¢ä¸ºä¸ç³»åçè¾å ¥å ç´ ï¼å æ¬ tokenãæ§å¶ç¬¦ãè¡ç»æ¢ç¬¦ã注éå空ç½ç¬¦ãECMAScript å®ä¹äºä¸äºå ³é®åãåé¢é以åè¡å°¾åå·è¡¥å ¨çè§åã
æ ¼å¼æ§å¶ç¬¦æ ¼å¼æ§å¶ç¬¦ç¨äºæ§å¶å¯¹æºç ææ¬çè§£éï¼ä½æ¯å¹¶ä¸ä¼æ¾ç¤ºåºæ¥ã
代ç ç¹ åç§° 缩å 说æU+200C
é¶å®½åº¦éç»åå <ZWNJ> æ¾ç½®å¨ä¸äºç»å¸¸ä¼è¢«å½æè¿åçå符ä¹é´ï¼ç¨äºå°å®ä»¬åå«ä»¥ç¬ç«å½¢å¼æ¾ç¤ºï¼Wikipediaï¼ U+200D
é¶å®½åº¦ç»åå <ZWJ> æ¾ç½®å¨ä¸äºé常ä¸ä¼è¢«æ 记为è¿åçå符ä¹é´ï¼ç¨äºå°è¿äºå符以è¿å形弿¾ç¤ºï¼Wikipediaï¼ U+FEFF
åèæµæ¹åæ è¯ <BOM> å¨èæ¬å¼å¤´ä½¿ç¨ï¼é¤äºå°èæ¬æ 记为 Unicode æ ¼å¼ä»¥å¤ï¼è¿ç¨æ¥æ è®°ææ¬çåèæµæ¹åï¼Wikipediaï¼ ç©ºç½ç¬¦
空ç½ç¬¦æåäºæºç çå¯è¯»æ§ï¼å¹¶å°æ è®° (tokens) åºåå¼ãè¿äºç¬¦å·é常ä¸å½±åæºç çåè½ãé常å¯ä»¥ç¨åç¼©å¨æ¥ç§»é¤æºç ä¸ç空ç½ï¼åå°æ°æ®ä¼ è¾éã
代ç ç¹ åç§° 缩å 说æ 转ä¹åºå U+0009 å¶è¡¨ç¬¦ <HT> æ°´å¹³å¶è¡¨ç¬¦ \t U+000B åç´å¶è¡¨ç¬¦ <VT> åç´å¶è¡¨ç¬¦ \v U+000C å页符 <FF> å页符ï¼Wikipediaï¼ \f U+0020 ç©ºæ ¼ <SP> ç©ºæ ¼ U+00A0 æ é´æç©ºæ ¼ <NBSP> å¨è¯¥ç©ºæ ¼å¤ä¸ä¼æ¢è¡ Others å ¶ä» Unicode ç©ºç½ <USP> Wikipedia ä¸å¯¹ Unicode 空ç½çä»ç» è¡ç»æ¢ç¬¦é¤äºç©ºç½ç¬¦ä¹å¤ï¼è¡ç»æ¢ç¬¦ä¹å¯ä»¥æé«æºç çå¯è¯»æ§ãä¸åçæ¯ï¼è¡ç»æ¢ç¬¦å¯ä»¥å½±å JavaScript 代ç çæ§è¡ãè¡ç»æ¢ç¬¦ä¹ä¼å½±åèªå¨åå·è¡¥å ¨çæ§è¡ã卿£å表达å¼ä¸ï¼è¡ç»æ¢ç¬¦ä¼è¢« \s å¹é ã
å¨ ECMAScript ä¸ï¼åªæä¸å Unicode å符ä¼è¢«å½æè¡ç»æ¢ç¬¦ï¼å ¶ä»çè¡ç»æ¢ç¬¦ï¼æ¯å¦ Next LineãNELãU+0085 çï¼é½ä¼è¢«å½æç©ºç½ç¬¦ã
ç¼ç åç§° 缩å 说æ 转ä¹åºå U+000A æ¢è¡ç¬¦ <LF> å¨ UNIX ç³»ç»ä¸èµ·æ°è¡ \n U+000D å车符 <CR> å¨ Commodore åæ©æç Mac ç³»ç»ä¸èµ·æ°è¡ \r U+2028 è¡åé符 <LS> Wikipedia U+2029 段åé符 <PS> Wikipedia æ³¨éæ³¨éç¨æ¥å¨æºç ä¸å¢å æç¤ºãç¬è®°ã建议ãè¦åçä¿¡æ¯ï¼å¯ä»¥å¸®å©é 读åçè§£æºç ãå¨è°è¯æ¶ï¼å¯ä»¥ç¨æ¥å°ä¸æ®µä»£ç å±è½æï¼é²æ¢å ¶è¿è¡ï¼è¿ä¹æ¯ä¸ä¸ªæä»·å¼çè°è¯å·¥å ·ã
å¨ JavaScript ä¸ï¼æä¸¤ç§å¸¸è§çæ·»å æ³¨éçæ¹æ³ï¼è¡æ³¨éååæ³¨éãå¦å¤ï¼ä¹æä¸ç§ç¹æ®ç hashbang 注éè¯æ³ã
è¡æ³¨é第ä¸ç§æ¯ //
飿 ¼ç注éï¼ä¼å°è¯¥è¡ä¸ç¬¦å·ä»¥åçææ¬é½è§ä¸ºæ³¨éï¼
function comment() {
// è¿æ¯åè¡æ³¨é
console.log("Hello world!");
}
comment();
åæ³¨é
第äºç§æ¯ /* */
飿 ¼ç注éï¼è¿ç§æ¹å¼æ´å çµæ´»ï¼
æ¯å¦ï¼å¯ä»¥å¨åè¡å 使ç¨å¤è¡æ³¨éï¼
function comment() {
/* è¿æ¯åè¡æ³¨é */
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()
çè°ç¨å§ç»æ æãè¿ç§æ¹å¼å¯ä»¥å±è½ä»»æå¤è¡ç代ç ï¼ä¹å¯ä»¥å±è½ä¸è¡ä»£ç çä¸é¨åã
å å«è³å°ä¸ä¸ªè¡ç»æç¬¦çåç¶æ³¨éçè¡ä¸ºä¸èªå¨åå·æå ¥ä¸çè¡ç»æç¬¦ç¸ä¼¼ã
Hashbang 注éHashbang æ³¨éæ¯ä¸ç§ç¹æ®ç注éè¯æ³ï¼å
¶è¡ä¸ºä¸åè¡æ³¨éï¼//
ï¼å®å
¨ä¸æ ·ï¼åªæ¯å®ä»¥ #!
å¼å¤´ï¼å¹¶ä¸åªå¨èæ¬ææ¨¡åçæå¼å§å¤ææã注æï¼#!
æ å¿ä¹åä¸è½æä»»ä½ç©ºç½åç¬¦ãæ³¨éç± #!
ä¹åçææåç¬¦ç»æç´å°ç¬¬ä¸è¡çæ«å°¾ï¼åªå
许æä¸æ¡è¿æ ·ç注éãJavaScript ä¸ç hashbang 注éç±»ä¼¼äº Unix ä¸ç shebangï¼å®æä¾äºä¸ä¸ªç¹å®ç JavaScript è§£éå¨çè·¯å¾ï¼ä½ æ³ç¨å®æ¥æ§è¡è¿ä¸ªèæ¬ãå¨ hashbang æ³¨éæ ååä¹åï¼å®å·²ç»å¨éæµè§å¨ä¸»æºï¼å¦ Node.jsï¼ä¸å¾å°äºäºå®ä¸çå®ç°ï¼å¨é£éï¼å®å¨è¢«ä¼ éç»å¼æä¹åè¢«ä»æºææ¬ä¸å¥ç¦»ã示ä¾å¦ä¸ï¼
#!/usr/bin/env node
console.log("Hello world");
JavaScript çè§£éå¨ä¼æå®è§ä¸ºæ®é注éââåªæå½èæ¬ç´æ¥å¨ shell ä¸è¿è¡æ¶ï¼å®å¯¹ shell ææè¯ä¹æä¹ã
è¦åï¼ å¦æä½ æ³è®©èæ¬ç´æ¥å¨ shell ç¯å¢ä¸è¿è¡ï¼è¯·ç¨ä¸å« BOM ç UTF-8 ç¼ç ãè½ç¶ BOM ä¸ä¼å¯¹å¨æµè§å¨ä¸è¿è¡ç代ç é æä»»ä½é®é¢ââå¨ UTF-8 è§£ç è¿ç¨ä¸ï¼åææºææ¬ä¹åï¼BOM 就已ç»è¢«å¥ç¦»äºââä½å¦æå颿ä¸ä¸ª BOM å符ï¼Unix/Linux shell å°±ä¸ä¼è¯å«è¯¥æ³¨éã
ä½ åªè½ä½¿ç¨ #!
æ³¨éæ ·å¼ä»¥æå® JavaScript è§£éå¨ã卿æå
¶ä»æ
åµä¸ï¼åªéä½¿ç¨ //
注éï¼æå¤è¡æ³¨éï¼ã
æ è¯ç¬¦ç¨äºå°å¼ä¸ååè¿è¡è¿æ¥ãæ è¯ç¬¦å¯ä»¥ç¨äºåç§åºåï¼
const decl = 1; // åé声æï¼ä¹å¯è½æ¯ `let` æ `var`ï¼
function fn() {} // 彿°å£°æ
const obj = { key: "value" }; // 对象é®
// 类声æ
class C {
#priv = "value"; // ç§æå±æ§
}
lbl: console.log(1); // æ ç¾
å¨ JavaScript ä¸ï¼æ è¯ç¬¦é常ç±åæ¯æ°åå符ãä¸å线ï¼_
ï¼åç¾å
符å·ï¼$
ï¼ç»æãæ è¯ç¬¦ä¸å
许以æ°åå¼å¤´ãç¶èï¼JavaScript æ è¯ç¬¦ä¸åªéäº ASCIIââè®¸å¤ Unicode 代ç ç¹ä¹æ¯è¢«å
许çãä¹å°±æ¯è¯´ï¼
_
å $
ä¸çä»»æå符ã夿³¨ï¼ 妿ï¼åºäºæäºåå ï¼ä½ éè¦èªå·±è§£æä¸äº JavaScript æºï¼ä¸è¦å设ææçæ è¯ç¬¦éµå¾ª /[A-Za-z_$][\w$]*/
模å¼ï¼ä¾å¦ï¼ä»
ASCIIï¼ï¼æ è¯ç¬¦çèå´å¯ä»¥ç±æ£åè¡¨è¾¾å¼ /[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*/u
ï¼ä¸å
å« unicode 转ä¹åºåï¼æè¿°ã
æ¤å¤ï¼JavaScript å
è®¸å¨æ è¯ç¬¦ä¸ä»¥ \u0000
æ \u{000000}
çå½¢å¼ä½¿ç¨ Unicode 转ä¹åºåï¼èè¿ä¼å°ç¸åçå符串å¼ç¼ç 为å®é
ç Unicode å符ãä¾å¦ï¼ä½ 好
å \u4f60\u597d
æ¯ä¸æ ·çæ è¯ç¬¦ï¼
const ä½ å¥½ = "ä½ å¥½";
console.log(\u4f60\u597d); // ä½ å¥½
䏿¯ææçåºå齿¥åå ¨é¨å¯è½çæ è¯ç¬¦ãç¹å®çè¯æ³ï¼ä¾å¦ï¼å½æ°å£°æã彿°è¡¨è¾¾å¼ååé声æï¼è¦æ±ä½¿ç¨çæ è¯ç¬¦ååä¸è½æ¯ä¿çåã
function import() {} // éæ³ï¼import æ¯ä¿çåã
ç¹å«çï¼ç§æå±æ§åå¯¹è±¡å±æ§å 许æ¯ä¿çåã
const obj = { import: "value" }; // åæ³çï¼å°½ç®¡ `import` æ¯ä¿çå
class C {
#import = "value";
}
å
³é®å
å
³é®åæ¯ JavaScript ä¸çèµ·æ¥åæ è¯ç¬¦ä½åå
·æç¹æ®å«ä¹çæ è®°ãä¾å¦ï¼å¨å½æ°å£°æä¹åç async
å
³é®åè¡¨ç¤ºè¯¥å½æ°æ¯å¼æ¥çã
ä¸äºå
³é®åæ¯ä¿ççï¼è¿æå³çå®ä»¬ä¸è½è¢«ç¨ä½åé声æã彿°å£°æççæ è¯ç¬¦ãå®ä»¬é常被称为ä¿çåãä¸é¢æä¾äºè¿äºä¿çåçå表ã并䏿¯ææçå
³é®å齿¯ä¿ççââä¾å¦ï¼async
å¯ä»¥å¨ä»»ä½å°æ¹ç¨ä½æ è¯ç¬¦ãä¸äºå
³é®ååªæ¯å¨ä¸ä¸æä¸ä¿çââä¾å¦ï¼await
åªå¨å¼æ¥å½æ°ä½å
ä¿çï¼let
åªå¨ä¸¥æ ¼æ¨¡å¼ä»£ç ä¸ï¼æ const
å let
声æä¸ä¿çã
æ è¯ç¬¦æ»æ¯éè¿å符串å¼è¿è¡æ¯è¾ï¼æä»¥è½¬ä¹åºåä¼è¢«è§£éãä¾å¦ï¼è¿ä¹æ¯ä¸ä¸ªè¯æ³é误ï¼
const els\u{65} = 1;
// `els\u{65}` ç¼ç çæ è¯ç¬¦ä¸ `else` ç¸å
ä¿çå æªæ¥ä¿çå
³é®å
å¨ ECMAScript è§æ ¼ä¸ï¼è¿äºå ³é®åè¢«å½æå ³é®åä¿çãç®åå®ä»¬æ²¡æç¹æ®åè½ï¼ä½æ¯å¨æªæ¥æä¸ªæ¶é´å¯è½ä¼å ä¸ãæä»¥è¿äºå ³é®åä¸è½å½ææ è¯ç¬¦ä½¿ç¨ãè¿äºå ³é®åå¨ä¸¥æ ¼æ¨¡å¼åéä¸¥æ ¼æ¨¡å¼ä¸åä¸è½ä½¿ç¨ã
enum
以ä¸å ³é®ååªå¨ä¸¥æ ¼æ¨¡å¼ä¸è¢«å½æä¿çå ³é®åï¼
implements
interface
let
package
private
protected
public
static
以ä¸å ³é®ååªå¨æ¨¡å代ç ä¸è¢«å½æä¿çå ³é®åï¼
await
è¿éæ¯ä¹åçæ¬ä¸ç ECMAScriptï¼1 å° 3ï¼ä¸çä¿çå ³é®åï¼
abstract
boolean
byte
char
double
final
float
goto
int
long
native
short
synchronized
transient
volatile
å¦å¤ï¼åé¢é null
ãtrue
å false
åæ ·ä¸è½è¢«å½ææ è¯ä½¿ç¨ã
äºå®ä¸ä¿çåæ¯ä» é对æ è¯ç¬¦ï¼Identifierï¼çææ³å®ä¹èè¨çï¼è䏿¯æ è¯ç¬¦åï¼IdentifierNameï¼çææ³å®ä¹ï¼ãå¦ es5.github.com/#A.1 䏿æè¿°çï¼è¿äºé½æ¯ä¸ææ¥ä¿çåçæ è¯ç¬¦åã
a.import
a["import"]
a = { import: "test" }.
å¦ä¸æ¹é¢ï¼å¦ä¸ç¨æ³æ¯ä¸å 许çãå ä¸ºå®æ¯ä¸ä¸ªæ è¯ç¬¦ï¼èæ è¯ç¬¦çææ³å®ä¹æ¯é¤ä¿çå以å¤çæ è¯ç¬¦åãæ è¯ç¬¦ç¨äºå½æ°å£°æå¼å彿°è¡¨è¾¾å¼ã
function import() {} // Illegal.
åé¢é 空åé¢é
æ´å¤ä¿¡æ¯å¯ä»¥åè null
ã
æ´å¤ä¿¡æ¯å¯ä»¥åèBoolean
请注æï¼åè¿å¶æ°ååé¢éå¯ä»¥ä»¥ 0 å¼å¤´ï¼ä½æ¯å¦æ 0 以åçæé«ä½æ¯ 8 å°ï¼æ°å¼å°ä¼è¢«è®¤ä¸ºæ¯å
«è¿å¶èä¸ä¼æ¥éãæ´å¤ä¿¡æ¯å¯ä»¥åè Firefox bug 957513 å parseInt()
ã
äºè¿å¶è¡¨ç¤ºä¸ºå¼å¤´æ¯ 0 忥大åæå°åç Bï¼0b
æè
0B
ï¼ãè¿æ¯ ECMAScript 6 ä¸çæ°è¯æ³ï¼å¯ä»¥åèä¸é¢çæµè§å¨å
¼å®¹æ§è¡¨æ ¼ã妿0b
ä¹åæé¤äº 0 æ 1 以å¤çæ°åï¼å°ä¼æåºSyntaxError
ï¼âMissing binary digits after 0bâã
0b10000000000000000000000000000000 // 2147483648
0b01111111100000000000000000000000 // 2139095040
0B00000000011111111111111111111111 // 8388607
å
«è¿å¶
å
«è¿å¶è¡¨ç¤ºä¸ºå¼å¤´æ¯ 0 忥大åæå°åç Oï¼0o
æ0O
ï¼ãè¿æ¯ ECMAScript 6 ä¸çæ°è¯æ³ï¼å¯ä»¥åèä¸é¢çæµè§å¨å
¼å®¹æ§è¡¨æ ¼ã妿æä¸å¨ï¼01234567ï¼ä¸çæ°åï¼å°ä¼æåºSyntaxError
ï¼âMissing octal digits after 0oâã
0O755 // 493
0o644 // 420
åå
è¿å¶
åå
è¿å¶è¡¨ç¤ºä¸ºå¼å¤´æ¯ 0 忥大åæå°åç Xï¼0x
æ0X
ï¼ã妿æä¸å¨ï¼0123456789ABCDEFï¼ä¸çæ°åï¼å°ä¼æåºSyntaxError
ï¼âIdentifier starts immediately after numeric literalâã
0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF // 81985529216486900
0XA // 10
æ°å¼åé符
å¯ä»¥ä½¿ç¨ä¸å线ï¼_
ï¼U+005F
ï¼ä½ä¸ºåé符以å¢å¼ºæ°ååé¢éçå¯è¯»æ§ï¼
1_000_000_000_000
1_050.95
0b1010_0001_1000_0101
0o2_2_5_6
0xA0_B0_C0
1_000_000_000_000_000_000_000n
请注æè¿äºéå¶ï¼
// ä¸å
许è¿ç»åºç°å¤ä¸ªä¸å线
100__000; // SyntaxError
// ä¸å
许使ç¨ä¸å线ä½ä¸ºæ°ååé¢éçç»å°¾
100_; // SyntaxError
// ä¸å
许å¨å导é¶ä¹å使ç¨ä¸å线
0_1; // SyntaxError
对象åé¢é
æ´å¤ä¿¡æ¯å¯ä»¥åè Object
å对象åå§åå¨ã
var o = { a: "foo", b: "bar", c: 42 };
// ES6 ä¸çç®ç¥è¡¨ç¤ºæ¹æ³
var a = "foo",
b = "bar",
c = 42;
var o = { a, b, c };
// ä¸éè¦è¿æ ·
var o = { a: a, b: b, c: c };
æ°ç»åé¢é
æ´å¤ä¿¡æ¯å¯ä»¥åè Array
ã
[1954, 1974, 1990, 2014];
å符串åé¢é åå
è¿å¶è½¬ä¹åºå Unicode 转ä¹åºå
Unicode 转ä¹åºåè¦æ±å¨\u
ä¹åè³å°æå个å符ã
ECMAScript 6 æ°å¢ç¹æ§ãä½¿ç¨ Unicode ç¼ç 转ä¹ï¼ä»»ä½å符é½å¯ä»¥è¢«è½¬ä¹ä¸ºåå
è¿å¶ç¼ç ãæé«å¯ä»¥ç¨å°0x10FFFF
ã使ç¨å纯ç Unicode 转ä¹é常éè¦åæåå¼ç两å以达å°ç¸åçææã
å¯ä»¥åèString.fromCodePoint()
åString.prototype.codePointAt()
ã
"\u{2F804}";
// 使ç¨å纯 Unicode 转ä¹
"\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 è¯å¥å¿ é¡»ç¨åå·ç»æï¼æä»¥ä¼è¢«èªå¨åå·è¡¥å ¨ (ASI) å½±åï¼
let
ãconst
ãåé声æimport
ãexport
ãæ¨¡åå®ä¹debugger
continue
ãbreak
ãthrow
return
ECMAScript è§æ ¼æå°èªå¨åå·è¡¥å ¨çä¸ä¸ªè§åã
å½åºç°ä¸ä¸ªä¸å 许çè¡ç»æ¢ç¬¦æâ}âæ¶ï¼ä¼å¨å ¶ä¹åæå ¥ä¸ä¸ªåå·ã
{ 1 2 } 3
// å°ä¼è¢« ASI 转æ¢ä¸º
{ 1 2 ;} 3;
彿è·å°æ è¯ç¬¦è¾å ¥æµçç»å°¾ï¼å¹¶ä¸æ æ³å°å个è¾å ¥æµè½¬æ¢ä¸ºä¸ä¸ªå®æ´çç¨åºæ¶ï¼å°å¨ç»å°¾æå ¥ä¸ä¸ªåå·ã
å¨ä¸é¢è¿æ®µä¸ï¼ç±äºå¨ b
å ++
ä¹é´åºç°äºä¸ä¸ªè¡ç»æ¢ç¬¦ï¼æä»¥ ++
æªè¢«å½æåé b
çåç½®è¿ç®ç¬¦ã
a = b
++c
// å°è¢« ASI 转æ¢ä¸º
a = b;
++c;
å½è¯å¥ä¸å å«è¯æ³ä¸çéå¶äº§ååè·ä¸ä¸ªè¡ç»æ¢ç¬¦çæ¶åï¼å°ä¼å¨ç»å°¾æå ¥ä¸ä¸ªåå·ã带âè¿é没æè¡ç»æ¢ç¬¦âè§åçè¯å¥æï¼
++
å --
ï¼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