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 —— 索引集合之数组对象 #119

Open
lizhongzhen11 opened this issue Jun 17, 2020 · 0 comments
Open

重学js —— 索引集合之数组对象 #119

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

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Jun 17, 2020

数组对象

数组构造器

Array ( )

  1. 定义 numberOfArgs 为函数调用时传递过来的参数数量
  2. 断言:numberOfArgs = 0
  3. 如果 NewTargetundefined,定义 newTarget活跃的函数对象;否则,定义 newTargetNewTarget
  4. 定义 proto? GetPrototypeFromConstructor(newTarget, "%Array.prototype%")
  5. 返回 ! ArrayCreate(0, proto)

Array ( len )

Array(1) // [empty]
new Array(1) // [empty]
  1. 定义 numberOfArgs 为函数调用时传递过来的参数数量
  2. 断言:numberOfArgs = 1
  3. 如果 NewTargetundefined,定义 newTarget活跃的函数对象;否则,定义 newTargetNewTarget
  4. 定义 proto? GetPrototypeFromConstructor(newTarget, "%Array.prototype%")
  5. 定义 array! ArrayCreate(0, proto)
  6. 如果 len 不是 Number 类型,
    1. 执行 ! CreateDataPropertyOrThrow(array, "0", len)
    2. 定义 intLen 为 1
  7. 否则,
    1. 定义 intLenToUint32(len)
    2. 如果 intLen ≠ len,抛 RangeError 异常
  8. 执行 ! Set(array, "length", intLen, true)
  9. 返回 array

Array ( ...items )

Array(1, 2, 3) // [1, 2, 3]
new Array(1, 2, 3) // [1, 2, 3]
  1. 定义 numberOfArgs 为函数调用时传递过来的参数数量
  2. 断言:numberOfArgs ≥ 2
  3. 如果 NewTargetundefined,定义 newTarget活跃的函数对象;否则,定义 newTargetNewTarget
  4. 定义 proto? GetPrototypeFromConstructor(newTarget, "%Array.prototype%")
  5. 定义 array? ArrayCreate(numberOfArgs, proto)
  6. 定义 k 为 0
  7. 定义 items 为零序列表,按顺序包含参数项目
  8. k < numberOfArgs,重复以下操作,
    1. 定义 Pk! ToString(k)
    2. 定义 itemKitems[k]
    3. 执行 ! CreateDataPropertyOrThrow(array, Pk, itemK)
    4. k 设置为 k + 1
  9. 断言:array"length" 属性值为 numberOfArgs
  10. 返回 array

Array 构造器上的属性

Array.from ( items [ , mapfn [ , thisArg ] ] )

  1. 定义 Cthis
  2. 如果 mapfnundefined,定义 mappingfalse
  3. 否则,
    1. 如果 mapfn 不可调用,抛 TypeError 异常
    2. 定义 mappingtrue
  4. 定义 usingIterator? GetMethod(items, @@iterator)
  5. 如果 usingIteratorundefined
    1. 如果 C 是构造器,
      1. 定义 A? Construct(C)
    2. 否则,
      1. 定义 A! ArrayCreate(0)
    3. 定义 iteratorRecord? GetIterator(items, sync, usingIterator)
    4. 定义 k 为 0
    5. 重复,
      1. 如果 k ≥ 253 - 1
        1. 定义 errorThrowCompletion(新创建的TypeError对象)
        2. 返回 ? IteratorClose(iteratorRecord, error)
      2. 定义 Pk! ToString(k)
      3. 定义 next? IteratorStep(iteratorRecord)
      4. 如果 nextfalse
        1. 执行 ? Set(A, "length", k, true)
        2. 返回 A
      5. 定义 nextValue? IteratorValue(next)
      6. 如果 mappingtrue
        1. 定义 mappedValueCall(mapfn, thisArg, « nextValue, k »)
        2. 如果 mappedValueabrupt completion,返回 ? IteratorClose(iteratorRecord, mappedValue)
        3. mappedValue 设置为 mappedValue.[[Value]]
      7. 否则,定义 mappedValuenextValue
      8. 定义 defineStatusCreateDataPropertyOrThrow(A, Pk, mappedValue)
      9. 如果 defineStatusabrupt completion,返回 ? IteratorClose(iteratorRecord, defineStatus)
      10. k 设置为 k + 1
  6. 注意:items 不是迭代对象,推断它是 类数组对象
  7. 定义 arrayLike! ToObject(items)
  8. 定义 len? LengthOfArrayLike(arrayLike)
  9. 如果 C 是构造器,
    1. 定义 A? Construct(C, « len »)
  10. 否则,
    1. 定义 A? ArrayCreate(len)
  11. 定义 k 为 0
  12. k < len 时,重复以下步骤,
    1. 定义 Pk! ToString(k)
    2. 定义 kValue? Get(arrayLike, Pk)
    3. 如果 mappingtrue
      1. 定义 mappedValue? Call(mapfn, thisArg, « kValue, k »)
    4. 否则,定义 mappedValuekValue
    5. 执行 ? CreateDataPropertyOrThrow(A, Pk, mappedValue)
    6. k 设置为 k + 1
  13. 执行 ? Set(A, "length", len, true)
  14. 返回 A

Array.isArray ( arg )

  1. 返回 ? IsArray(arg)

Array.of ( ...items )

  • MDN
  • 感觉这个方法主要就是为了弥补 Array() 生成数组的不足
Array(1) // [empty]
Array.of(1) // [1]
  1. 定义 len 为传递给函数的参数数量
  2. 定义 items 为 传递过来的参数
  3. 定义 Cthis
  4. 如果 C 是构造器,
    1. 定义 A? Construct(C, « len »)
  5. 否则,
    1. 定义 A? ArrayCreate(len)
  6. 定义 k 为 0
  7. k < len,重复以下步骤
    1. 定义 kValueitems[k]
    2. 定义 Pk! ToString(k)
    3. 执行 ? CreateDataPropertyOrThrow(A, Pk, kValue)
    4. k 设置为 k + 1
  8. 执行 ? Set(A, "length", len, true)
  9. 返回 A

Array 迭代对象(自己看看就好)

2020-07-29 补充

来自高级前端面试第18题

数组里面有10万个数据,取第一个元素和第10万个元素的时间相差多少?

这个其实涉及到数据结构知识了。数组是索引集合,取第一个和第10万个所用时间应该是一样的,不管取哪个索引的元素时间复杂度都是O(1),时间差应该是0.

@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Jun 17, 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