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 —— 主要表达式二 #79

Open
lizhongzhen11 opened this issue Feb 28, 2020 · 0 comments
Open

重学js —— 主要表达式二 #79

lizhongzhen11 opened this issue Feb 28, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Feb 28, 2020

主要表达式二

主要表达式一

对象初始化

注意:这里指以 {} 这种形式创建的对象初始化。

方法定义

var o = {
  property([parameters]) {},
  get property() {},
  set property(value) {},
  * generator() {}
};

变更原型

使用对象字面量初始化对象时,如果一开始就设置了 __proto__,且值是对象或 null,那么会引起原型改变

求值

1. 对象字面量 : { }

  1. 返回 OrdinaryObjectCreate(%Object.prototype%) (PS:%Object.prototype% 属于众所周知的固有对象

2. 对象字面量 :

  { 属性定义列表 }

  { 属性定义列表 , }

{a: 'a', b: 'b'}
  1. 定义 objOrdinaryObjectCreate(%Object.prototype%)
  2. 执行参数为 objtrue 的 属性定义列表的 ? PropertyDefinitionEvaluation
  3. 返回 obj

3. 字面量属性名 : 标识符名

{$: ''}
  1. 返回 标识符名 的字符串值

4. 字面量属性名 : 字符串字面量

{'a': ''}
  1. 返回字符串值,其码元是字符串字面量的 SV

5. 字面量属性名 : 数值字面量

{1: ''}
  1. 定义 nbr 为数值字面量的数值
  2. 返回 ! ToString(nbr)

6. 计算属性名 : [ 赋值表达式 ]

{['1' + 1]: '2'} // {'11': '2'}
  1. 返回 empty (空)

函数定义表达式

正则表达式字面量

运行时语义:求值

主要表达式 : 正则表达式字面量

  1. 定义 pattern! UTF16Encode(正则表达式的 BodyText)
  2. 定义 flags! UTF16Encode(正则表达式的 FlagText)
  3. 返回 (pattern, flags)

模板字面量

// 注意
var person = 'Mike';
var age = 28;
function myTag(strings, personExp, ageExp) {

  var str0 = strings[0]; // "that "
  var str1 = strings[1]; // " is a "

  // There is technically a string after
  // the final expression (in our example),
  // but it is empty (""), so disregard.
  // var str2 = strings[2];

  var ageStr;
  if (ageExp > 99){
    ageStr = 'centenarian';
  } else {
    ageStr = 'youngster';
  }

  return str0 + personExp + str1 + ageStr;

}
var output = myTag`that ${ person } is a ${ age }`;
console.log(output);
// that Mike is a youngster

求值

// 模板头
`字符 ${

// 模板中间
} 字符 ${

// 模板中间列表
} 字符 ${ 表达式
模板中间列表 模板中间 表达式

// 模板跨度
模板中间列表 模板尾

// 模板尾
} 字符`

1. 模板字面量 : 无替换模板

`a`; // 'a'
  1. 返回码元在 无替换模板的 TV(模板值) 中的元素对应的字符串值

2. 替换模板 : 模板头 表达式 模板跨度

  1. 定义 head模板头TV(模板值)
  2. 定义 subRef 为 表达式的 求值 结果
  3. 定义 sub? GetValue(subRef)
  4. 定义 middle? ToString(sub)
  5. 定义 tail 为 模板跨度求值结果
  6. ReturnIfAbrupt(tail)
  7. 返回 headmiddletail 的字符串连接。

注意:这里的对表达式值的字符串转换语义类似于 String.prototype.concat 而不是 + 运算符。

3. 模板跨度 : 模板尾

  1. 定义 tail模板尾TV(模板值)
  2. 返回 tail 码元组成的字符串连接值。

4. 模板跨度 : 模板中间列表 模板尾

  1. 定义 head 为 模板中间列表的求值结果
  2. ReturnIfAbrupt(head)
  3. 定义 tail模板尾TV(模板值)
  4. 返回 headtail 字符串连接值。

5. 模板中间列表 : 模板中间 表达式

  1. 定义 head模板中间TV(模板值)
  2. 定义 subRef 为 表达式的 求值 结果
  3. 定义 sub? GetValue(subRef)
  4. 定义 middle? ToString(sub)
  5. 返回 head 以及紧跟着的 middle 中的元素的码元组成的码元序列

6. 模板中间列表 : 模板中间列表 模板中间 表达式

  1. 定义 rest 为模板中间列表求值结果
  2. ReturnIfAbrupt(rest)
  3. 定义 middle模板中间TV(模板值)
  4. 定义 subRef 为 表达式的 求值 结果
  5. 定义 sub? GetValue(subRef)
  6. 定义 middle? ToString(sub)
  7. 返回 rest 的元素的码元以及紧跟着的 middle 的码元紧接着 last 的元素的码元组成的码元序列

圆括号运算符

  • MDN (看MDN即可)

该算法不会将 GetValue 用于表达式求值。这样做的主要动机是可以将诸如 deletetypeof 之类的运算符应用于带括号的表达式。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant