lizhongzhen11 / lizz-blog

前端学习
80 stars 6 forks source link

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

Open lizhongzhen11 opened 4 years ago

lizhongzhen11 commented 4 years ago

数组对象

数组构造器

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 )

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.