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 —— 主要表达式一(this等) #78

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

重学js —— 主要表达式一(this等) #78

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

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Feb 27, 2020

主要表达式一

语法

主要表达式[Yield, Await]

包含括号的表达式和箭头参数列表[?Yield, ?Await]

补充语法

当处理生产实例时

  主要表达式[Yield, Await] : 包含括号的表达式和箭头参数列表[?Yield, ?Await]

使用以下语法:

  带括号的表达[?Yield, ?Await] :

    (表达式[+In, ?Yield, ?Await])

this关键字

求值

  1. 返回 ? ResolveThisBinding

标识符引用

字面量

数组初始化

数组字面量 是描述数组对象初始化的表达式,使用包含零个或多个表达式的列表,每个表达式均表示一个数组元素,并用方括号括起来。元素不一定是字面量;当数组初始化器求值时它们也会被求值。

在列表的开始,中间以及尾部位置的数组元素可以被忽略。每当元素列表中的逗号前面没有 赋值表达式(即开头或后面的逗号)时,缺少的数组元素会增加数组的长度,并增加后续元素的索引。忽略的数组元素未定义。如果数组的最后一个元素被忽略,该元素不会增加数组的长度!

let arr = [ , , ];
console.log(arr.length); // 2

数组累加

伴有参数 arraynextIndex

忽略:,

  1. 定义 lennextIndex + 1
  2. 执行 ? Set(array, "length", len, true)
  3. 注意:如果 len 超过 232 - 1,上面的Set操作会抛错!!!
  4. 返回 len

为什么数组最大长度为232 - 1?

数组长度是 0 ~ 232 - 1,其实表示 无符号32位二进制整数。而数组的长度的确是用 ToUint32 转换的,相关算法在规范中多处都有提到,例如 Array 的 [[DefineOwnProperty]](P, Desc)

忽略:忽略 ,

[ , ]
  1. 其实还是执行上一算法,只不过这里传入参数 arraynextIndex + 1

元素列表:忽略opt 赋值表达式

[ , a = 1] // [empty, 1]

[ , a += 1] // [empty, 2]
  1. 如果忽略存在
    1. nextIndex 赋值为 执行参数为 arraynextIndex函数累加 的结果。
    2. ReturnIfAbrupt(nextIndex)
  2. 定义 initResult赋值表达式 求值 结果
  3. 定义 initValue? GetValue(initResult)
  4. 定义 created! CreateDataPropertyOrThrow(array, ! ToString(nextIndex), initValue)
  5. 返回 nextIndex + 1

元素列表:忽略opt 扩展元素

let arr1 = [1, 2, 3];
let arr2 = [ , ...arr1];
console.log(arr2); // [empty, 1, 2, 3]
  1. 如果忽略存在,
    1. nextIndex 赋值为 执行参数为 arraynextIndex函数累加 的结果。
    2. ReturnIfAbrupt(nextIndex)
  2. 返回 执行参数为 arraynextIndex扩展元素函数累加 结果

元素列表:元素列表 , 忽略opt 赋值表达式

[1, 2, , a = 3]; // [1, 2, empty, 3]
  1. nextIndex 赋值为 执行参数为 arraynextIndex元素列表函数累加 的结果。
  2. ReturnIfAbrupt(nextIndex)
  3. 如果忽略存在,
    1. nextIndex 赋值为 执行参数为 arraynextIndex函数累加 的结果
    2. ReturnIfAbrupt(nextIndex)
  4. 定义 initResult赋值表达式 求值 结果
  5. 定义 initValue? GetValue(initResult)
  6. 定义 created! CreateDataPropertyOrThrow(array, ! ToString(nextIndex), initValue)
  7. 返回 nextIndex + 1

元素列表:元素列表 , 忽略opt 扩展元素

let arr1 = [3, 4, 5];
let arr2 = [1, 2, , ...arr1];
console.log(arr2); // [1, 2, empty, 3, 4, 5]
  1. nextIndex 赋值为 执行参数为 arraynextIndex元素列表函数累加 的结果。
  2. ReturnIfAbrupt(nextIndex)
  3. 如果忽略存在,
    1. nextIndex 赋值为 执行参数为 arraynextIndex函数累加 的结果
    2. ReturnIfAbrupt(nextIndex)
  4. 返回 执行参数为 arraynextIndex扩展元素函数累加 的结果

扩展元素:... 赋值表达式

let arr1 = [1, 2, 3];
let arr2 = [...arr1];
console.log(arr2); // [1, 2, 3]
  1. 定义 spreadRef赋值表达式求值 结果
  2. 定义 spreadObj? GetValue(spreadRef)
  3. 定义 iteratorRecord? GetIterator(spreadObj)
  4. 重复,
    1. 定义 next? IteratorStep(iteratorRecord)
    2. 如果 nextfalse,返回 nextIndex
    3. 定义 nextValue? IteratorValue(iteratorRecord)
    4. 执行 ! CreateDataPropertyOrThrow(array, ! ToString(nextIndex), nextValue)
    5. nextIndex 赋值为 nextIndex + 1

注意:CreateDataPropertyOrThrow 用来确保数组自有属性已定义,即使已经通过某种 排除使用 [[Set]] 创建自己的新属性 的方式修改了标准的内置(固有)数组原型对象。

数组求值语义算法,内部主要用 ArrayCreate(0) 来创建新数组。

2020-03-25 补充

// 来自高级前端面试,这题我做对了,但是还是写下来
var status = 'a'

setTimeout(() => {
  const status = 'b'

  const data = {
    status: '',
    getStatus() {
      return this.status
    }
  }

  console.log(data.getStatus())
  console.log(data.getStatus.call(this))
}, 0)

// 选B,这里是箭头函数
A. '' and 'b'
B. '' and 'a'
C. 'b' and 'a'
D. 'a' and 'a'
@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Feb 27, 2020
@lizhongzhen11 lizhongzhen11 changed the title 重学js —— 主要表达式一 重学js —— 主要表达式一(this等) Jul 22, 2020
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