JavaScript词法结构 - JavaScript权威指南(第七版)读书笔记 第二章

从今天开始,这里用来记录我的阅读笔记,学习JavaScript权威指南第七版

今天是第二章

第二章 词法结构

JavaScript程序的文本

JavaScript分大小写。比如,while关键字必须写成“while”,不能写成“While”

JavaScript忽略程序记号(token)之间的空格。很大程度上,JavaScript也忽略换行符。

注释

JavaScript支持两种注释:单行注释是以〃开头到一行末尾的内容,多行注释位于/*和*/之间,可以跨行,但不能嵌套。

// 这是单行注释

/* 这也是注释 */

/* 这也是注释 */ // 而这是另一个注释



/*

* 这是多行注释。

* 每行开头额外的

* 字符不是必需的,只是为了美观

*/

这行代码是一个多行注释,以 /* 开头,以 */ 结尾。在这个例子中,注释内容跨越了多行,每行开头额外的 * 字符并不是 JavaScript 注释的一部分,只是为了美观和约定俗成的习惯。

字面量

标识符是用于命名常量、变量、属性、函数和类的名字,以及为某些循环提供标记(label)的名称。在JavaScript中,标识符必须以字母、下划线(_)或美元符号($)开头,后续字符可以是字母、数字、下划线或美元符号(但数字不能作为第一个字符)。

保留字是JavaScript语言的一部分,不能用作常规标识符。以下是JavaScript中的保留字列表:

[

"as", "async", "await", "break", "case", "catch", "class", "const", "continue",

"debugger", "default", "delete", "do", "else", "export", "extends", "false",

"finally", "for", "from", "function", "null", "of", "return", "set", "get",

"if", "import", "in", "instanceof", "static", "let", "super", "new", "switch",

"target", "this", "throw", "true", "try", "typeof", "var", "void", "while",

"with", "yield"

];

由于历史原因,某些情况下也不允许使用 arguments 和 eval 作为标识符,因此最好避免使用它们。

Unicode

JavaScript程序可以使用Unicode字符集编写,因此在字符串和注释中可以使用任意Unicode字符。尽管语言本身支持在标识符中使用Unicode字母、数字和象形文字,但出于可移植性和易于编辑的考虑,建议在标识符中只使用ASCII字母和数字。

换句话说,尽管JavaScript允许在标识符中使用Unicode字符,但是为了代码的可读性和可移植性,最好还是只使用ASCII字符,而不是使用数学符号或非英语文字。

Unicode转义序列

Unicode转义序列以\u开头,后跟4位十六进制数字,表示一个Unicode字符。例如,字符"é"的Unicode转义序列是\u00E9。这些转义序列可以出现在JavaScript字符串字面量、正则表达式字面量和标识符中,但不能出现在语言关键字中。

JavaScript的早期版本只支持4位数字的转义序列,而ES6新增了一种带花括号的转义序列形式,允许使用1到6位十六进制数字来表示Unicode字符。这种形式的目的是更好地支持大于16位的Unicode码点,例如表情符号。

const cafe = 'caf\u00e9'; // 使用4位数字转义序列

const cafe = 'caf\u{E9}'; // 使用带花括号的转义序列

let cafe = 1; // 使用Unicode字符定义一个变量

需要注意的是,虽然Unicode转义序列也可以出现在注释中,但注释会被忽略,所以其中的转义序列会被作为ASCII字符处理,不会被解释为Unicode字符。

Unicode归一化

在JavaScript程序中使用非ASCII字符时需要注意Unicode的归一化问题。

Unicode允许使用多种编码方式来表示同一个字符。例如,字符"é"可以被编码为\u00E9,也可以被编码为一个普通的ASCII字符"e"后跟一个重音组合标记\u0301。尽管在文本编辑器中这两种编码看起来完全相同,但它们的二进制编码不同,因此JavaScript认为它们不同,可能导致问题。

举例来说:

const cafe1 = 'caf\u00E9'; // 使用\u00E9表示é

const cafe2 = 'caf\u{301}'; // 使用\u{301}表示é的重音组合标记

console.log(cafe1); // 'café'

console.log(cafe2); // 'café'

console.log(cafe1 === cafe2); // false,

虽然看起来相同,但它们是不同的字符串

为了解决这个问题,Unicode标准定义了归一化例程,用于将文本转换为适合比较的规范形式。JavaScript假定它解释的源代码已经进行了归一化处理,因此不会执行任何归一化。因此,如果你想在JavaScript程序中使用Unicode字符,应该确保使用自己的编辑器或其他工具对源代码执行Unicode归一化,以避免包含看起来相同但实际不同的标识符。

可选分号

JavaScript 使用分号(;)来分隔语句,确保代码的清晰性,避免出现一条语句的结尾可能被解释为另一条语句的开头,反之亦然的情况。

在 JavaScript 中,通常可以省略分号,特别是当两条语句分别写在两行时。另外,如果下一个记号是右花括号 },在程序末尾时也可以省略分号。

JavaScript 并非任何时候都会把换行符当作分号,而是在下一个非空格字符无法被解释为当前语句的一部分时才这么做。但有三种例外情况会被解释为分号:

  • 当 return、throw、yield、break 和 continue 等关键字后面跟着换行符时。
  • ++ 和 -- 操作符必须与自己操作的表达式位于同一行。
  • 使用箭头函数时,箭头 => 必须与参数列表在同一行。

通常,如果语句以 (、[、/、+ 或 - 开头,有可能被解释为之前语句的一部分。为了防止意外解析,一些程序员喜欢在这些语句前面添加一个分号,以防止影响当前语句。

文中还提到了一些例外情况,例如 return、break 或 continue 等关键字后面跟着表达式时不能换行,++ 和 -- 操作符的使用规则,以及箭头函数的参数列表必须与箭头在同一行。

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值