Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— 源文本 #69

Open
lizhongzhen11 opened this issue Jan 22, 2020 · 0 comments
Open

重学js —— 源文本 #69

lizhongzhen11 opened this issue Jan 22, 2020 · 0 comments
Labels
重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Jan 22, 2020

源文本

句法

SourceCharacter ::

   任何Unicode码点

ECMAScript代码使用Unicode表示。ECMAScript源文本是一系列码点。所有在 U+0000 ~ U+10FFFF 之间的Unicode码点值,包含代理码点,都可能出现在ECMAScript语法允许的源文本中。用于存储和交换ECMAScript源文本的实际编码与该规范无关。不管外部源文本编码如何,符合ECMAScript的实现 将源文本视为与 SourceCharacter 值的 等效序列 相同,每个 SourceCharacter 都是一个Unicode码点。一致性ECMAScript实现不需要执行源文本的任何规范化,或表现为好像正在执行源文本的规范化。

即使用户可能将整个序列视为一个字符,但组合字符序列的组成部分仍被视为单独的Unicode码点。

注意:在字符串,正则表达式,模板和标识符中,任何Unicode码点也可以使用Unicode转义序列表示,这些转义序列明确表示码点的数值。在注释中,这样的转义序列作为注释的一部分被有效地忽略。


ECMAScript在Unicode转义序列上的行为和Java程序语言不同。在Java中,例如在单行注释中的Unicode转义序列 \u000A,它被解释为行终止符(Unicode码点 U+000A 代表 换行(LF))且因此下一个码点不会是该注释的一部分。相似地,在Java程序字符串中的Unicode转义序列 \u000A,它同样被解释为一个行终止符,这在字符串文字中是不允许的,必须用 \n 代替 \u000A 才能使换行符(LF)成为字符串的一部分。

在ECMAScript程序中,注释中的Unicode转义序列不会被解释且因此不能作为注释的终止符。类似的,ECMAScript程序字符串中的Unicode转义序列是字符串的一部分,也不会被解释成行终止符或字符串终止的码点。

静态语义:UTF16Encoding ( cp )

  • cpUTF-16 编码的数字码点值
  1. 断言:0 ≤ cp ≤ 0x10FFFF
  2. 如果 cp ≤ 0xFFFF,返回 cp
  3. 定义 cu1floor((cp - 0x10000) / 0x400) + 0xD800
  4. 定义 cu2 为 ((cp - 0x10000) modulo 0x400) + 0xDC00
  5. 返回由 cu1 后面跟着 cu2 组成的码点序列

静态语义:UTF16Decode ( lead, trail )

  • 构成 UTF-16 代理对 的两个码点 leadtrail,被转换为一个码点
  1. 断言:leadleading surrogate(主要代理)trailtrailing surrogate(尾随代理项)
  2. 定义 cp 为 (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000
  3. 返回 cp 的码点

静态语义:CodePointAt ( string, position ) —— codePointAt

抽象操作 CodePointAt 将字符串解释为UTF-16编码的码点序列,正如 String 类型 中定义的那样,并从索引 position 的代码单元开始读取单个码点。

  1. 定义 sizestring 的长度
  2. 断言:position ≥ 0position < size
  3. 定义 firststring 内索引 position 处的代码单元
  4. 定义 cp 为 其数值是 first 的码点
  5. 如果 first 不是 leading surrogate(主要代理)trailing surrogate(尾随代理项)
    1. 返回 Record{ [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }
  6. 如果 firsttrailing surrogate(尾随代理项)position + 1 = size
    1. 返回 Record{ [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }
  7. 定义 secondstring 内索引 position + 1 的代码单元
  8. 如果 second 不是 trailing surrogate(尾随代理项)
    1. 返回 Record{ [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }
  9. 设置 cp! UTF16Decode(first, second)
  10. 返回 Record{ [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }

源代码类型

有四种类型的ECMAScript代码:

注意1:函数代码通常作为以下内容的主体提供:函数定义箭头函数定义方法定义Generator函数定义Async函数定义Async Generator函数定义Async箭头函数定义。函数代码还从函数 构造器,GeneratorFunction 构造器 和 AsyncFunction 构造器 的参数派生。

注意2:在函数代码中包含 BindingIdentifier 的实际效果是,严格模式代码的Early Errors会应用到 BindingIdentifier,即该函数的名称包含其主体中的 "use strict" 指令,即使周围的代码不是严格模式。

严格模式

非严格模式的ECMAScript代码成为 non-strict code(非严格模式)

@lizhongzhen11 lizhongzhen11 added the 重学js 重学js系列 规范+MDN label Jan 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant