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 —— Operations on Objects and Operations on Iterator Objects #63

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

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Jan 6, 2020

Operations on Objects and Operations on Iterator Objects

规范中这章主要是介绍js对象的api其内部运行过程(尤其是迭代器Iterator对应的内部执行过程),了解下即可。

Object.seal

  1. 不可扩展(增加属性)
  2. 不可删除属性
  3. 不可 配置(这里指不可将数据属性改成访问器属性,同样的不可将访问器属性改为数据属性)
  4. 能改属性值(最重要的)
  5. 不会影响从原型链上继承的属性。但不能改变其原型对象的指向
  6. 内部执行原理见规范setintegritylevel本质上将所有属性描述符的Configurable设为false
  7. ES5中,如果这个方法的参数不是一个对象(一个原始值),那么它会导致 TypeError;ES2015中,非对象参数将被视为要被密封的普通对象,并被简单地返回。

Object.freeze

const person = {
  name: 'Lizz',
  address: {
    street: '001'
  }
}
Object.freeze(person)
person.name = '吴彦祖' // 无效
delete person.address // 无效
person.pet = {name: 'dog'} // 无效
person.address.street = '110' // 成功,浅冻结
  1. 不可扩展
  2. 不可删除属性
  3. 不可 配置
  4. 值如果是原始数据类型,不可修改;如果是对象,可以修改值对象的内部属性(浅冻结,只冻结第一层的原始数据类型值)
  5. 冻结一个对象后该对象的原型也不能被修改
  6. 这个方法返回传递的对象,而不是创建一个被冻结的副本。
  7. 内部执行原理见规范setintegritylevel本质上将所有属性描述符的Configurable设为false,如果是数据属性,还要把Writable也设为false
  8. ES5中,如果这个方法的参数不是一个对象(一个原始值),那么它会导致 TypeError;ES2015中,非对象参数将被视为要被冻结的普通对象,并被简单地返回。

类数组对象

注意看规范中的NOTE 1: Typically, an array-like object would also have some properties with integer index names. However, that is not a requirement of this definition.

翻译来看的话,类数组对象并不要求属性名必须是字符串类型的整数。 那么下面的也可以算类数组对象了:

let arrLike = {
  a: 'a',
  b: 'b',
  c: 'c',
  length: 3
}
Array.from(arrLike) // [undefined, undefined, undefined]
Array.from('123') // ['1', '2', '3']

数组对象和String对象也是类数组对象的样例。

GetIterator ( obj [ , hint [ , method ] ] )

  1. 如果 hint 不存在,设为 sync.

  2. 断言:hint 值为 sync 或 async.

  3. 如果 method 不存在,

    1. 如果 hint 是 async,

      1. 调用? GetMethod(obj, @@asyncIterator)将值赋给 method.

      2. 如果 method 是 undefined,

        1. 定义过程变量 syncMethod,调用? GetMethod(obj, @@iterator)将结果赋给 syncMethod
        2. 定义过程变量 syncIteratorRecord,调用? GetIterator(obj, sync, syncMethod)将结果赋给 syncIteratorRecord。(递归)
        3. 返回 ! CreateAsyncFromSyncIterator(syncIteratorRecord)结果
    2. 否则(如果 hint 是 sync),调用? GetMethod(obj, @@iterator)将值赋给 method.

  4. 定义过程变量 iterator,调用? Call(method, obj)将结果赋给 iterator.

  5. 执行Type(iterator),若结果不是对象,抛出类型错误

  6. 定义过程变量 nextMethod,调用? GetV(iterator, "next")将结果赋给 nextMethod

  7. 定义过程变量 iteratorRecord,其值为 Record { [[Iterator]]: iterator, [[NextMethod]]: nextMethod, [[Done]]: false }

  8. 返回 iteratorRecord

IteratorNext ( iteratorRecord [ , value ] )

  1. 如果 value 不存在,

    a. 定义 result 变量,调用 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])将结果赋给 result

  2. 否则,

    a. 定义 result 变量,调用 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »)将结果赋给 result

  3. 如果 result 类型不是对象,抛出类型错误

  4. 返回 result

IteratorComplete ( iterResult )

  1. 断言 iterResult 的类型是对象
  2. 调用 ? Get(iterResult, "done")并对结果进行布尔转换,返回转换后的布尔值

IteratorValue ( iterResult )

  1. 断言 iterResult 的类型是对象
  2. 返回调用 ? Get(iterResult, "value") 的结果

IteratorStep ( iteratorRecord )

  1. 定义 result,调用? IteratorNext(iteratorRecord)将结果赋给 result
  2. 定义 done,调用? IteratorComplete(result)将结果赋给 done
  3. 如果done为 true(代表迭代器已完成所有执行),返回 false
  4. 返回 result

ListIteratorNext Functions

匿名内置函数。

  1. 定义 O 保存 this

  2. 断言:O的类型是对象

  3. 断言:O有 [[IteratedList]] 内置插槽

  4. 定义 list,值为 O.[[IteratedList]]

  5. 定义 index,值为 O.[[ListNextIndex]]

  6. 定义 len,值为 list 中的元素数量

  7. 如果 index >= len,

    7.1 返回CreateIterResultObject(undefined, true)执行结果

  8. 设置 O.[[ListNextIndex]] 为 index + 1

  9. 返回CreateIterResultObject(list[index], false)执行结果

ListIteratorNext function的 length 属性值为0!

and so on...

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