前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javascript入门到进阶 - javascript词法文法

javascript入门到进阶 - javascript词法文法

作者头像
公众号---人生代码
发布2020-07-14 11:05:28
7310
发布2020-07-14 11:05:28
举报
文章被收录于专栏:人生代码人生代码

「javascript词法文法学习篇」

这部分描述了JavaScript的词法。ECMAScript源码文本会被从左到右扫描,并被转换为一系列的输入元素,包括tokens、控制符、行终止符、注释和空白符。ECMAScript定义了一些关键字、字面量以及行尾分号补全的规则。

「注释」

注释用来在源码中增加提示、笔记、建议、警告等信息,可以帮助阅读和理解源码。在调试时,可以用来将一段代码屏蔽掉,防止其运行。

JavaScript中有两种生成注释的方法。

第一种是单行注释 (single-line comment),使用//,会将该行中符号以后的文本都视为注释:

代码语言:javascript
复制
function comment() {
  // 这是行注释
  console.log("Hello world!");
}
comment();

第二种是多行注释 (multiple-line comment),使用/* */ ,这种方式更加灵活:

比如,可以使用多行注释来实现单行注释:

代码语言:javascript
复制
function comment() {
  /* 单行注释 */
  console.log("Hello world!");
}
comment();

也可以用来实现多行注释:

代码语言:javascript
复制
function comment() {
  /* 多行注释,
     直到终止符号才结束 */
  console.log("Hello world!");
}
comment();

多行注释也可以用于单行间注释,这样会造成代码可读性变差,所以要谨慎使用:

代码语言:javascript
复制
function comment(x) {
  console.log("Hello " + x /* 引入x的值 */ + " !");
}
comment("world");

另外,块注释也可以用来屏蔽一段代码,只要将这段代码用块注释包裹起来就可以了:

代码语言:javascript
复制
function comment() {
  /* console.log("Hello world!"); */
}
comment();

注释中的console.log()的调用始终无效。这种方式可以屏蔽任意多行的代码。

「保留字的使用」事实上保留字是仅针对标识符(Identifier)的文法定义而言的(而非标识符名(IdentifierName)的文法定义). 如 es5.github.com/#A.1中所描述的, 这些都是不排斥保留字的标识符名.

代码语言:javascript
复制
a.import
a["import"]
a = { import: "test" }.

另一方面,如下用法是不允许的。因为它是一个标识符,而标识符的文法定义是除保留字以外的标识符名。标识符用于函数声明式和函数表达式.

代码语言:javascript
复制
function import() {} // Illegal.

「直接量」「空直接量」更多信息可以参考null

null「布尔直接量」更多信息可以参考Boolean

代码语言:javascript
复制
true
false

「数值直接量」十进制

代码语言:javascript
复制
1234567890
42

// 谨慎使用0开头的数值

0888 // 转换为十进制888
0777 // 转换为八进制777,十进制511

请注意,十进制数值直接量可以以0开头,但是如果0以后的最高位比8小,数值将会被认为是八进制而不会报错。更多信息可以参考bug 957513和parseInt()。

「二进制」二进制表示为开头是0后接大写或小写的B(0b或者0B)。这是ECMAScript 6中的新语法,可以参考下面的浏览器兼容性表格。如果0b之后有除了0或1以外的数字,将会抛出SyntaxError:“Missing binary digits after 0b”。

代码语言:javascript
复制
var FLT_SIGNBIT  = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607

「八进制」八进制表示为开头是0后接大写或小写的O(0o或0O)。这是ECMAScript 6中的新语法,可以参考下面的浏览器兼容性表格。如果有不在(01234567)中的数字,将会抛出SyntaxError:“Missing octal digits after 0o”。

代码语言:javascript
复制
var n = 0O755; // 493
var m = 0o644; // 420

// 用0开头也可以实现(请查看上方十进制有关部分)

代码语言:javascript
复制
0755
0644

「十六进制」十六进制表示为开头是0后接大写或小写的X(0x或0X)。如果有不在(0123456789ABCDEF)中的数字,将会抛出SyntaxError:“Identifier starts immediately after numeric literal”。

代码语言:javascript
复制
0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF   // 81985529216486900
0XA                 // 10

「对象直接量」更多信息可以参考Object和对象初始化器。

代码语言:javascript
复制
var o = { a: "foo", b: "bar", c: 42 };

// ES6中的简略表示方法

代码语言:javascript
复制
var a = "foo", b = "bar", c = 42;
var o = {a, b, c};
// 不需要这样
var o = { a: a, b: b, c: c };

「数组直接量」更多信息可以参考Array。

代码语言:javascript
复制
[1954, 1974, 1990, 2014]

「字符串直接量」

代码语言:javascript
复制
'foo'
"bar"
十六进制转义序列
'\xA9' // "©"
Unicode转义序列
Unicode转义序列要求在\u之后至少有四个字符。

'\u00A9' // "©"

「Unicode编码转义」ECMAScript 6新增特性。使用Unicode编码转义,任何字符都可以被转义为十六进制编码。最高可以用到0x10FFFF。使用单纯的Unicode转义通常需要写成分开的两半以达到相同的效果。

可以参考String.fromCodePoint()和String.prototype.codePointAt()。

代码语言:javascript
复制
'\u{2F804}'

// 使用单纯Unicode转义
'\uD87E\uDC04'
正则表达式直接量节
更多信息可以参考RegExp。

/ab+c/g

// 一个空的正则表达式直接量
// 必须有一个空的非捕获分组
// 以避免被当成是行注释符号
/(?:)/

「模板直接量」更多信息可以参考template strings。

代码语言:javascript
复制
`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tag `string text ${expression} string text`

「自动分号补全」一些JavaScript语句必须用分号结束,所以会被自动分号补全 (ASI)影响:

空语句

代码语言:javascript
复制
let、const、变量声明
import、export、模块定义
表达式语句
debugger
continue、break、throw
return
ECMAScript规格提到自动分号补全的三个规则。

当出现一个不允许的行终止符或“}”时,会在其之前插入一个分号。

代码语言:javascript
复制

{ 1 2 } 3 

// 将会被ASI转换为 

{ 1 2 ;} 3;

当捕获到标识符输入流的结尾,并且无法将单个输入流转换为一个完整的程序时,将在结尾插入一个分号。

在下面这段中,由于在b和++之间出现了一个行终止符,所以++未被当成变量b的后置运算符。

代码语言:javascript
复制
a = b
++c

// 将被ASI转换为

a = b;
++c;

当语句中包含语法中的限制产品后跟一个行终止符的时候,将会在结尾插入一个分号。带“这里没有行终止符”规则的语句有:

后置运算符(++和--)

代码语言:javascript
复制
continue
break
return
yield, yield*
module
return
a + b

// 将被ASI转换为

代码语言:javascript
复制
return;
a + b;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档