페이지 표시 설정

23 인덱스 컬렉션

23.1 Array 객체

Array는 특정 종류의 프로퍼티 이름을 특별하게 처리하는 특수 객체입니다. 이러한 특별한 처리의 정의는 10.4.2를 참조하시기 바랍니다.

23.1.1 Array 생성자

Array 생성자는:

  • %Array%입니다.
  • 전역 객체의 "Array" 프로퍼티의 초기 값입니다.
  • 생성자로 호출되면 새로운 Array를 생성하고 초기화합니다.
  • 생성자가 아니라 함수로 호출되는 경우에도 새로운 Array를 생성하고 초기화합니다. 따라서 함수 호출 Array(…)는 동일한 인수를 갖는 객체 생성 표현식 new Array(…)와 동등합니다.
  • 인수의 수와 타입에 따라 동작이 달라지는 함수입니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 특수한 Array 동작을 상속하려는 하위 클래스 생성자는 Array 특수 객체인 하위 클래스 인스턴스를 초기화하기 위해 Array 생성자에 대한 super 호출을 포함해야 합니다. 그러나 대부분의 Array.prototype 메서드는 this 값이 Array 특수 객체인지에 의존하지 않는 일반 메서드입니다.

23.1.1.1 Array ( ...values )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 newTarget을 활성 함수 객체로 둡니다. 그렇지 않으면 newTarget을 NewTarget으로 둡니다.
  2. proto를 ? GetPrototypeFromConstructor(newTarget, "%Array.prototype%")로 둡니다.
  3. numberOfArgs를 values의 요소 수로 둡니다.
  4. numberOfArgs = 0이면 ! ArrayCreate(0, proto)를 반환합니다.
  5. numberOfArgs = 1이면, 다음을 수행합니다.
    1. length를 values[0]으로 둡니다.
    2. array를 ! ArrayCreate(0, proto)로 둡니다.
    3. length가 Number가 아니면, 다음을 수행합니다.
      1. ! CreateDataPropertyOrThrow(array, "0", length)를 수행합니다.
      2. intLength를 1𝔽로 둡니다.
    4. 그렇지 않으면,
      1. intLength를 ! ToUint32(length)로 둡니다.
      2. SameValueZero(intLength, length)가 false이면 RangeError 예외를 던집니다.
    5. ! Set(array, "length", intLength, true)를 수행합니다.
    6. array를 반환합니다.
  6. 단언: numberOfArgs ≥ 2입니다.
  7. array를 ? ArrayCreate(numberOfArgs, proto)로 둡니다.
  8. k를 0으로 둡니다.
  9. k < numberOfArgs인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. itemK를 values[k]로 둡니다.
    3. ! CreateDataPropertyOrThrow(array, propertyKey, itemK)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  10. 단언: array의 "length" 프로퍼티의 수학적 값은 numberOfArgs입니다.
  11. array를 반환합니다.

23.1.2 Array 생성자의 프로퍼티

Array 생성자는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 1𝔽인 "length" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. ctor를 this 값으로 둡니다.
  2. mapper가 undefined이면, 다음을 수행합니다.
    1. mapping을 false로 둡니다.
  3. 그렇지 않으면,
    1. IsCallable(mapper)가 false이면 TypeError 예외를 던집니다.
    2. mapping을 true로 둡니다.
  4. usingIterator를 ? GetMethod(items, %Symbol.iterator%)로 둡니다.
  5. usingIterator가 undefined가 아니면, 다음을 수행합니다.
    1. IsConstructor(ctor)가 true이면, 다음을 수행합니다.
      1. array를 ? Construct(ctor)로 둡니다.
    2. 그렇지 않으면,
      1. array를 ! ArrayCreate(0)으로 둡니다.
    3. iteratorRecord를 ? GetIteratorFromMethod(items, usingIterator)로 둡니다.
    4. k를 0으로 둡니다.
    5. 다음을 반복합니다.
      1. k ≥ 253 - 1이면, 다음을 수행합니다.
        1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
        2. ? IteratorClose(iteratorRecord, error)를 반환합니다.
      2. propertyKey를 ! ToString(𝔽(k))로 둡니다.
      3. next를 ? IteratorStepValue(iteratorRecord)로 둡니다.
      4. next가 done이면, 다음을 수행합니다.
        1. ? Set(array, "length", 𝔽(k), true)를 수행합니다.
        2. array를 반환합니다.
      5. mapping이 true이면, 다음을 수행합니다.
        1. mappedValue를 Completion(Call(mapper, thisArg, « next, 𝔽(k) »))로 둡니다.
        2. IfAbruptCloseIterator(mappedValue, iteratorRecord).
      6. 그렇지 않으면,
        1. mappedValue를 next로 둡니다.
      7. defineStatus를 Completion(CreateDataPropertyOrThrow(array, propertyKey, mappedValue))로 둡니다.
      8. IfAbruptCloseIterator(defineStatus, iteratorRecord).
      9. k를 k + 1로 설정합니다.
  6. 참고: items는 반복 가능하지 않으므로 배열과 유사한 객체라고 가정합니다.
  7. arrayLike를 ! ToObject(items)로 둡니다.
  8. length를 ? LengthOfArrayLike(arrayLike)로 둡니다.
  9. IsConstructor(ctor)가 true이면, 다음을 수행합니다.
    1. array를 ? Construct(ctor, « 𝔽(length) »)로 둡니다.
  10. 그렇지 않으면,
    1. array를 ? ArrayCreate(length)로 둡니다.
  11. k를 0으로 둡니다.
  12. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kValue를 ? Get(arrayLike, propertyKey)로 둡니다.
    3. mapping이 true이면, 다음을 수행합니다.
      1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 둡니다.
    4. 그렇지 않으면,
      1. mappedValue를 kValue로 둡니다.
    5. ? CreateDataPropertyOrThrow(array, propertyKey, mappedValue)를 수행합니다.
    6. k를 k + 1로 설정합니다.
  13. ? Set(array, "length", 𝔽(length), true)를 수행합니다.
  14. array를 반환합니다.
참고

이 메서드는 의도적으로 일반적인 팩터리 메서드이며 this 값이 Array 생성자일 것을 요구하지 않습니다. 따라서 단일 숫자 인수로 호출할 수 있는 다른 모든 생성자로 옮기거나 그러한 생성자가 상속할 수 있습니다.

23.1.2.2 Array.fromAsync ( items [ , mapper [ , thisArg ] ] )

이 비동기 함수는 호출되면 다음 단계를 수행합니다:

  1. ctor를 this 값으로 둡니다.
  2. mapping을 false로 둡니다.
  3. mapper가 undefined가 아니면, 다음을 수행합니다.
    1. IsCallable(mapper)가 false이면 TypeError 예외를 던집니다.
    2. mapping을 true로 설정합니다.
  4. iteratorRecord를 undefined로 둡니다.
  5. usingAsyncIterator를 ? GetMethod(items, %Symbol.asyncIterator%)로 둡니다.
  6. usingAsyncIterator가 undefined이면, 다음을 수행합니다.
    1. usingSyncIterator를 ? GetMethod(items, %Symbol.iterator%)로 둡니다.
    2. usingSyncIterator가 undefined가 아니면, 다음을 수행합니다.
      1. iteratorRecord를 CreateAsyncFromSyncIterator(? GetIteratorFromMethod(items, usingSyncIterator))로 설정합니다.
  7. 그렇지 않으면,
    1. iteratorRecord를 ? GetIteratorFromMethod(items, usingAsyncIterator)로 설정합니다.
  8. iteratorRecord가 undefined가 아니면, 다음을 수행합니다.
    1. IsConstructor(ctor)가 true이면, 다음을 수행합니다.
      1. array를 ? Construct(ctor)로 둡니다.
    2. 그렇지 않으면,
      1. array를 ! ArrayCreate(0)으로 둡니다.
    3. k를 0으로 둡니다.
    4. 다음을 반복합니다.
      1. k ≥ 253 - 1이면, 다음을 수행합니다.
        1. error를 ThrowCompletion(새로 생성된 TypeError 객체)로 둡니다.
        2. ? AsyncIteratorClose(iteratorRecord, error)를 반환합니다.
      2. propertyKey를 ! ToString(𝔽(k))로 둡니다.
      3. nextResult를 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])로 둡니다.
      4. nextResult를 ? Await(nextResult)로 설정합니다.
      5. nextResult가 Object가 아니면 TypeError 예외를 던집니다.
      6. done을 ? IteratorComplete(nextResult)로 둡니다.
      7. done이 true이면, 다음을 수행합니다.
        1. ? Set(array, "length", 𝔽(k), true)를 수행합니다.
        2. array를 반환합니다.
      8. nextValue를 ? IteratorValue(nextResult)로 둡니다.
      9. mapping이 true이면, 다음을 수행합니다.
        1. mappedValue를 Completion(Call(mapper, thisArg, « nextValue, 𝔽(k) »))로 둡니다.
        2. IfAbruptCloseAsyncIterator(mappedValue, iteratorRecord).
        3. mappedValue를 Completion(Await(mappedValue))로 설정합니다.
        4. IfAbruptCloseAsyncIterator(mappedValue, iteratorRecord).
      10. 그렇지 않으면,
        1. mappedValue를 nextValue로 둡니다.
      11. defineStatus를 Completion(CreateDataPropertyOrThrow(array, propertyKey, mappedValue))로 둡니다.
      12. IfAbruptCloseAsyncIterator(defineStatus, iteratorRecord).
      13. k를 k + 1로 설정합니다.
  9. 그렇지 않으면,
    1. 참고: items는 비동기 반복 가능 객체도 반복 가능 객체도 아니므로 배열과 유사한 객체라고 가정합니다.
    2. arrayLike를 ! ToObject(items)로 둡니다.
    3. length를 ? LengthOfArrayLike(arrayLike)로 둡니다.
    4. IsConstructor(ctor)가 true이면, 다음을 수행합니다.
      1. array를 ? Construct(ctor, « 𝔽(length) »)로 둡니다.
    5. 그렇지 않으면,
      1. array를 ? ArrayCreate(length)로 둡니다.
    6. k를 0으로 둡니다.
    7. k < length인 동안 다음을 반복합니다.
      1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
      2. kValue를 ? Get(arrayLike, propertyKey)로 둡니다.
      3. kValue를 ? Await(kValue)로 설정합니다.
      4. mapping이 true이면, 다음을 수행합니다.
        1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 둡니다.
        2. mappedValue를 ? Await(mappedValue)로 설정합니다.
      5. 그렇지 않으면,
        1. mappedValue를 kValue로 둡니다.
      6. ? CreateDataPropertyOrThrow(array, propertyKey, mappedValue)를 수행합니다.
      7. k를 k + 1로 설정합니다.
    8. ? Set(array, "length", 𝔽(length), true)를 수행합니다.
    9. array를 반환합니다.
참고

이 메서드는 의도적으로 일반적인 팩터리 메서드이며 this 값이 Array 생성자일 것을 요구하지 않습니다. 따라서 단일 숫자 인수로 호출할 수 있는 다른 모든 생성자로 옮기거나 그러한 생성자가 상속할 수 있습니다.

23.1.2.3 Array.isArray ( arg )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. ? IsArray(arg)를 반환합니다.

23.1.2.4 Array.of ( ...items )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. length를 items의 요소 수로 둡니다.
  2. lengthNumber를 𝔽(length)로 둡니다.
  3. ctor를 this 값으로 둡니다.
  4. IsConstructor(ctor)가 true이면, 다음을 수행합니다.
    1. array를 ? Construct(ctor, « lengthNumber »)로 둡니다.
  5. 그렇지 않으면,
    1. array를 ? ArrayCreate(length)로 둡니다.
  6. k를 0으로 둡니다.
  7. k < length인 동안 다음을 반복합니다.
    1. kValue를 items[k]로 둡니다.
    2. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    3. ? CreateDataPropertyOrThrow(array, propertyKey, kValue)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  8. ? Set(array, "length", lengthNumber, true)를 수행합니다.
  9. array를 반환합니다.
참고

이 메서드는 의도적으로 일반적인 팩터리 메서드이며 this 값이 Array 생성자일 것을 요구하지 않습니다. 따라서 단일 숫자 인수로 호출할 수 있는 다른 생성자로 옮기거나 그러한 생성자가 상속할 수 있습니다.

23.1.2.5 Array.prototype

Array.prototype의 값은 Array 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

23.1.2.6 get Array [ %Symbol.species% ]

Array[%Symbol.species%]는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

Array 프로토타입 메서드는 일반적으로 this 값의 생성자를 사용하여 파생 객체를 생성합니다. 그러나 하위 클래스 생성자는 자신의 %Symbol.species% 프로퍼티를 재정의하여 이 기본 동작을 재정의할 수 있습니다.

23.1.3 Array 프로토타입 객체의 프로퍼티

Array 프로토타입 객체는:

  • %Array.prototype%입니다.
  • Array 특수 객체이며 그러한 객체에 지정된 내부 메서드를 갖습니다.
  • 초기 값이 +0𝔽이고 속성이 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }인 "length" 프로퍼티를 갖습니다.
  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
참고

Array 프로토타입 객체가 Array 특수 객체로 지정된 것은 ECMAScript 2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위한 것입니다.

23.1.3.1 Array.prototype.at ( index )

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. k를 ? ToAbsoluteIndex(index, length)로 둡니다.
  4. k < 0 또는 k ≥ length이면 undefined를 반환합니다.
  5. ? Get(obj, ! ToString(𝔽(k)))를 반환합니다.

23.1.3.2 Array.prototype.concat ( ...items )

이 메서드는 객체의 배열 요소 뒤에 각 인수의 배열 요소가 이어지는 배열을 반환합니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. array를 ? ArraySpeciesCreate(obj, 0)으로 둡니다.
  3. nextIndex를 0으로 둡니다.
  4. obj를 items의 앞에 추가합니다.
  5. items의 각 요소 item에 대해 다음을 수행합니다.
    1. spreadable을 ? IsConcatSpreadable(item)로 둡니다.
    2. spreadable이 true이면, 다음을 수행합니다.
      1. length를 ? LengthOfArrayLike(item)로 둡니다.
      2. nextIndex + length > 253 - 1이면 TypeError 예외를 던집니다.
      3. sourceIndex를 0으로 둡니다.
      4. sourceIndex < length인 동안 다음을 반복합니다.
        1. propertyKey를 ! ToString(𝔽(sourceIndex))로 둡니다.
        2. exists를 ? HasProperty(item, propertyKey)로 둡니다.
        3. exists가 true이면, 다음을 수행합니다.
          1. subElement를 ? Get(item, propertyKey)로 둡니다.
          2. ? CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), subElement)를 수행합니다.
        4. nextIndex를 nextIndex + 1로 설정합니다.
        5. sourceIndex를 sourceIndex + 1로 설정합니다.
    3. 그렇지 않으면,
      1. 참고: item은 펼쳐지지 않고 단일 항목으로 추가됩니다.
      2. nextIndex ≥ 253 - 1이면 TypeError 예외를 던집니다.
      3. ? CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), item)을 수행합니다.
      4. nextIndex를 nextIndex + 1로 설정합니다.
  6. ? Set(array, "length", 𝔽(nextIndex), true)를 수행합니다.
  7. array를 반환합니다.

이 메서드의 "length" 프로퍼티는 1𝔽입니다.

참고 1

6 단계에서 "length" 프로퍼티를 명시적으로 설정하는 것은 items의 마지막 비어 있지 않은 요소 뒤에 빈 슬롯이 있거나 array가 내장 Array가 아닌 경우에도 길이가 올바르도록 보장하기 위한 것입니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.2.1 IsConcatSpreadable ( obj )

추상 연산 IsConcatSpreadable. 인수 obj (ECMAScript 언어 값). 반환값: (정상 완료 (값: Boolean) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. obj가 Object가 아니면 false를 반환합니다.
  2. spreadable을 ? Get(obj, %Symbol.isConcatSpreadable%)로 둡니다.
  3. spreadable이 undefined가 아니면 ToBoolean(spreadable)을 반환합니다.
  4. ? IsArray(obj)를 반환합니다.

23.1.3.3 Array.prototype.constructor

Array.prototype.constructor의 초기 값은 %Array%입니다.

23.1.3.4 Array.prototype.copyWithin ( target, start [ , end ] )

참고 1

end 인수는 선택 사항입니다. 제공되지 않으면 this 값의 길이를 사용합니다.

참고 2

target이 음수이면 배열의 길이인 length에 대해 length + target으로 처리합니다. start가 음수이면 length + start로 처리합니다. end가 음수이면 length + end로 처리합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. to를 ? ToClampedIndex(target, length)로 둡니다.
  4. from을 ? ToClampedIndex(start, length)로 둡니다.
  5. end가 undefined이면 final을 length로 둡니다. 그렇지 않으면 final을 ? ToClampedIndex(end, length)로 둡니다.
  6. count를 min(final - from, length - to)로 둡니다.
  7. from < to이고 to < from + count이면, 다음을 수행합니다.
    1. direction을 -1로 둡니다.
    2. from을 from + count - 1로 설정합니다.
    3. to를 to + count - 1로 설정합니다.
  8. 그렇지 않으면,
    1. direction을 1로 둡니다.
  9. count > 0인 동안 다음을 반복합니다.
    1. fromKey를 ! ToString(𝔽(from))로 둡니다.
    2. toKey를 ! ToString(𝔽(to))로 둡니다.
    3. fromPresent를 ? HasProperty(obj, fromKey)로 둡니다.
    4. fromPresent가 true이면, 다음을 수행합니다.
      1. fromValue를 ? Get(obj, fromKey)로 둡니다.
      2. ? Set(obj, toKey, fromValue, true)를 수행합니다.
    5. 그렇지 않으면,
      1. 단언: fromPresent는 false입니다.
      2. ? DeletePropertyOrThrow(obj, toKey)를 수행합니다.
    6. from을 from + direction으로 설정합니다.
    7. to를 to + direction으로 설정합니다.
    8. count를 count - 1로 설정합니다.
  10. obj를 반환합니다.
참고 3

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.5 Array.prototype.entries ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. CreateArrayIterator(obj, key+value)를 반환합니다.

23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )

참고 1

callback은 세 인수를 받고 Boolean 값으로 강제 변환할 수 있는 값을 반환하는 함수여야 합니다. every는 callback이 false를 반환하는 요소를 찾을 때까지 배열에 실제로 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출합니다. 그러한 요소를 찾으면 every는 즉시 false를 반환합니다. 그렇지 않으면 every는 true를 반환합니다. callback은 배열에 실제로 존재하는 요소에 대해서만 호출되며, 존재하지 않는 요소에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공되면 callback을 호출할 때마다 this 값으로 사용됩니다. 제공되지 않으면 대신 undefined를 사용합니다.

callback은 요소의 값, 요소의 인덱스, 순회 중인 객체라는 세 인수로 호출됩니다.

every는 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

every가 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. every 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 every가 해당 요소를 방문할 때의 값입니다. every 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다. every는 수학의 “모든 것에 대해” 한정자처럼 동작합니다. 특히 빈 배열에서는 true를 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. k를 0으로 둡니다.
  5. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. testResult를 ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »))로 둡니다.
      3. testResult가 false이면 false를 반환합니다.
    4. k를 k + 1로 설정합니다.
  6. true를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.7 Array.prototype.fill ( value [ , start [ , end ] ] )

참고 1

start 인수는 선택 사항입니다. 제공되지 않으면 +0𝔽을 사용합니다.

end 인수는 선택 사항입니다. 제공되지 않으면 this 값의 길이를 사용합니다.

참고 2

start가 음수이면 배열의 길이인 length에 대해 length + start로 처리합니다. end가 음수이면 length + end로 처리합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. k를 ? ToClampedIndex(start, length)로 둡니다.
  4. end가 undefined이면 final을 length로 둡니다. 그렇지 않으면 final을 ? ToClampedIndex(end, length)로 둡니다.
  5. k < final인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. ? Set(obj, propertyKey, value, true)를 수행합니다.
    3. k를 k + 1로 설정합니다.
  6. obj를 반환합니다.
참고 3

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )

참고 1

callback은 세 인수를 받고 Boolean 값으로 강제 변환할 수 있는 값을 반환하는 함수여야 합니다. filter는 배열의 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하고 callback이 true를 반환한 모든 값으로 새로운 배열을 구성합니다. callback은 배열에 실제로 존재하는 요소에 대해서만 호출되며, 존재하지 않는 요소에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공되면 callback을 호출할 때마다 this 값으로 사용됩니다. 제공되지 않으면 대신 undefined를 사용합니다.

callback은 요소의 값, 요소의 인덱스, 순회 중인 객체라는 세 인수로 호출됩니다.

filter는 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

filter가 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. filter 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 filter가 해당 요소를 방문할 때의 값입니다. filter 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. array를 ? ArraySpeciesCreate(obj, 0)으로 둡니다.
  5. k를 0으로 둡니다.
  6. to를 0으로 둡니다.
  7. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. selected를 ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »))로 둡니다.
      3. selected가 true이면, 다음을 수행합니다.
        1. ? CreateDataPropertyOrThrow(array, ! ToString(𝔽(to)), kValue)를 수행합니다.
        2. to를 to + 1로 설정합니다.
    4. k를 k + 1로 설정합니다.
  8. array를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )

참고 1

이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 인덱스 오름차순으로 predicate를 한 번씩 호출합니다. 그러한 요소를 찾으면 find는 즉시 해당 요소 값을 반환합니다. 그렇지 않으면 find는 undefined를 반환합니다.

추가 정보는 FindViaPredicate를 참조하시기 바랍니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. findRecord를 ? FindViaPredicate(obj, length, ascending, predicate, thisArg)로 둡니다.
  4. findRecord.[[Value]]를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )

참고 1

이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 인덱스 오름차순으로 predicate를 한 번씩 호출합니다. 그러한 요소를 찾으면 findIndex는 즉시 해당 요소 값의 인덱스를 반환합니다. 그렇지 않으면 findIndex는 -1을 반환합니다.

추가 정보는 FindViaPredicate를 참조하시기 바랍니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. findRecord를 ? FindViaPredicate(obj, length, ascending, predicate, thisArg)로 둡니다.
  4. findRecord.[[Index]]를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )

참고 1

이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 인덱스 내림차순으로 predicate를 한 번씩 호출합니다. 그러한 요소를 찾으면 findLast는 즉시 해당 요소 값을 반환합니다. 그렇지 않으면 findLast는 undefined를 반환합니다.

추가 정보는 FindViaPredicate를 참조하시기 바랍니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. findRecord를 ? FindViaPredicate(obj, length, descending, predicate, thisArg)로 둡니다.
  4. findRecord.[[Value]]를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )

참고 1

이 메서드는 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 배열의 각 요소에 대해 인덱스 내림차순으로 predicate를 한 번씩 호출합니다. 그러한 요소를 찾으면 findLastIndex는 즉시 해당 요소 값의 인덱스를 반환합니다. 그렇지 않으면 findLastIndex는 -1을 반환합니다.

추가 정보는 FindViaPredicate를 참조하시기 바랍니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. findRecord를 ? FindViaPredicate(obj, length, descending, predicate, thisArg)로 둡니다.
  4. findRecord.[[Index]]를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array 객체일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.12.1 FindViaPredicate ( obj, length, direction, predicate, thisArg )

추상 연산 FindViaPredicate. 인수 obj (Object), length (음이 아닌 정수), direction ((ascending 또는 descending)), predicate (ECMAScript 언어 값) 및 thisArg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 레코드 (필드: [[Index]] (정수인 Number), [[Value]] (ECMAScript 언어 값))) 또는 throw 완료).

obj는 배열과 유사한 객체 또는 TypedArray여야 합니다. 이 연산은 predicate가 true로 강제 변환되는 값을 반환하는 요소를 찾을 때까지 direction이 나타내는 대로 인덱스 오름차순 또는 내림차순으로 obj의 각 요소에 대해 predicate를 한 번씩 호출합니다. 그러한 요소를 찾으면 이 연산은 찾은 요소의 인덱스와 값을 제공하는 Record를 반환합니다. 그러한 요소를 찾지 못하면 인덱스에 -1𝔽, 값에 undefined를 지정하는 Record를 반환합니다.

predicate는 함수여야 합니다. 배열의 요소에 대해 호출되면 요소의 값, 요소의 인덱스, 순회 중인 객체라는 세 인수가 전달됩니다. 반환 값은 Boolean 값으로 강제 변환됩니다.

thisArg는 predicate를 호출할 때마다 this 값으로 사용됩니다.

이 연산은 호출된 객체를 직접 변경하지 않지만 predicate 호출에 의해 객체가 변경될 수 있습니다.

처리할 요소의 범위는 순회가 시작되기 직전, predicate을 처음 호출하기 전에 설정됩니다. 그 후 배열에 추가된 요소는 predicate이 방문하지 않습니다. 배열의 기존 요소가 변경되면 predicate에 전달되는 값은 이 연산이 해당 요소를 방문할 때의 값입니다. 순회가 시작된 후 방문되기 전에 삭제된 요소도 여전히 방문되며, 프로토타입에서 조회되거나 undefined가 됩니다.

호출되면 다음 단계를 수행한다.

  1. IsCallable(predicate)이 false이면 TypeError 예외를 던집니다.
  2. direction이 ascending이면, 다음을 수행합니다.
    1. indices를 0(포함)부터 length(제외)까지의 구간에 속하는 정수를 오름차순으로 포함하는 List로 둡니다.
  3. 그렇지 않으면,
    1. indices를 0(포함)부터 length(제외)까지의 구간에 속하는 정수를 내림차순으로 포함하는 List로 둡니다.
  4. indices의 각 정수 k에 대해 다음을 수행합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. 참고: obj가 TypedArray이면 다음 Get 호출은 정상 완료를 반환합니다.
    3. kValue를 ? Get(obj, propertyKey)로 둡니다.
    4. testResult를 ? Call(predicate, thisArg, « kValue, 𝔽(k), obj »)로 둡니다.
    5. ToBoolean(testResult)가 true이면 Record { [[Index]]: 𝔽(k), [[Value]]: kValue }를 반환합니다.
  5. Record { [[Index]]: -1𝔽, [[Value]]: undefined }를 반환합니다.

23.1.3.13 Array.prototype.flat ( [ depth ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. sourceLength를 ? LengthOfArrayLike(obj)로 둡니다.
  3. depthNumber를 1로 둡니다.
  4. depth가 undefined가 아니면, 다음을 수행합니다.
    1. depthNumber를 ? ToIntegerOrInfinity(depth)로 설정합니다.
    2. depthNumber < 0이면 depthNumber를 0으로 설정합니다.
  5. array를 ? ArraySpeciesCreate(obj, 0)으로 둡니다.
  6. ? FlattenIntoArray(array, obj, sourceLength, 0, depthNumber)를 수행합니다.
  7. array를 반환합니다.

23.1.3.13.1 FlattenIntoArray ( target, source, sourceLength, start, depth [ , mapperFunc [ , thisArg ] ] )

추상 연산 FlattenIntoArray. 인수 target (Object), source (Object), sourceLength (음이 아닌 정수), start (음이 아닌 정수) 및 depth ((음이 아닌 정수 또는 +∞)) 및 선택적 인수 mapperFunc (함수 객체) 및 thisArg (ECMAScript 언어 값). 반환값: (정상 완료 (값: 음이 아닌 정수) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. 단언: mapperFunc가 존재하면 IsCallable(mapperFunc)은 true이고, thisArg가 존재하며, depth는 1입니다.
  2. targetIndex를 start로 둡니다.
  3. sourceIndex를 0으로 둡니다.
  4. sourceIndex < sourceLength인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(sourceIndex))로 둡니다.
    2. exists를 ? HasProperty(source, propertyKey)로 둡니다.
    3. exists가 true이면, 다음을 수행합니다.
      1. element를 ? Get(source, propertyKey)로 둡니다.
      2. mapperFunc가 존재하면, 다음을 수행합니다.
        1. element를 ? Call(mapperFunc, thisArg, « element, 𝔽(sourceIndex), source »)로 설정합니다.
      3. shouldFlatten을 false로 둡니다.
      4. depth > 0이면, 다음을 수행합니다.
        1. shouldFlatten을 ? IsArray(element)로 설정합니다.
      5. shouldFlatten이 true이면, 다음을 수행합니다.
        1. depth = +∞이면 newDepth를 +∞로 둡니다.
        2. 그렇지 않으면 newDepth를 depth - 1로 둡니다.
        3. elementLength를 ? LengthOfArrayLike(element)로 둡니다.
        4. targetIndex를 ? FlattenIntoArray(target, element, elementLength, targetIndex, newDepth)로 설정합니다.
      6. 그렇지 않으면,
        1. targetIndex ≥ 253 - 1이면 TypeError 예외를 던집니다.
        2. ? CreateDataPropertyOrThrow(target, ! ToString(𝔽(targetIndex)), element)를 수행합니다.
        3. targetIndex를 targetIndex + 1로 설정합니다.
    4. sourceIndex를 sourceIndex + 1로 설정합니다.
  5. targetIndex를 반환합니다.

23.1.3.14 Array.prototype.flatMap ( mapperFunc [ , thisArg ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. sourceLength를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(mapperFunc)이 false이면 TypeError 예외를 던집니다.
  4. array를 ? ArraySpeciesCreate(obj, 0)으로 둡니다.
  5. ? FlattenIntoArray(array, obj, sourceLength, 0, 1, mapperFunc, thisArg)를 수행합니다.
  6. array를 반환합니다.

23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )

참고 1

callback은 세 인수를 받는 함수여야 합니다. forEach는 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출합니다. callback은 배열에 실제로 존재하는 요소에 대해서만 호출되며, 존재하지 않는 요소에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공되면 callback을 호출할 때마다 this 값으로 사용됩니다. 제공되지 않으면 대신 undefined를 사용합니다.

callback은 요소의 값, 요소의 인덱스, 순회 중인 객체라는 세 인수로 호출됩니다.

forEach는 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

forEach가 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. forEach 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 forEach가 해당 요소를 방문할 때의 값입니다. forEach 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. k를 0으로 둡니다.
  5. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. ? Call(callback, thisArg, « kValue, 𝔽(k), obj »)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  6. undefined를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )

참고 1

이 메서드는 SameValueZero 알고리즘을 사용하여 searchElement를 배열의 요소와 오름차순으로 비교하고, 어느 위치에서든 찾으면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

선택적 두 번째 인수 fromIndex의 기본값은 +0𝔽입니다(즉, 전체 배열을 검색합니다). 배열의 길이 이상이면 false를 반환하며, 즉 배열을 검색하지 않습니다. -0𝔽보다 작으면 배열 끝에서의 오프셋으로 사용하여 fromIndex를 계산합니다. 계산된 인덱스가 +0𝔽 이하이면 전체 배열을 검색합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. length = 0이면 false를 반환합니다.
  4. k를 ? ToClampedIndex(fromIndex, length)로 둡니다.
  5. k < length인 동안 다음을 반복합니다.
    1. elementK를 ? Get(obj, ! ToString(𝔽(k)))로 둡니다.
    2. SameValueZero(searchElement, elementK)가 true이면 true를 반환합니다.
    3. k를 k + 1로 설정합니다.
  6. false를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

참고 3

이 메서드는 유사한 indexOf 메서드와 의도적으로 두 가지 점에서 다릅니다. 첫째, IsStrictlyEqual 대신 SameValueZero 알고리즘을 사용하므로 NaN 배열 요소를 감지할 수 있습니다. 둘째, 존재하지 않는 배열 요소를 건너뛰지 않고 undefined로 처리합니다.

23.1.3.17 Array.prototype.indexOf ( searchElement [ , fromIndex ] )

이 메서드는 IsStrictlyEqual 알고리즘을 사용하여 searchElement를 배열의 요소와 오름차순으로 비교하고, 하나 이상의 인덱스에서 찾으면 그러한 인덱스 중 가장 작은 값을 반환합니다. 그렇지 않으면 -1𝔽을 반환합니다.

참고 1

선택적 두 번째 인수 fromIndex의 기본값은 +0𝔽입니다(즉, 전체 배열을 검색합니다). 배열의 길이 이상이면 -1𝔽을 반환하며, 즉 배열을 검색하지 않습니다. -0𝔽보다 작으면 배열 끝에서의 오프셋을 계산하는 데 사용합니다. 계산된 인덱스가 +0𝔽 이하이면 전체 배열을 검색합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. length = 0이면 -1𝔽을 반환합니다.
  4. k를 ? ToClampedIndex(fromIndex, length)로 둡니다.
  5. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. elementK를 ? Get(obj, propertyKey)로 둡니다.
      2. IsStrictlyEqual(searchElement, elementK)가 true이면 𝔽(k)를 반환합니다.
    4. k를 k + 1로 설정합니다.
  6. -1𝔽을 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.18 Array.prototype.join ( separator )

이 메서드는 배열의 요소를 String으로 변환한 다음 separator가 나타나는 것으로 구분하여 이러한 String을 연결합니다. 구분자를 제공하지 않으면 하나의 쉼표를 구분자로 사용합니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. separator가 undefined이면 separatorString을 ","로 둡니다; 그렇지 않으면 separatorString을 ? ToString(separator)으로 둡니다.
  4. ? JoinIndexedProperties(obj, length, separatorString)를 반환합니다.
참고

이 메서드는 의도적으로 범용적으로 설계되었으며, this 값이 Array일 필요는 없습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.18.1 JoinIndexedProperties ( obj, length, separator [ , methodName [ , methodArgs ] ] )

추상 연산 JoinIndexedProperties. 인수 obj (Object), length (음이 아닌 정수) 및 separator (String) 및 선택적 인수 methodName (프로퍼티 키) 및 methodArgs (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: String) 또는 throw 완료). 0부터 length - 1까지 양 끝을 포함하는 구간에 있는 obj의 정수 인덱스 속성을 String으로 변환한 다음(선택적으로 메서드 호출을 통해), 각 String 사이에 구분자 String을 삽입하여 연결합니다. 호출되면 다음 단계를 수행한다.

  1. methodName이 제공되고 methodArgs가 제공되지 않았으면 methodArgs를 새로운 빈 List로 설정합니다.
  2. result를 빈 String으로 둡니다.
  3. k를 0으로 둡니다.
  4. k < length인 동안 다음 단계를 반복합니다,
    1. k > 0이면 result를 result와 separator를 연결한 문자열로 설정합니다.
    2. 참고: obj가 TypedArray인 경우 다음 Get 호출은 정상 완료를 반환합니다.
    3. element를 ? Get(obj, ! ToString(𝔽(k)))으로 둡니다.
    4. element가 undefined도 null도 아니면 다음을 수행합니다.
      1. methodName이 제공된 경우 다음을 수행합니다.
        1. elementString을 ? ToString(? Invoke(element, methodName, methodArgs))으로 둡니다.
      2. 그렇지 않으면,
        1. 참고: obj가 TypedArray인 경우 다음 ToString 호출은 정상 완료를 반환합니다.
        2. elementString을 ? ToString(element)으로 둡니다.
      3. result를 result와 elementString을 연결한 문자열로 설정합니다.
    5. k를 k + 1로 설정합니다.
  5. result를 반환합니다.
참고

methodArgs 매개변수는 ECMA-402와 같이 이 연산에 의존하는 다른 명세에서 사용하기 위한 것입니다.

23.1.3.19 Array.prototype.keys ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. CreateArrayIterator(obj, key)를 반환합니다.

23.1.3.20 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

참고 1

이 메서드는 IsStrictlyEqual 알고리즘을 사용하여 searchElement를 배열의 요소와 내림차순으로 비교하고, 하나 이상의 인덱스에서 찾으면 그러한 인덱스 중 가장 큰 값을 반환합니다. 그렇지 않으면 -1𝔽을 반환합니다.

선택적 두 번째 인수 fromIndex의 기본값은 배열의 길이에서 1을 뺀 값입니다(즉, 전체 배열을 검색합니다). 배열의 길이 이상이면 전체 배열을 검색합니다. -0𝔽보다 작으면 배열 끝에서의 오프셋을 계산하는 데 사용합니다. 계산된 인덱스가 -0𝔽보다 작으면 -1𝔽을 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. length = 0이면 -1𝔽을 반환합니다.
  4. fromIndex가 존재하지 않으면 k를 length - 1로 둡니다. 그렇지 않으면 k를 min(? ToAbsoluteIndex(fromIndex, length), length - 1)로 둡니다.
  5. k ≥ 0인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. elementK를 ? Get(obj, propertyKey)로 둡니다.
      2. IsStrictlyEqual(searchElement, elementK)가 true이면 𝔽(k)를 반환합니다.
    4. k를 k - 1로 설정합니다.
  6. -1𝔽을 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )

참고 1

callback은 세 인수를 받는 함수여야 합니다. map은 배열의 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하고 그 결과로 새로운 Array를 구성합니다. callback은 배열에 실제로 존재하는 요소에 대해서만 호출되며, 존재하지 않는 요소에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공되면 callback을 호출할 때마다 this 값으로 사용됩니다. 제공되지 않으면 대신 undefined를 사용합니다.

callback은 요소의 값, 요소의 인덱스, 순회 중인 객체라는 세 인수로 호출됩니다.

map은 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

map이 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. map 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 map이 해당 요소를 방문할 때의 값입니다. map 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. array를 ? ArraySpeciesCreate(obj, length)로 둡니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. mappedValue를 ? Call(callback, thisArg, « kValue, 𝔽(k), obj »)로 둡니다.
      3. ? CreateDataPropertyOrThrow(array, propertyKey, mappedValue)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  7. array를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.22 Array.prototype.pop ( )

참고 1

이 메서드는 배열의 마지막 요소를 제거하고 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. length = 0이면, 다음을 수행합니다.
    1. ? Set(obj, "length", +0𝔽, true)를 수행합니다.
    2. undefined를 반환합니다.
  4. 단언: length > 0입니다.
  5. newLength를 𝔽(length - 1)로 둡니다.
  6. index를 ! ToString(newLength)로 둡니다.
  7. element를 ? Get(obj, index)로 둡니다.
  8. ? DeletePropertyOrThrow(obj, index)를 수행합니다.
  9. ? Set(obj, "length", newLength, true)를 수행합니다.
  10. element를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.23 Array.prototype.push ( ...items )

참고 1

이 메서드는 인수를 나타나는 순서대로 배열의 끝에 추가합니다. 배열의 새로운 길이를 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. argCount를 items의 요소 수로 둡니다.
  4. length + argCount > 253 - 1이면 TypeError 예외를 던집니다.
  5. items의 각 요소 item에 대해 다음을 수행합니다.
    1. ? Set(obj, ! ToString(𝔽(length)), item, true)를 수행합니다.
    2. length를 length + 1로 설정합니다.
  6. ? Set(obj, "length", 𝔽(length), true)를 수행합니다.
  7. 𝔽(length)를 반환합니다.

이 메서드의 "length" 프로퍼티는 1𝔽입니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )

참고 1

callback은 네 인수를 받는 함수여야 합니다. reduce는 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하며, initialValue가 제공되지 않은 경우 첫 번째 요소를 건너뜁니다.

callback은 previousValue(callback을 이전에 호출한 결과 값), currentValue(현재 요소의 값), currentIndex, 순회 중인 객체라는 네 인수로 호출됩니다. callback이 처음 호출될 때 previousValue와 currentValue는 두 가지 경우 중 하나가 될 수 있습니다. reduce 호출에 initialValue가 제공되었다면 previousValue는 initialValue이고 currentValue는 배열의 첫 번째 값입니다. initialValue가 제공되지 않았다면 previousValue는 배열의 첫 번째 값이고 currentValue는 두 번째 값입니다. 배열에 요소가 없고 initialValue가 제공되지 않으면 TypeError입니다.

reduce는 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

reduce가 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. reduce 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 reduce가 해당 요소를 방문할 때의 값입니다. reduce 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. length = 0이고 initialValue가 존재하지 않으면 TypeError 예외를 던집니다.
  5. k를 0으로 둡니다.
  6. accumulator를 undefined로 둡니다.
  7. initialValue가 존재하면, 다음을 수행합니다.
    1. accumulator를 initialValue로 설정합니다.
  8. 그렇지 않으면,
    1. kPresent를 false로 둡니다.
    2. kPresent가 false이고 k < length인 동안 다음을 반복합니다.
      1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
      2. kPresent를 ? HasProperty(obj, propertyKey)로 설정합니다.
      3. kPresent가 true이면, 다음을 수행합니다.
        1. accumulator를 ? Get(obj, propertyKey)로 설정합니다.
      4. k를 k + 1로 설정합니다.
    3. kPresent가 false이면 TypeError 예외를 던집니다.
  9. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj »)로 설정합니다.
    4. k를 k + 1로 설정합니다.
  10. accumulator를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )

참고 1

callback은 네 인수를 받는 함수여야 합니다. reduceRight는 배열에 존재하는 각 요소에 대해 내림차순으로 callback을 한 번씩 호출하며, initialValue가 제공되지 않은 경우 첫 번째 호출을 건너뜁니다.

callback은 previousValue(callback을 이전에 호출한 결과 값), currentValue(현재 요소의 값), currentIndex, 순회 중인 객체라는 네 인수로 호출됩니다. 함수가 처음 호출될 때 previousValue와 currentValue는 두 가지 경우 중 하나가 될 수 있습니다. reduceRight 호출에 initialValue가 제공되었다면 previousValue는 initialValue이고 currentValue는 배열의 마지막 값입니다. initialValue가 제공되지 않았다면 previousValue는 배열의 마지막 값이고 currentValue는 끝에서 두 번째 값입니다. 배열에 요소가 없고 initialValue가 제공되지 않으면 TypeError입니다.

reduceRight는 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

reduceRight가 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. reduceRight 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 callback에 의해 변경되면 callback에 전달되는 값은 reduceRight가 해당 요소를 방문할 때의 값입니다. reduceRight 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. length = 0이고 initialValue가 존재하지 않으면 TypeError 예외를 던집니다.
  5. k를 length - 1로 둡니다.
  6. accumulator를 undefined로 둡니다.
  7. initialValue가 존재하면, 다음을 수행합니다.
    1. accumulator를 initialValue로 설정합니다.
  8. 그렇지 않으면,
    1. kPresent를 false로 둡니다.
    2. kPresent가 false이고 k ≥ 0인 동안 다음을 반복합니다.
      1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
      2. kPresent를 ? HasProperty(obj, propertyKey)로 설정합니다.
      3. kPresent가 true이면, 다음을 수행합니다.
        1. accumulator를 ? Get(obj, propertyKey)로 설정합니다.
      4. k를 k - 1로 설정합니다.
    3. kPresent가 false이면 TypeError 예외를 던집니다.
  9. k ≥ 0인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj »)로 설정합니다.
    4. k를 k - 1로 설정합니다.
  10. accumulator를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.26 Array.prototype.reverse ( )

참고 1

이 메서드는 배열 요소의 순서를 반대로 재배열합니다. 반전된 배열을 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. middle을 floor(length / 2)로 둡니다.
  4. lower를 0으로 둡니다.
  5. lower ≠ middle인 동안 다음을 반복합니다.
    1. upper를 length - lower - 1로 둡니다.
    2. upperP를 ! ToString(𝔽(upper))로 둡니다.
    3. lowerP를 ! ToString(𝔽(lower))로 둡니다.
    4. lowerExists를 ? HasProperty(obj, lowerP)로 둡니다.
    5. lowerExists가 true이면, 다음을 수행합니다.
      1. lowerValue를 ? Get(obj, lowerP)로 둡니다.
    6. upperExists를 ? HasProperty(obj, upperP)로 둡니다.
    7. upperExists가 true이면, 다음을 수행합니다.
      1. upperValue를 ? Get(obj, upperP)로 둡니다.
    8. lowerExists가 true이고 upperExists가 true이면, 다음을 수행합니다.
      1. ? Set(obj, lowerP, upperValue, true)를 수행합니다.
      2. ? Set(obj, upperP, lowerValue, true)를 수행합니다.
    9. 그렇지 않고 lowerExists가 false이고 upperExists가 true이면, 다음을 수행합니다.
      1. ? Set(obj, lowerP, upperValue, true)를 수행합니다.
      2. ? DeletePropertyOrThrow(obj, upperP)를 수행합니다.
    10. 그렇지 않고 lowerExists가 true이고 upperExists가 false이면, 다음을 수행합니다.
      1. ? DeletePropertyOrThrow(obj, lowerP)를 수행합니다.
      2. ? Set(obj, upperP, lowerValue, true)를 수행합니다.
    11. 그렇지 않으면,
      1. 단언: lowerExists와 upperExists는 모두 false입니다.
      2. 참고: 어떤 동작도 필요하지 않습니다.
    12. lower를 lower + 1로 설정합니다.
  6. obj를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.27 Array.prototype.shift ( )

이 메서드는 배열의 첫 번째 요소를 제거하고 반환합니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. length = 0이면, 다음을 수행합니다.
    1. ? Set(obj, "length", +0𝔽, true)를 수행합니다.
    2. undefined를 반환합니다.
  4. first를 ? Get(obj, "0")로 둡니다.
  5. k를 1로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. from을 ! ToString(𝔽(k))로 둡니다.
    2. to를 ! ToString(𝔽(k - 1))로 둡니다.
    3. fromPresent를 ? HasProperty(obj, from)로 둡니다.
    4. fromPresent가 true이면, 다음을 수행합니다.
      1. fromValue를 ? Get(obj, from)로 둡니다.
      2. ? Set(obj, to, fromValue, true)를 수행합니다.
    5. 그렇지 않으면,
      1. 단언: fromPresent는 false입니다.
      2. ? DeletePropertyOrThrow(obj, to)를 수행합니다.
    6. k를 k + 1로 설정합니다.
  7. ? DeletePropertyOrThrow(obj, ! ToString(𝔽(length - 1)))를 수행합니다.
  8. ? Set(obj, "length", 𝔽(length - 1), true)를 수행합니다.
  9. first를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.28 Array.prototype.slice ( start, end )

이 메서드는 배열의 요소 start부터 요소 end 직전까지(end가 undefined이면 배열의 끝까지)의 요소를 포함하는 배열을 반환합니다. start가 음수이면 배열의 길이인 length에 대해 length + start로 처리합니다. end가 음수이면 배열의 길이인 length에 대해 length + end로 처리합니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. k를 ? ToClampedIndex(start, length)로 둡니다.
  4. end가 undefined이면 final을 length로 둡니다. 그렇지 않으면 final을 ? ToClampedIndex(end, length)로 둡니다.
  5. count를 max(final - k, 0)으로 둡니다.
  6. array를 ? ArraySpeciesCreate(obj, count)로 둡니다.
  7. resultIndex를 0으로 둡니다.
  8. k < final인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. ? CreateDataPropertyOrThrow(array, ! ToString(𝔽(resultIndex)), kValue)를 수행합니다.
    4. k를 k + 1로 설정합니다.
    5. resultIndex를 resultIndex + 1로 설정합니다.
  9. ? Set(array, "length", 𝔽(resultIndex), true)를 수행합니다.
  10. array를 반환합니다.
참고 1

9 단계에서 "length" 프로퍼티를 명시적으로 설정하는 것은 array가 내장 Array가 아닌 경우에도 길이가 올바르도록 보장하기 위한 것입니다.

참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )

참고 1

callback은 세 인수를 받고 Boolean 값으로 강제 변환할 수 있는 값을 반환하는 함수여야 합니다. some은 callback이 true를 반환하는 요소를 찾을 때까지 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출합니다. 그러한 요소를 찾으면 some은 즉시 true를 반환합니다. 그렇지 않으면 some은 false를 반환합니다. callback은 배열에 실제로 존재하는 요소에 대해서만 호출되며, 존재하지 않는 요소에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공되면 callback을 호출할 때마다 this 값으로 사용됩니다. 제공되지 않으면 대신 undefined를 사용합니다.

callback은 요소의 값, 요소의 인덱스, 순회 중인 객체라는 세 인수로 호출됩니다.

some은 호출된 객체를 직접 변경하지 않지만 callback 호출에 의해 객체가 변경될 수 있습니다.

some이 처리할 요소의 범위는 callback을 처음 호출하기 전에 설정됩니다. some 호출이 시작된 후 배열에 추가된 요소는 callback이 방문하지 않습니다. 배열의 기존 요소가 변경되면 callback에 전달되는 값은 some이 해당 요소를 방문할 때의 값입니다. some 호출이 시작된 후 방문되기 전에 삭제된 요소는 방문되지 않습니다. some은 수학의 “존재한다” 한정자처럼 동작합니다. 특히 빈 배열에서는 false를 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  4. k를 0으로 둡니다.
  5. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. testResult를 ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »))로 둡니다.
      3. testResult가 true이면 true를 반환합니다.
    4. k를 k + 1로 설정합니다.
  6. false를 반환합니다.
참고 2

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.30 Array.prototype.sort ( comparator )

이 메서드는 이 배열의 요소를 정렬합니다. comparator가 undefined가 아니면 두 인수 x와 y를 받고 x < y이면 음수 Number, x > y이면 양수 Number, 그 밖의 경우 0을 반환하는 함수여야 합니다.

호출되면 다음 단계를 수행합니다:

  1. comparator가 undefined가 아니고 IsCallable(comparator)이 false이면 TypeError 예외를 던집니다.
  2. obj를 ? ToObject(this 값)으로 둡니다.
  3. length를 ? LengthOfArrayLike(obj)로 둡니다.
  4. sortCompare를 comparator를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, y)를 갖는 새로운 Abstract Closure로 둡니다:
    1. ? CompareArrayElements(x, y, comparator)를 반환합니다.
  5. sortedList를 ? SortIndexedProperties(obj, length, sortCompare, skip-holes)로 둡니다.
  6. itemCount를 sortedList의 요소 수로 둡니다.
  7. j를 0으로 둡니다.
  8. j < itemCount인 동안 다음을 반복합니다.
    1. ? Set(obj, ! ToString(𝔽(j)), sortedList[j], true)를 수행합니다.
    2. j를 j + 1로 설정합니다.
  9. 참고: 5 단계의 SortIndexedProperties 호출은 skip-holes를 사용합니다. 감지되어 정렬에서 제외된 빈 슬롯의 수를 보존하기 위해 남은 인덱스를 삭제합니다.
  10. j < length인 동안 다음을 반복합니다.
    1. ? DeletePropertyOrThrow(obj, ! ToString(𝔽(j)))를 수행합니다.
    2. j를 j + 1로 설정합니다.
  11. obj를 반환합니다.
참고 1

존재하지 않는 프로퍼티 값은 항상 undefined 프로퍼티 값보다 큰 것으로 비교되고, undefined는 항상 다른 모든 값보다 큰 것으로 비교되므로(CompareArrayElements 참조), undefined 프로퍼티 값은 항상 결과의 끝으로 정렬되고 그 뒤에 존재하지 않는 프로퍼티 값이 옵니다.

참고 2

5 및 6 단계의 ToString 추상 연산이 수행하는 메서드 호출로 인해 sortCompare가 일관된 비교기로 동작하지 않을 수 있습니다.

참고 3

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.30.1 SortIndexedProperties ( obj, length, sortCompare, holes )

추상 연산 SortIndexedProperties. 인수 obj (Object), length (음이 아닌 정수), sortCompare (매개변수가 두 개인 추상 클로저) 및 holes ((skip-holes 또는 read-through-holes)). 반환값: (정상 완료 (값: 리스트 (요소: ECMAScript 언어 값)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. items를 새로운 빈 List로 둡니다.
  2. k를 0으로 둡니다.
  3. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. holes가 skip-holes이면, 다음을 수행합니다.
      1. kRead를 ? HasProperty(obj, propertyKey)로 둡니다.
    3. 그렇지 않으면,
      1. 단언: holes는 read-through-holes입니다.
      2. kRead를 true로 둡니다.
    4. kRead가 true이면, 다음을 수행합니다.
      1. kValue를 ? Get(obj, propertyKey)로 둡니다.
      2. kValue를 items에 추가합니다.
    5. k를 k + 1로 설정합니다.
  4. 구현체 정의 순서의 sortCompare 호출을 사용하여 items를 정렬합니다. 그러한 호출 중 하나가 갑작스러운 완료를 반환하면 sortCompare에 대한 추가 호출을 수행하기 전에 중단하고 해당 Completion Record를 반환합니다.
  5. items를 반환합니다.

정렬 순서는 위 알고리즘의 4 단계가 완료된 후의 items 순서입니다. sortCompare가 items 요소에 대해 일관된 비교기가 아니면 정렬 순서는 구현체 정의입니다. SortIndexedProperties가 Array.prototype.sort 또는 Array.prototype.toSorted에 의해 호출될 때, comparator가 undefined이고 sortCompare에 인수로 전달된 특정 값에 대한 모든 ToString 적용이 동일한 결과를 생성하지 않는 경우에도 정렬 순서는 구현체 정의입니다.

정렬 순서가 구현체 정의라고 명시되지 않는 한 다음 조건을 모두 만족해야 합니다:

  • itemCount보다 작은 음이 아닌 정수의 어떤 수학적 순열 π가 존재하여, itemCount보다 작은 모든 음이 아닌 정수 j에 대해 요소 old[j]가 new[π(j)]와 정확히 같아야 합니다.
  • 그러면 각각 itemCount보다 작은 모든 음이 아닌 정수 j와 k에 대해 ℝ(sortCompare(old[j], old[k])) < 0이면 π(j) < π(k)입니다.
  • 또한 j < k < itemCount를 만족하는 모든 음이 아닌 정수 j와 k에 대해 ℝ(sortCompare(old[j], old[k])) = 0이면 π(j) < π(k)입니다. 즉, 정렬은 안정적입니다.

여기서 표기 old[j]는 4 단계가 실행되기 전의 items[j]를, 표기 new[j]는 4 단계가 실행된 후의 items[j]를 나타내는 데 사용됩니다.

Abstract Closure 또는 함수 comparator는 집합 values 안의 모든 값 a, b, c(같은 값일 수도 있음)에 대해 아래 요구 사항을 모두 만족하면 값 집합 values의 일관된 비교기입니다. 표기 a <C b는 ℝ(comparator(a, b)) < 0을 의미하고, a =C b는 ℝ(comparator(a, b)) = 0을 의미하며, a >C b는 ℝ(comparator(a, b)) > 0을 의미합니다.

  • 특정 값 쌍 a와 b를 두 인수로 제공하면 comparator(a, b) 호출은 항상 동일한 값 v를 반환합니다. 또한 v는 Number이고 NaN이 아닙니다. 이는 주어진 a와 b 쌍에 대해 a <C b, a =C b, a >C b 중 정확히 하나만 참임을 의미합니다.
  • comparator(a, b) 호출은 obj 또는 obj의 프로토타입 체인에 있는 어떤 객체도 변경하지 않습니다.
  • a =C a (반사성)
  • a =C b이면 b =C a입니다(대칭성).
  • a =C b이고 b =C c이면 a =C c입니다(=C의 추이성).
  • a <C b이고 b <C c이면 a <C c입니다(<C의 추이성).
  • a >C b이고 b >C c이면 a >C c입니다(>C의 추이성).
참고

위 조건은 comparator가 집합 values를 동치류로 나누고 이러한 동치류가 전순서를 이루도록 보장하기 위한 필요충분조건입니다.

23.1.3.30.2 CompareArrayElements ( x, y, comparator )

추상 연산 CompareArrayElements. 인수 x (ECMAScript 언어 값), y (ECMAScript 언어 값) 및 comparator ((함수 객체 또는 undefined)). 반환값: (정상 완료 (값: Number) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. x가 undefined이고 y가 undefined이면 +0𝔽을 반환합니다.
  2. x가 undefined이면 1𝔽을 반환합니다.
  3. y가 undefined이면 -1𝔽을 반환합니다.
  4. comparator가 undefined가 아니면, 다음을 수행합니다.
    1. result를 ? ToNumber(? Call(comparator, undefined, « x, y »))로 둡니다.
    2. result가 NaN이면 +0𝔽을 반환합니다.
    3. result를 반환합니다.
  5. xString을 ? ToString(x)로 둡니다.
  6. yString을 ? ToString(y)로 둡니다.
  7. xSmaller를 ! IsLessThan(xString, yString, true)로 둡니다.
  8. xSmaller가 true이면 -1𝔽을 반환합니다.
  9. ySmaller를 ! IsLessThan(yString, xString, true)로 둡니다.
  10. ySmaller가 true이면 1𝔽을 반환합니다.
  11. +0𝔽을 반환합니다.

23.1.3.31 Array.prototype.splice ( start, deleteCount, ...items )

참고 1

이 메서드는 정수 인덱스 start에서 시작하는 배열의 deleteCount개 요소를 삭제하고 이를 items의 요소로 대체합니다. 삭제된 요소가 있으면 이를 포함하는 Array를 반환합니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. actualStart를 ? ToClampedIndex(start, length)로 둡니다.
  4. itemCount를 items의 요소 수로 둡니다.
  5. start가 존재하지 않으면, 다음을 수행합니다.
    1. actualDeleteCount를 0으로 둡니다.
  6. 그렇지 않고 deleteCount가 존재하지 않으면, 다음을 수행합니다.
    1. actualDeleteCount를 length - actualStart로 둡니다.
    2. 단언: actualDeleteCount ≥ 0입니다.
  7. 그렇지 않으면,
    1. dc를 ? ToIntegerOrInfinity(deleteCount)로 둡니다.
    2. actualDeleteCount를 dc를 0과 length - actualStart 사이로 제한한 결과로 둡니다.
  8. length + itemCount - actualDeleteCount > 253 - 1이면 TypeError 예외를 던집니다.
  9. deletedArray를 ? ArraySpeciesCreate(obj, actualDeleteCount)로 둡니다.
  10. k를 0으로 둡니다.
  11. k < actualDeleteCount인 동안 다음을 반복합니다.
    1. from을 ! ToString(𝔽(actualStart + k))로 둡니다.
    2. ? HasProperty(obj, from)가 true이면, 다음을 수행합니다.
      1. fromValue를 ? Get(obj, from)로 둡니다.
      2. ? CreateDataPropertyOrThrow(deletedArray, ! ToString(𝔽(k)), fromValue)를 수행합니다.
    3. k를 k + 1로 설정합니다.
  12. ? Set(deletedArray, "length", 𝔽(actualDeleteCount), true)를 수행합니다.
  13. itemCount < actualDeleteCount이면, 다음을 수행합니다.
    1. k를 actualStart로 설정합니다.
    2. k < (length - actualDeleteCount)인 동안 다음을 반복합니다.
      1. from을 ! ToString(𝔽(k + actualDeleteCount))로 둡니다.
      2. to를 ! ToString(𝔽(k + itemCount))로 둡니다.
      3. ? HasProperty(obj, from)가 true이면, 다음을 수행합니다.
        1. fromValue를 ? Get(obj, from)로 둡니다.
        2. ? Set(obj, to, fromValue, true)를 수행합니다.
      4. 그렇지 않으면,
        1. ? DeletePropertyOrThrow(obj, to)를 수행합니다.
      5. k를 k + 1로 설정합니다.
    3. k를 length로 설정합니다.
    4. k > (length - actualDeleteCount + itemCount)인 동안 다음을 반복합니다.
      1. ? DeletePropertyOrThrow(obj, ! ToString(𝔽(k - 1)))를 수행합니다.
      2. k를 k - 1로 설정합니다.
  14. 그렇지 않고 itemCount > actualDeleteCount이면, 다음을 수행합니다.
    1. k를 (length - actualDeleteCount)로 설정합니다.
    2. k > actualStart인 동안 다음을 반복합니다.
      1. from을 ! ToString(𝔽(k + actualDeleteCount - 1))로 둡니다.
      2. to를 ! ToString(𝔽(k + itemCount - 1))로 둡니다.
      3. ? HasProperty(obj, from)가 true이면, 다음을 수행합니다.
        1. fromValue를 ? Get(obj, from)로 둡니다.
        2. ? Set(obj, to, fromValue, true)를 수행합니다.
      4. 그렇지 않으면,
        1. ? DeletePropertyOrThrow(obj, to)를 수행합니다.
      5. k를 k - 1로 설정합니다.
  15. k를 actualStart로 설정합니다.
  16. items의 각 요소 item에 대해 다음을 수행합니다.
    1. ? Set(obj, ! ToString(𝔽(k)), item, true)를 수행합니다.
    2. k를 k + 1로 설정합니다.
  17. ? Set(obj, "length", 𝔽(length - actualDeleteCount + itemCount), true)를 수행합니다.
  18. deletedArray를 반환합니다.
참고 2

12 및 17 단계에서 "length" 프로퍼티를 명시적으로 설정하는 것은 객체가 내장 Array가 아닌 경우에도 길이가 올바르도록 보장하기 위한 것입니다.

참고 3

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현체는 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않으면 다음과 같은 이 메서드 명세가 사용됩니다.

참고 1

ECMA-402의 초판에는 이 메서드에 대한 대체 명세가 포함되어 있지 않았습니다.

이 메서드의 선택적 매개변수의 의미는 ECMA-402에 정의되어 있습니다. ECMA-402 지원을 포함하지 않는 구현체는 해당 매개변수 위치를 다른 용도로 사용해서는 안 됩니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. array를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(array)로 둡니다.
  3. ? JoinIndexedProperties(array, length, LocalizedListSeparator(), "toLocaleString")을 반환합니다.
참고 2

이 메서드는 toString과 유사하지만, 호스트 환경의 현재 로캘 관례에 따라 로캘에 민감한 결과를 생성하도록 설계되었습니다.

참고 3

이 메서드는 의도적으로 범용적으로 설계되었으며, this 값이 Array일 필요는 없습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.32.1 LocalizedListSeparator ( )

구현 정의 추상 연산 LocalizedListSeparator. 인수 없음. 반환값: String. 호스트 환경의 현재 로캘에서 목록 구분자로 사용하기에 적합한 구현 정의 String(예: ", ")을 반환합니다.

23.1.3.33 Array.prototype.toReversed ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. array를 ? ArrayCreate(length)로 둡니다.
  4. k를 0으로 둡니다.
  5. k < length인 동안 다음을 반복합니다.
    1. from을 ! ToString(𝔽(length - k - 1))로 둡니다.
    2. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    3. fromValue를 ? Get(obj, from)로 둡니다.
    4. ! CreateDataPropertyOrThrow(array, propertyKey, fromValue)를 수행합니다.
    5. k를 k + 1로 설정합니다.
  6. array를 반환합니다.

23.1.3.34 Array.prototype.toSorted ( comparator )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. comparator가 undefined가 아니고 IsCallable(comparator)이 false이면 TypeError 예외를 던집니다.
  2. obj를 ? ToObject(this 값)으로 둡니다.
  3. length를 ? LengthOfArrayLike(obj)로 둡니다.
  4. array를 ? ArrayCreate(length)로 둡니다.
  5. sortCompare를 comparator를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, y)를 갖는 새로운 Abstract Closure로 둡니다:
    1. ? CompareArrayElements(x, y, comparator)를 반환합니다.
  6. sortedList를 ? SortIndexedProperties(obj, length, sortCompare, read-through-holes)로 둡니다.
  7. j를 0으로 둡니다.
  8. j < length인 동안 다음을 반복합니다.
    1. ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(j)), sortedList[j])를 수행합니다.
    2. j를 j + 1로 설정합니다.
  9. array를 반환합니다.

23.1.3.35 Array.prototype.toSpliced ( start, skipCount, ...items )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. actualStart를 ? ToClampedIndex(start, length)로 둡니다.
  4. insertCount를 items의 요소 수로 둡니다.
  5. maxSkipCount를 length - actualStart로 둡니다.
  6. start가 존재하지 않으면, 다음을 수행합니다.
    1. actualSkipCount를 0으로 둡니다.
  7. 그렇지 않고 skipCount가 존재하지 않으면, 다음을 수행합니다.
    1. actualSkipCount를 maxSkipCount로 둡니다.
  8. 그렇지 않으면,
    1. actualSkipCount를 ? ToIntegerOrInfinity(skipCount)을 0과 maxSkipCount 사이로 제한한 결과로 둡니다.
  9. newLength를 length + insertCount - actualSkipCount로 둡니다.
  10. 단언: newLength ≥ 0입니다.
  11. newLength > 253 - 1이면 TypeError 예외를 던집니다.
  12. newArray를 ? ArrayCreate(newLength)로 둡니다.
  13. writeIndex를 0으로 둡니다.
  14. readIndex를 actualStart + actualSkipCount로 둡니다.
  15. writeIndex < actualStart인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(writeIndex))로 둡니다.
    2. iValue를 ? Get(obj, propertyKey)로 둡니다.
    3. ! CreateDataPropertyOrThrow(newArray, propertyKey, iValue)를 수행합니다.
    4. writeIndex를 writeIndex + 1로 설정합니다.
  16. items의 각 요소 item에 대해 다음을 수행합니다.
    1. propertyKey를 ! ToString(𝔽(writeIndex))로 둡니다.
    2. ! CreateDataPropertyOrThrow(newArray, propertyKey, item)을 수행합니다.
    3. writeIndex를 writeIndex + 1로 설정합니다.
  17. writeIndex < newLength인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(writeIndex))로 둡니다.
    2. from을 ! ToString(𝔽(readIndex))로 둡니다.
    3. fromValue를 ? Get(obj, from)로 둡니다.
    4. ! CreateDataPropertyOrThrow(newArray, propertyKey, fromValue)를 수행합니다.
    5. writeIndex를 writeIndex + 1로 설정합니다.
    6. readIndex를 readIndex + 1로 설정합니다.
  18. newArray를 반환합니다.

23.1.3.36 Array.prototype.toString ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. array를 ? ToObject(this 값)으로 둡니다.
  2. func를 ? Get(array, "join")로 둡니다.
  3. IsCallable(func)이 false이면 func를 내재 함수 %Object.prototype.toString%으로 설정합니다.
  4. ? Call(func, array)를 반환합니다.
참고

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.37 Array.prototype.unshift ( ...items )

이 메서드는 인수를 배열의 시작 부분에 추가하며, 배열 안에서의 순서는 인수 목록에 나타나는 순서와 같습니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. argCount를 items의 요소 수로 둡니다.
  4. argCount > 0이면, 다음을 수행합니다.
    1. length + argCount > 253 - 1이면 TypeError 예외를 던집니다.
    2. k를 length로 둡니다.
    3. k > 0인 동안 다음을 반복합니다.
      1. from을 ! ToString(𝔽(k - 1))로 둡니다.
      2. to를 ! ToString(𝔽(k + argCount - 1))로 둡니다.
      3. fromPresent를 ? HasProperty(obj, from)로 둡니다.
      4. fromPresent가 true이면, 다음을 수행합니다.
        1. fromValue를 ? Get(obj, from)로 둡니다.
        2. ? Set(obj, to, fromValue, true)를 수행합니다.
      5. 그렇지 않으면,
        1. 단언: fromPresent는 false입니다.
        2. ? DeletePropertyOrThrow(obj, to)를 수행합니다.
      6. k를 k - 1로 설정합니다.
    4. j를 0으로 둡니다.
    5. items의 각 요소 item에 대해 다음을 수행합니다.
      1. ? Set(obj, ! ToString(𝔽(j)), item, true)를 수행합니다.
      2. j를 j + 1로 설정합니다.
  5. ? Set(obj, "length", 𝔽(length + argCount), true)를 수행합니다.
  6. 𝔽(length + argCount)를 반환합니다.

이 메서드의 "length" 프로퍼티는 1𝔽입니다.

참고

이 메서드는 의도적으로 일반적이며 this 값이 Array일 것을 요구하지 않습니다. 따라서 다른 종류의 객체로 옮겨 메서드로 사용할 수 있습니다.

23.1.3.38 Array.prototype.values ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. CreateArrayIterator(obj, value)를 반환합니다.

23.1.3.39 Array.prototype.with ( index, value )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 ? ToObject(this 값)으로 둡니다.
  2. length를 ? LengthOfArrayLike(obj)로 둡니다.
  3. actualIndex를 ? ToAbsoluteIndex(index, length)로 둡니다.
  4. actualIndex < 0 또는 actualIndex ≥ length이면 RangeError 예외를 던집니다.
  5. array를 ? ArrayCreate(length)로 둡니다.
  6. k를 0으로 둡니다.
  7. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. k = actualIndex이면 fromValue를 value로 둡니다.
    3. 그렇지 않으면 fromValue를 ? Get(obj, propertyKey)로 둡니다.
    4. ! CreateDataPropertyOrThrow(array, propertyKey, fromValue)를 수행합니다.
    5. k를 k + 1로 설정합니다.
  8. array를 반환합니다.

23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 프로퍼티의 초기 값은 23.1.3.38에 정의된 %Array.prototype.values%입니다.

23.1.3.41 Array.prototype [ %Symbol.unscopables% ]

%Symbol.unscopables% 데이터 프로퍼티의 초기 값은 다음 단계로 생성된 객체입니다:

  1. unscopableList를 OrdinaryObjectCreate(null)로 둡니다.
  2. ! CreateDataPropertyOrThrow(unscopableList, "at", true)를 수행합니다.
  3. ! CreateDataPropertyOrThrow(unscopableList, "copyWithin", true)를 수행합니다.
  4. ! CreateDataPropertyOrThrow(unscopableList, "entries", true)를 수행합니다.
  5. ! CreateDataPropertyOrThrow(unscopableList, "fill", true)를 수행합니다.
  6. ! CreateDataPropertyOrThrow(unscopableList, "find", true)를 수행합니다.
  7. ! CreateDataPropertyOrThrow(unscopableList, "findIndex", true)를 수행합니다.
  8. ! CreateDataPropertyOrThrow(unscopableList, "findLast", true)를 수행합니다.
  9. ! CreateDataPropertyOrThrow(unscopableList, "findLastIndex", true)를 수행합니다.
  10. ! CreateDataPropertyOrThrow(unscopableList, "flat", true)를 수행합니다.
  11. ! CreateDataPropertyOrThrow(unscopableList, "flatMap", true)를 수행합니다.
  12. ! CreateDataPropertyOrThrow(unscopableList, "includes", true)를 수행합니다.
  13. ! CreateDataPropertyOrThrow(unscopableList, "keys", true)를 수행합니다.
  14. ! CreateDataPropertyOrThrow(unscopableList, "toReversed", true)를 수행합니다.
  15. ! CreateDataPropertyOrThrow(unscopableList, "toSorted", true)를 수행합니다.
  16. ! CreateDataPropertyOrThrow(unscopableList, "toSpliced", true)를 수행합니다.
  17. ! CreateDataPropertyOrThrow(unscopableList, "values", true)를 수행합니다.
  18. unscopableList를 반환합니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

참고

이 객체의 자체 프로퍼티 이름은 ECMAScript 2015 명세 이전에 Array.prototype의 표준 프로퍼티로 포함되지 않았던 프로퍼티 이름입니다. 이러한 이름 중 하나를 외부 스코프의 바인딩으로 사용하는 기존 코드에서, 바인딩 객체가 Array인 with 문이 해당 바인딩을 가리는 경우의 동작을 보존하기 위해 이 이름들은 with 문 바인딩에서 무시됩니다.

"with"가 unscopableList에 포함되지 않은 이유는 이미 예약어이기 때문입니다.

23.1.4 Array 인스턴스의 프로퍼티

Array 인스턴스는 Array 특수 객체이며 그러한 객체에 지정된 내부 메서드를 갖습니다. Array 인스턴스는 Array 프로토타입 객체에서 프로퍼티를 상속합니다.

Array 인스턴스에는 "length" 프로퍼티와 배열 인덱스 이름을 갖는 열거 가능한 프로퍼티 집합이 있습니다.

23.1.4.1 length

Array 인스턴스의 "length" 프로퍼티는 이름이 배열 인덱스인 모든 설정 가능한 자체 프로퍼티 이름보다 항상 숫자적으로 큰 값을 갖는 데이터 프로퍼티입니다.

"length" 프로퍼티는 처음에 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

참고

"length" 프로퍼티 값을 줄이면 배열 인덱스가 이전 길이 값과 새 길이 값 사이에 있는 자체 배열 요소가 삭제되는 부수 효과가 있습니다. 그러나 설정 불가능한 프로퍼티는 삭제할 수 없습니다. Array의 "length" 프로퍼티를 배열의 기존 설정 불가능한 배열 인덱스 프로퍼티 중 가장 큰 숫자 자체 프로퍼티 이름 이하의 값으로 설정하려고 하면, 길이는 해당 설정 불가능한 숫자 자체 프로퍼티 이름보다 1 큰 숫자 값으로 설정됩니다. 10.4.2.1를 참조하시기 바랍니다.

23.1.5 Array Iterator 객체

Array Iterator는 특정 Array 인스턴스 객체에 대한 특정 순회를 나타내는 객체입니다. Array Iterator 객체에는 이름 있는 생성자가 없습니다. 대신 Array Iterator 객체는 Array 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

23.1.5.1 CreateArrayIterator ( array, kind )

추상 연산 CreateArrayIterator. 인수 array (Object) 및 kind ((key+value, key 또는 value)). 반환값: Object. 그러한 반복자를 반환하는 Array 메서드의 반복자 객체를 생성하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. iterator를 OrdinaryObjectCreate(%ArrayIteratorPrototype%, « [[IteratedArrayLike]], [[ArrayLikeNextIndex]], [[ArrayLikeIterationKind]] »)로 둡니다.
  2. iterator.[[IteratedArrayLike]]를 array로 설정합니다.
  3. iterator.[[ArrayLikeNextIndex]]를 0으로 설정합니다.
  4. iterator.[[ArrayLikeIterationKind]]를 kind로 설정합니다.
  5. iterator를 반환합니다.

23.1.5.2 %ArrayIteratorPrototype% 객체

%ArrayIteratorPrototype% 객체는:

23.1.5.2.1 %ArrayIteratorPrototype%.next ( )

  1. iteratorObj를 this 값으로 둡니다.
  2. iteratorObj가 Object가 아니면 TypeError 예외를 던집니다.
  3. iteratorObj가 Array Iterator Instance의 모든 내부 슬롯(23.1.5.3)을 갖지 않으면 TypeError 예외를 던집니다.
  4. array를 iteratorObj.[[IteratedArrayLike]]로 둡니다.
  5. array가 undefined이면 CreateIteratorResultObject(undefined, true)를 반환합니다.
  6. index를 iteratorObj.[[ArrayLikeNextIndex]]로 둡니다.
  7. kind를 iteratorObj.[[ArrayLikeIterationKind]]로 둡니다.
  8. array에 [[TypedArrayName]] 내부 슬롯이 있으면, 다음을 수행합니다.
    1. taRecord를 ? ValidateTypedArrayBounds(array, seq-cst)로 둡니다.
    2. length를 TypedArrayLength(taRecord)로 둡니다.
  9. 그렇지 않으면,
    1. length를 ? LengthOfArrayLike(array)로 둡니다.
  10. index ≥ length이면, 다음을 수행합니다.
    1. iteratorObj.[[IteratedArrayLike]]를 undefined로 설정합니다.
    2. CreateIteratorResultObject(undefined, true)를 반환합니다.
  11. iteratorObj.[[ArrayLikeNextIndex]]를 index + 1로 설정합니다.
  12. indexNumber를 𝔽(index)로 둡니다.
  13. kind가 key이면, 다음을 수행합니다.
    1. result를 indexNumber로 둡니다.
  14. 그렇지 않으면,
    1. elementKey를 ! ToString(indexNumber)로 둡니다.
    2. elementValue를 ? Get(array, elementKey)로 둡니다.
    3. kind가 value이면, 다음을 수행합니다.
      1. result를 elementValue로 둡니다.
    4. 그렇지 않으면,
      1. 단언: kind는 key+value입니다.
      2. result를 CreateArrayFromList(« indexNumber, elementValue »)로 둡니다.
  15. CreateIteratorResultObject(result, false)를 반환합니다.

23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "Array Iterator"입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

23.1.5.3 Array Iterator 인스턴스의 프로퍼티

Array Iterator 인스턴스는 %ArrayIteratorPrototype% 내재 객체에서 프로퍼티를 상속하는 일반 객체입니다. Array Iterator 인스턴스는 처음에 표 70에 나열된 내부 슬롯을 갖도록 생성됩니다.

표 70: Array Iterator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[IteratedArrayLike]] an Object or undefined 순회 중인 배열과 유사한 객체입니다.
[[ArrayLikeNextIndex]] a non-negative integer 이 반복자가 다음에 검사할 요소의 정수 인덱스입니다.
[[ArrayLikeIterationKind]] key+value, key, or value 순회의 각 요소에 대해 무엇을 반환할지 식별하는 값입니다.

23.2 TypedArray 객체

TypedArray는 기반 이진 데이터 버퍼(25.1)를 배열과 유사하게 볼 수 있도록 합니다. TypedArray 요소 타입은 TypedArray 인스턴스의 모든 요소가 갖는 기반 이진 스칼라 데이터 타입입니다. 지원되는 각 요소 타입에는 표 71에 나열된 고유한 TypedArray 생성자가 있습니다. 표 71의 각 생성자에는 대응하는 고유한 프로토타입 객체가 있습니다.

표 71: TypedArray 생성자
생성자 이름 및 내재 객체 요소 타입 요소 크기 변환 연산 설명
Int8Array
%Int8Array%
int8 1 ToInt8 8비트 2의 보수 부호 있는 정수
Uint8Array
%Uint8Array%
uint8 1 ToUint8 8비트 부호 없는 정수
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped 1 ToUint8Clamp 8비트 부호 없는 정수(제한 변환)
Int16Array
%Int16Array%
int16 2 ToInt16 16비트 2의 보수 부호 있는 정수
Uint16Array
%Uint16Array%
uint16 2 ToUint16 16비트 부호 없는 정수
Int32Array
%Int32Array%
int32 4 ToInt32 32비트 2의 보수 부호 있는 정수
Uint32Array
%Uint32Array%
uint32 4 ToUint32 32비트 부호 없는 정수
BigInt64Array
%BigInt64Array%
bigint64 8 ToBigInt64 64비트 2의 보수 부호 있는 정수
BigUint64Array
%BigUint64Array%
biguint64 8 ToBigUint64 64비트 부호 없는 정수
Float16Array
%Float16Array%
float16 2 16비트 IEEE 부동 소수점
Float32Array
%Float32Array%
float32 4 32비트 IEEE 부동 소수점
Float64Array
%Float64Array%
float64 8 64비트 IEEE 부동 소수점

아래 정의에서 TypedArray에 대한 참조는 위 표의 적절한 생성자 이름으로 대체해야 합니다.

23.2.1 %TypedArray% 내재 객체

%TypedArray% 내재 객체는:

  • 모든 TypedArray 생성자 객체가 상속하는 생성자 함수 객체입니다.
  • 대응하는 프로토타입 객체와 함께 모든 TypedArray 생성자 및 그 인스턴스가 상속하는 공통 프로퍼티를 제공합니다.
  • 전역 이름을 갖지 않으며 전역 객체의 프로퍼티로 나타나지 않습니다.
  • 여러 TypedArray 생성자의 추상 상위 클래스 역할을 합니다.
  • 추상 클래스 생성자이므로 호출되면 오류를 던집니다. TypedArray 생성자는 이에 대한 super 호출을 수행하지 않습니다.

23.2.1.1 %TypedArray% ( )

이 함수는 호출되면 다음 단계를 수행합니다:

  1. TypeError 예외를 던집니다.

이 함수의 "length" 프로퍼티는 +0𝔽입니다.

23.2.2 %TypedArray% 내재 객체의 프로퍼티

%TypedArray% 내재 객체는:

  • 값이 %Function.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 "TypedArray"인 "name" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. ctor를 this 값으로 둡니다.
  2. IsConstructor(ctor)가 false이면 TypeError 예외를 던집니다.
  3. mapper가 undefined이면, 다음을 수행합니다.
    1. mapping을 false로 둡니다.
  4. 그렇지 않으면,
    1. IsCallable(mapper)가 false이면 TypeError 예외를 던집니다.
    2. mapping을 true로 둡니다.
  5. usingIterator를 ? GetMethod(source, %Symbol.iterator%)로 둡니다.
  6. usingIterator가 undefined가 아니면, 다음을 수행합니다.
    1. values를 ? IteratorToList(? GetIteratorFromMethod(source, usingIterator))로 둡니다.
    2. length를 values의 요소 수로 둡니다.
    3. targetObj를 ? TypedArrayCreateFromConstructor(ctor, « 𝔽(length) »)로 둡니다.
    4. k를 0으로 둡니다.
    5. k < length인 동안 다음을 반복합니다.
      1. kValue를 values[k]로 둡니다.
      2. mapping이 true이면, 다음을 수행합니다.
        1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 둡니다.
      3. 그렇지 않으면,
        1. mappedValue를 kValue로 둡니다.
      4. ? TypedArraySetElement(targetObj, 𝔽(k), mappedValue)를 수행합니다.
      5. k를 k + 1로 설정합니다.
    6. targetObj를 반환합니다.
  7. 참고: source는 반복 가능 객체가 아니므로 이미 배열과 유사한 객체라고 가정합니다.
  8. arrayLike를 ! ToObject(source)로 둡니다.
  9. length를 ? LengthOfArrayLike(arrayLike)로 둡니다.
  10. targetObj를 ? TypedArrayCreateFromConstructor(ctor, « 𝔽(length) »)로 둡니다.
  11. k를 0으로 둡니다.
  12. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kValue를 ? Get(arrayLike, propertyKey)로 둡니다.
    3. mapping이 true이면, 다음을 수행합니다.
      1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 둡니다.
    4. 그렇지 않으면,
      1. mappedValue를 kValue로 둡니다.
    5. ? TypedArraySetElement(targetObj, 𝔽(k), mappedValue)를 수행합니다.
    6. k를 k + 1로 설정합니다.
  13. targetObj를 반환합니다.

23.2.2.2 %TypedArray%.of ( ...items )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. length를 items의 요소 수로 둡니다.
  2. ctor를 this 값으로 둡니다.
  3. IsConstructor(ctor)가 false이면 TypeError 예외를 던집니다.
  4. newObj를 ? TypedArrayCreateFromConstructor(ctor, « 𝔽(length) »)로 둡니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. kValue를 items[k]로 둡니다.
    2. ? TypedArraySetElement(newObj, 𝔽(k), kValue)를 수행합니다.
    3. k를 k + 1로 설정합니다.
  7. newObj를 반환합니다.

23.2.2.3 %TypedArray%.prototype

%TypedArray%.prototype의 초기 값은 %TypedArray% 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

23.2.2.4 get %TypedArray% [ %Symbol.species% ]

%TypedArray%[%Symbol.species%]는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

%TypedArray.prototype% 메서드는 일반적으로 this 값의 생성자를 사용하여 파생 객체를 생성합니다. 그러나 하위 클래스 생성자는 자신의 %Symbol.species% 프로퍼티를 재정의하여 이 기본 동작을 재정의할 수 있습니다.

23.2.3 %TypedArray% 프로토타입 객체의 프로퍼티

%TypedArray% 프로토타입 객체는:

  • 값이 %Object.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • %TypedArray.prototype%입니다.
  • 일반 객체입니다.
  • [[ViewedArrayBuffer]] 또는 TypedArray 인스턴스 객체에 고유한 다른 어떤 내부 슬롯도 갖지 않습니다.

23.2.3.1 %TypedArray%.prototype.at ( index )

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. k를 ? ToAbsoluteIndex(index, length)로 둡니다.
  5. k < 0 또는 k ≥ length이면 undefined를 반환합니다.
  6. TypedArrayGetElement(obj, 𝔽(k))를 반환합니다.

23.2.3.2 get %TypedArray%.prototype.buffer

%TypedArray%.prototype.buffer는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[TypedArrayName]])를 수행합니다.
  3. 단언: obj에는 [[ViewedArrayBuffer]] 내부 슬롯이 있습니다.
  4. buffer를 obj.[[ViewedArrayBuffer]]로 둡니다.
  5. buffer를 반환합니다.

23.2.3.3 get %TypedArray%.prototype.byteLength

%TypedArray%.prototype.byteLength는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[TypedArrayName]])를 수행합니다.
  3. 단언: obj에는 [[ViewedArrayBuffer]] 내부 슬롯이 있습니다.
  4. taRecord를 MakeTypedArrayWithBufferWitnessRecord(obj, seq-cst)로 둡니다.
  5. IsTypedArrayOutOfBounds(taRecord)가 true이면 +0𝔽을 반환합니다.
  6. size를 TypedArrayByteLength(taRecord)로 둡니다.
  7. 𝔽(size)를 반환합니다.

23.2.3.4 get %TypedArray%.prototype.byteOffset

%TypedArray%.prototype.byteOffset은 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[TypedArrayName]])를 수행합니다.
  3. 단언: obj에는 [[ViewedArrayBuffer]] 내부 슬롯이 있습니다.
  4. taRecord를 MakeTypedArrayWithBufferWitnessRecord(obj, seq-cst)로 둡니다.
  5. IsTypedArrayOutOfBounds(taRecord)가 true이면 +0𝔽을 반환합니다.
  6. offset을 obj.[[ByteOffset]]으로 둡니다.
  7. 𝔽(offset)을 반환합니다.

23.2.3.5 %TypedArray%.prototype.constructor

%TypedArray%.prototype.constructor의 초기 값은 %TypedArray%입니다.

23.2.3.6 %TypedArray%.prototype.copyWithin ( target, start [ , end ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.4에 정의된 Array.prototype.copyWithin과 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. targetIndex를 ? ToClampedIndex(target, length)로 둡니다.
  5. startIndex를 ? ToClampedIndex(start, length)로 둡니다.
  6. end가 undefined이면 endIndex를 length로 둡니다. 그렇지 않으면 endIndex를 ? ToClampedIndex(end, length)로 둡니다.
  7. count를 min(endIndex - startIndex, length - targetIndex)로 둡니다.
  8. count > 0이면, 다음을 수행합니다.
    1. 참고: 복사는 소스 데이터의 비트 수준 인코딩을 보존하는 방식으로 수행해야 합니다.
    2. buffer를 obj.[[ViewedArrayBuffer]]로 둡니다.
    3. taRecord를 ? ValidateTypedArrayBounds(obj, seq-cst)로 설정합니다.
    4. length를 TypedArrayLength(taRecord)로 설정합니다.
    5. 참고: 위 단계의 부수 효과로 obj의 크기가 줄어들었을 수 있으며, 이 경우 여전히 적용 가능한 가장 긴 접두사에 대해 복사를 계속해야 합니다.
    6. count를 min(count, length - startIndex, length - targetIndex)로 설정합니다.
    7. elementSize를 TypedArrayElementSize(obj)로 둡니다.
    8. byteOffset을 obj.[[ByteOffset]]으로 둡니다.
    9. toByteIndex를 (targetIndex × elementSize) + byteOffset으로 둡니다.
    10. fromByteIndex를 (startIndex × elementSize) + byteOffset으로 둡니다.
    11. countBytes를 count × elementSize로 둡니다.
    12. fromByteIndex < toByteIndex이고 toByteIndex < fromByteIndex + countBytes이면, 다음을 수행합니다.
      1. direction을 -1로 둡니다.
      2. fromByteIndex를 fromByteIndex + countBytes - 1로 설정합니다.
      3. toByteIndex를 toByteIndex + countBytes - 1로 설정합니다.
    13. 그렇지 않으면,
      1. direction을 1로 둡니다.
    14. countBytes > 0인 동안 다음을 반복합니다.
      1. 단언: fromByteIndex ≥ 0이고 toByteIndex ≥ 0입니다.
      2. value를 GetValueFromBuffer(buffer, fromByteIndex, uint8, true, unordered)로 둡니다.
      3. SetValueInBuffer(buffer, toByteIndex, uint8, value, true, unordered)를 수행합니다.
      4. fromByteIndex를 fromByteIndex + direction으로 설정합니다.
      5. toByteIndex를 toByteIndex + direction으로 설정합니다.
      6. countBytes를 countBytes - 1로 설정합니다.
  9. obj를 반환합니다.

23.2.3.7 %TypedArray%.prototype.entries ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? ValidateTypedArray(obj, seq-cst)를 수행합니다.
  3. CreateArrayIterator(obj, key+value)를 반환합니다.

23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.6에 정의된 Array.prototype.every와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. testResult를 ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »))로 둡니다.
    3. testResult가 false이면 false를 반환합니다.
    4. k를 k + 1로 설정합니다.
  7. true를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.7에 정의된 Array.prototype.fill과 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. obj.[[ContentType]]이 bigint이면 value를 ? ToBigInt(value)로 설정합니다.
  5. 그렇지 않으면 value를 ? ToNumber(value)로 설정합니다.
  6. startIndex를 ? ToClampedIndex(start, length)로 둡니다.
  7. end가 undefined이면 endIndex를 length로 둡니다. 그렇지 않으면 endIndex를 ? ToClampedIndex(end, length)로 둡니다.
  8. taRecord를 ? ValidateTypedArrayBounds(obj, seq-cst)로 설정합니다.
  9. length를 TypedArrayLength(taRecord)로 설정합니다.
  10. endIndex를 min(endIndex, length)로 설정합니다.
  11. k를 startIndex로 둡니다.
  12. k < endIndex인 동안 다음을 반복합니다.
    1. ! TypedArraySetElement(obj, 𝔽(k), value)를 수행합니다.
    2. k를 k + 1로 설정합니다.
  13. obj를 반환합니다.

23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.8에 정의된 Array.prototype.filter와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. kept를 새로운 빈 List로 둡니다.
  6. captured를 0으로 둡니다.
  7. k를 0으로 둡니다.
  8. k < length인 동안 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. selected를 ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »))로 둡니다.
    3. selected가 true이면 다음을 수행합니다.
      1. kept에 kValue를 추가합니다.
      2. captured를 captured + 1로 설정합니다.
    4. k를 k + 1로 설정합니다.
  9. result를 ? TypedArraySpeciesCreate(obj, « 𝔽(captured) »)로 둡니다.
  10. n을 0으로 둡니다.
  11. kept의 각 요소 element에 대해 다음을 수행합니다.
    1. 참고: callback을 호출하여 obj의 기반 버퍼가 분리되거나 축소되면 element는 undefined일 수 있습니다.
    2. 다음을 수행합니다: ? TypedArraySetElement(result, 𝔽(n), element).
    3. n을 n + 1로 설정합니다.
  12. result를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.9에 정의된 Array.prototype.find와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. findRecord를 ? FindViaPredicate(obj, length, ascending, predicate, thisArg)로 둡니다.
  5. findRecord.[[Value]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.10에 정의된 Array.prototype.findIndex와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. findRecord를 ? FindViaPredicate(obj, length, ascending, predicate, thisArg)로 둡니다.
  5. findRecord.[[Index]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.11에 정의된 Array.prototype.findLast와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. findRecord를 ? FindViaPredicate(obj, length, descending, predicate, thisArg)로 둡니다.
  5. findRecord.[[Value]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.12에 정의된 Array.prototype.findLastIndex와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. findRecord를 ? FindViaPredicate(obj, length, descending, predicate, thisArg)로 둡니다.
  5. findRecord.[[Index]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.15에 정의된 Array.prototype.forEach와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. ? Call(callback, thisArg, « kValue, 𝔽(k), obj »)를 수행합니다.
    3. k를 k + 1로 설정합니다.
  7. undefined를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.16에 정의된 Array.prototype.includes와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. length = 0이면 false를 반환합니다.
  5. k를 ? ToClampedIndex(fromIndex, length)로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. elementK를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. SameValueZero(searchElement, elementK)가 true이면 true를 반환합니다.
    3. k를 k + 1로 설정합니다.
  7. false를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.17에 정의된 Array.prototype.indexOf와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. length = 0이면 -1𝔽을 반환합니다.
  5. k를 ? ToClampedIndex(fromIndex, length)로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ! HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. elementK를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
      2. IsStrictlyEqual(searchElement, elementK)가 true이면 𝔽(k)를 반환합니다.
    4. k를 k + 1로 설정합니다.
  7. -1𝔽을 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.18 %TypedArray%.prototype.join ( separator )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.18에 정의된 Array.prototype.join과 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. separator가 undefined이면 separatorString을 ","로 둡니다; 그렇지 않으면 separatorString을 ? ToString(separator)으로 둡니다.
  5. ? JoinIndexedProperties(obj, length, separatorString)를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.19 %TypedArray%.prototype.keys ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? ValidateTypedArray(obj, seq-cst)를 수행합니다.
  3. CreateArrayIterator(obj, key)를 반환합니다.

23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.20에 정의된 Array.prototype.lastIndexOf와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. length = 0이면 -1𝔽을 반환합니다.
  5. fromIndex가 존재하지 않으면 k를 length - 1로 둡니다. 그렇지 않으면 k를 min(? ToAbsoluteIndex(fromIndex, length), length - 1)로 둡니다.
  6. k ≥ 0인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kPresent를 ! HasProperty(obj, propertyKey)로 둡니다.
    3. kPresent가 true이면, 다음을 수행합니다.
      1. elementK를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
      2. IsStrictlyEqual(searchElement, elementK)가 true이면 𝔽(k)를 반환합니다.
    4. k를 k - 1로 설정합니다.
  7. -1𝔽을 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.21 get %TypedArray%.prototype.length

%TypedArray%.prototype.length는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[TypedArrayName]])를 수행합니다.
  3. 단언: obj에는 [[ViewedArrayBuffer]] 및 [[ArrayLength]] 내부 슬롯이 있습니다.
  4. taRecord를 MakeTypedArrayWithBufferWitnessRecord(obj, seq-cst)로 둡니다.
  5. IsTypedArrayOutOfBounds(taRecord)가 true이면 +0𝔽을 반환합니다.
  6. length를 TypedArrayLength(taRecord)로 둡니다.
  7. 𝔽(length)를 반환합니다.

이 함수는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.21에 정의된 Array.prototype.map과 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. result를 ? TypedArraySpeciesCreate(obj, « 𝔽(length) »)로 둡니다.
  6. k를 0으로 둡니다.
  7. k < length인 동안 다음을 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. mappedValue를 ? Call(callback, thisArg, « kValue, 𝔽(k), obj »)로 둡니다.
    3. ? TypedArraySetElement(result, 𝔽(k), mappedValue)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  8. result를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.24에 정의된 Array.prototype.reduce와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. length = 0이고 initialValue가 존재하지 않으면 TypeError 예외를 던집니다.
  6. k를 0으로 둡니다.
  7. accumulator를 undefined로 둡니다.
  8. initialValue가 존재하면, 다음을 수행합니다.
    1. accumulator를 initialValue로 설정합니다.
  9. 그렇지 않으면,
    1. accumulator를 TypedArrayGetElement(obj, 𝔽(k))로 설정합니다.
    2. k를 k + 1로 설정합니다.
  10. k < length인 동안 다음을 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj »)로 설정합니다.
    3. k를 k + 1로 설정합니다.
  11. accumulator를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.25에 정의된 Array.prototype.reduceRight와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. length = 0이고 initialValue가 존재하지 않으면 TypeError 예외를 던집니다.
  6. k를 length - 1로 둡니다.
  7. accumulator를 undefined로 둡니다.
  8. initialValue가 존재하면, 다음을 수행합니다.
    1. accumulator를 initialValue로 설정합니다.
  9. 그렇지 않으면,
    1. accumulator를 TypedArrayGetElement(obj, 𝔽(k))로 설정합니다.
    2. k를 k - 1로 설정합니다.
  10. k ≥ 0인 동안 다음을 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), obj »)로 설정합니다.
    3. k를 k - 1로 설정합니다.
  11. accumulator를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.25 %TypedArray%.prototype.reverse ( )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.26에 정의된 Array.prototype.reverse와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. middle을 floor(length / 2)로 둡니다.
  5. lower를 0으로 둡니다.
  6. lower ≠ middle인 동안 다음을 반복합니다.
    1. upper를 length - lower - 1로 둡니다.
    2. lowerValue를 TypedArrayGetElement(obj, 𝔽(lower))로 둡니다.
    3. upperValue를 TypedArrayGetElement(obj, 𝔽(upper))로 둡니다.
    4. ! TypedArraySetElement(obj, 𝔽(lower), upperValue)를 수행합니다.
    5. ! TypedArraySetElement(obj, 𝔽(upper), lowerValue)를 수행합니다.
    6. lower를 lower + 1로 설정합니다.
  7. obj를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )

이 메서드는 source에서 값을 읽어 이 TypedArray에 여러 값을 설정합니다. 세부 사항은 source의 타입에 따라 다릅니다. 선택적 offset 값은 이 TypedArray에서 값을 쓰기 시작할 첫 번째 요소 인덱스를 나타냅니다. 생략하면 0으로 간주합니다.

호출되면 다음 단계를 수행합니다:

  1. target을 this 값으로 둡니다.
  2. ? RequireInternalSlot(target, [[TypedArrayName]])를 수행합니다.
  3. 단언: target에는 [[ViewedArrayBuffer]] 내부 슬롯이 있습니다.
  4. targetOffset을 ? ToIntegerOrInfinity(offset)로 둡니다.
  5. targetOffset < 0이면 RangeError 예외를 던집니다.
  6. source가 [[TypedArrayName]] 내부 슬롯을 갖는 Object이면, 다음을 수행합니다.
    1. ? SetTypedArrayFromTypedArray(target, targetOffset, source)를 수행합니다.
  7. 그렇지 않으면,
    1. ? SetTypedArrayFromArrayLike(target, targetOffset, source)를 수행합니다.
  8. undefined를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.26.1 SetTypedArrayFromArrayLike ( target, targetOffset, source )

추상 연산 SetTypedArrayFromArrayLike. 인수 target (TypedArray), targetOffset ((음이 아닌 정수 또는 +∞)) 및 source (an ECMAScript language value, but not a TypedArray). 반환값: (정상 완료 (값: unused) 또는 throw 완료). source에서 값을 읽어 인덱스 targetOffset부터 시작하여 target에 여러 값을 설정합니다. 호출되면 다음 단계를 수행한다.

  1. targetRecord를 ? ValidateTypedArrayBounds(target, seq-cst)로 둡니다.
  2. targetLength를 TypedArrayLength(targetRecord)로 둡니다.
  3. source를 ? ToObject(source)로 설정합니다.
  4. sourceLength를 ? LengthOfArrayLike(source)로 둡니다.
  5. targetOffset = +∞이면 RangeError 예외를 던집니다.
  6. sourceLength + targetOffset > targetLength이면 RangeError 예외를 던집니다.
  7. k를 0으로 둡니다.
  8. k < sourceLength인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. value를 ? Get(source, propertyKey)로 둡니다.
    3. targetIndex를 𝔽(targetOffset + k)로 둡니다.
    4. ? TypedArraySetElement(target, targetIndex, value)를 수행합니다.
    5. k를 k + 1로 설정합니다.
  9. unused를 반환합니다.

23.2.3.26.2 SetTypedArrayFromTypedArray ( target, targetOffset, source )

추상 연산 SetTypedArrayFromTypedArray. 인수 target (TypedArray), targetOffset ((음이 아닌 정수 또는 +∞)) 및 source (TypedArray). 반환값: (정상 완료 (값: unused) 또는 throw 완료). source에서 값을 읽어 인덱스 targetOffset부터 시작하여 target에 여러 값을 설정합니다. 호출되면 다음 단계를 수행한다.

  1. targetBuffer를 target.[[ViewedArrayBuffer]]로 둡니다.
  2. targetRecord를 ? ValidateTypedArrayBounds(target, seq-cst)로 둡니다.
  3. targetLength를 TypedArrayLength(targetRecord)로 둡니다.
  4. sourceBuffer를 source.[[ViewedArrayBuffer]]로 둡니다.
  5. sourceRecord를 ? ValidateTypedArrayBounds(source, seq-cst)로 둡니다.
  6. sourceLength를 TypedArrayLength(sourceRecord)로 둡니다.
  7. targetType을 TypedArrayElementType(target)로 둡니다.
  8. targetElementSize를 TypedArrayElementSize(target)로 둡니다.
  9. targetByteOffset을 target.[[ByteOffset]]으로 둡니다.
  10. sourceType을 TypedArrayElementType(source)로 둡니다.
  11. sourceElementSize를 TypedArrayElementSize(source)로 둡니다.
  12. sourceByteOffset을 source.[[ByteOffset]]으로 둡니다.
  13. targetOffset = +∞이면 RangeError 예외를 던집니다.
  14. sourceLength + targetOffset > targetLength이면 RangeError 예외를 던집니다.
  15. target.[[ContentType]]이 source.[[ContentType]]이 아니면 TypeError 예외를 던집니다.
  16. IsSharedArrayBuffer(sourceBuffer)가 true이고 IsSharedArrayBuffer(targetBuffer)가 true이며 sourceBuffer.[[ArrayBufferData]]가 targetBuffer.[[ArrayBufferData]]이면 sameSharedArrayBuffer를 true로 둡니다. 그렇지 않으면 sameSharedArrayBuffer를 false로 둡니다.
  17. SameValue(sourceBuffer, targetBuffer)가 true이거나 sameSharedArrayBuffer가 true이면, 다음을 수행합니다.
    1. sourceByteLength를 TypedArrayByteLength(sourceRecord)로 둡니다.
    2. sourceBuffer를 ? CloneArrayBuffer(sourceBuffer, sourceByteOffset, sourceByteLength)로 설정합니다.
    3. sourceByteIndex를 0으로 둡니다.
  18. 그렇지 않으면,
    1. sourceByteIndex를 sourceByteOffset으로 둡니다.
  19. targetByteIndex를 (targetOffset × targetElementSize) + targetByteOffset으로 둡니다.
  20. limit을 targetByteIndex + (targetElementSize × sourceLength)로 둡니다.
  21. sourceType이 targetType이면, 다음을 수행합니다.
    1. 참고: 전송은 소스 데이터의 비트 수준 인코딩을 보존하는 방식으로 수행해야 합니다.
    2. targetByteIndex < limit인 동안 다음을 반복합니다.
      1. value를 GetValueFromBuffer(sourceBuffer, sourceByteIndex, uint8, true, unordered)로 둡니다.
      2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)를 수행합니다.
      3. sourceByteIndex를 sourceByteIndex + 1로 설정합니다.
      4. targetByteIndex를 targetByteIndex + 1로 설정합니다.
  22. 그렇지 않으면,
    1. targetByteIndex < limit인 동안 다음을 반복합니다.
      1. value를 GetValueFromBuffer(sourceBuffer, sourceByteIndex, sourceType, true, unordered)로 둡니다.
      2. SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, unordered)를 수행합니다.
      3. sourceByteIndex를 sourceByteIndex + sourceElementSize로 설정합니다.
      4. targetByteIndex를 targetByteIndex + targetElementSize로 설정합니다.
  23. unused를 반환합니다.

23.2.3.27 %TypedArray%.prototype.slice ( start, end )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.28에 정의된 Array.prototype.slice와 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. sourceArrayLength를 TypedArrayLength(taRecord)로 둡니다.
  4. startIndex를 ? ToClampedIndex(start, sourceArrayLength)로 둡니다.
  5. end가 undefined이면 endIndex를 sourceArrayLength로 둡니다. 그렇지 않으면 endIndex를 ? ToClampedIndex(end, sourceArrayLength)로 둡니다.
  6. countBytes를 max(endIndex - startIndex, 0)으로 둡니다.
  7. resultArray를 ? TypedArraySpeciesCreate(obj, « 𝔽(countBytes) »)로 둡니다.
  8. countBytes > 0이면, 다음을 수행합니다.
    1. taRecord를 ? ValidateTypedArrayBounds(obj, seq-cst)로 설정합니다.
    2. endIndex를 min(endIndex, TypedArrayLength(taRecord))로 설정합니다.
    3. countBytes를 max(endIndex - startIndex, 0)으로 설정합니다.
    4. sourceType을 TypedArrayElementType(obj)로 둡니다.
    5. targetType을 TypedArrayElementType(resultArray)로 둡니다.
    6. sourceType이 targetType이면, 다음을 수행합니다.
      1. 참고: 전송은 소스 데이터의 비트 수준 인코딩을 보존하는 방식으로 수행해야 합니다.
      2. sourceBuffer를 obj.[[ViewedArrayBuffer]]로 둡니다.
      3. targetBuffer를 resultArray.[[ViewedArrayBuffer]]로 둡니다.
      4. elementSize를 TypedArrayElementSize(obj)로 둡니다.
      5. sourceByteOffset을 obj.[[ByteOffset]]으로 둡니다.
      6. sourceByteIndex를 (startIndex × elementSize) + sourceByteOffset으로 둡니다.
      7. targetByteIndex를 resultArray.[[ByteOffset]]으로 둡니다.
      8. endByteIndex를 targetByteIndex + (countBytes × elementSize)로 둡니다.
      9. targetByteIndex < endByteIndex인 동안 다음을 반복합니다.
        1. value를 GetValueFromBuffer(sourceBuffer, sourceByteIndex, uint8, true, unordered)로 둡니다.
        2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)를 수행합니다.
        3. sourceByteIndex를 sourceByteIndex + 1로 설정합니다.
        4. targetByteIndex를 targetByteIndex + 1로 설정합니다.
    7. 그렇지 않으면,
      1. n을 0으로 둡니다.
      2. k를 startIndex로 둡니다.
      3. k < endIndex인 동안 다음을 반복합니다.
        1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
        2. ! TypedArraySetElement(resultArray, 𝔽(n), kValue)를 수행합니다.
        3. k를 k + 1로 설정합니다.
        4. n을 n + 1로 설정합니다.
  9. resultArray를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.29에 정의된 Array.prototype.some과 같습니다.

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. IsCallable(callback)이 false이면 TypeError 예외를 던집니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. kValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    2. testResult를 ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »))로 둡니다.
    3. testResult가 true이면 true를 반환합니다.
    4. k를 k + 1로 설정합니다.
  7. false를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.29 %TypedArray%.prototype.sort ( comparator )

이 메서드는 별개의 메서드이지만 아래에 설명된 사항을 제외하면 23.1.3.30에 정의된 Array.prototype.sort와 동일한 요구 사항을 구현합니다. this 값이 고정된 길이를 가지며 정수 인덱스 프로퍼티가 희소하지 않은 객체라는 사실을 이용하여 이 메서드의 구현을 최적화할 수 있습니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

호출되면 다음 단계를 수행합니다:

  1. comparator가 undefined가 아니고 IsCallable(comparator)이 false이면 TypeError 예외를 던집니다.
  2. obj를 this 값으로 둡니다.
  3. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  4. length를 TypedArrayLength(taRecord)로 둡니다.
  5. 참고: 다음 클로저는 23.1.3.30에서 사용하는 문자열 비교 대신 숫자 비교를 수행합니다.
  6. sortCompare를 comparator를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, y)를 갖는 새로운 Abstract Closure로 둡니다:
    1. ? CompareTypedArrayElements(x, y, comparator)를 반환합니다.
  7. sortedList를 ? SortIndexedProperties(obj, length, sortCompare, read-through-holes)로 둡니다.
  8. j를 0으로 둡니다.
  9. j < length인 동안 다음을 반복합니다.
    1. ! TypedArraySetElement(obj, 𝔽(j), sortedList[j])를 수행합니다.
    2. j를 j + 1로 설정합니다.
  10. obj를 반환합니다.
참고

NaN은 항상 다른 모든 값보다 큰 것으로 비교되므로(CompareTypedArrayElements 참조), comparator가 제공되지 않은 경우 NaN 프로퍼티 값은 항상 결과의 끝으로 정렬됩니다.

23.2.3.30 %TypedArray%.prototype.subarray ( start, end )

이 메서드는 요소 타입이 이 TypedArray의 요소 타입이고 ArrayBuffer가 이 TypedArray의 ArrayBuffer이며, start(포함)부터 end(제외)까지의 구간에 있는 요소를 참조하는 새로운 TypedArray를 반환합니다. start 또는 end가 음수이면 배열의 시작이 아니라 끝에서부터의 인덱스를 나타냅니다.

호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? RequireInternalSlot(obj, [[TypedArrayName]])를 수행합니다.
  3. 단언: obj에는 [[ViewedArrayBuffer]] 내부 슬롯이 있습니다.
  4. buffer를 obj.[[ViewedArrayBuffer]]로 둡니다.
  5. sourceRecord를 MakeTypedArrayWithBufferWitnessRecord(obj, seq-cst)로 둡니다.
  6. IsTypedArrayOutOfBounds(sourceRecord)가 true이면, 다음을 수행합니다.
    1. sourceLength를 0으로 둡니다.
  7. 그렇지 않으면,
    1. sourceLength를 TypedArrayLength(sourceRecord)로 둡니다.
  8. startIndex를 ? ToClampedIndex(start, sourceLength)로 둡니다.
  9. elementSize를 TypedArrayElementSize(obj)로 둡니다.
  10. sourceByteOffset을 obj.[[ByteOffset]]으로 둡니다.
  11. beginByteOffset을 sourceByteOffset + (startIndex × elementSize)로 둡니다.
  12. obj.[[ArrayLength]]가 auto이고 end가 undefined이면, 다음을 수행합니다.
    1. ? TypedArraySpeciesCreate(obj, « buffer, 𝔽(beginByteOffset) »)를 반환합니다.
  13. end가 undefined이면 endIndex를 sourceLength로 둡니다. 그렇지 않으면 endIndex를 ? ToClampedIndex(end, sourceLength)로 둡니다.
  14. newLength를 max(endIndex - startIndex, 0)으로 둡니다.
  15. ? TypedArraySpeciesCreate(obj, « buffer, 𝔽(beginByteOffset), 𝔽(newLength) »)를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 갖는 객체여야 합니다.

23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402에 명시된 대로 이 메서드를 구현해야 합니다. 그렇지 않은 경우에는 다음에 제시된 이 메서드의 명세를 사용합니다.

이 메서드의 인수를 해석하고 사용하는 방식은 23.1.3.32에 정의된 Array.prototype.toLocaleString의 경우와 동일합니다.

이 메서드는 호출될 때 다음 단계를 수행합니다.

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. ? JoinIndexedProperties(obj, length, LocalizedListSeparator(), "toLocaleString")을 반환합니다.

23.2.3.32 %TypedArray%.prototype.toReversed ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. resultArray를 ? TypedArrayCreateSameType(obj, length)로 둡니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. from을 length - k - 1로 둡니다.
    2. fromValue를 TypedArrayGetElement(obj, 𝔽(from))로 둡니다.
    3. ! TypedArraySetElement(resultArray, 𝔽(k), fromValue)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  7. resultArray를 반환합니다.

23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. comparator가 undefined가 아니고 IsCallable(comparator)이 false이면 TypeError 예외를 던집니다.
  2. obj를 this 값으로 둡니다.
  3. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  4. length를 TypedArrayLength(taRecord)로 둡니다.
  5. resultArray를 ? TypedArrayCreateSameType(obj, length)로 둡니다.
  6. 참고: 다음 클로저는 23.1.3.34에서 사용하는 문자열 비교 대신 숫자 비교를 수행합니다.
  7. sortCompare를 comparator를 캡처하고 호출될 때 다음 단계를 수행하는 매개변수 (x, y)를 갖는 새로운 Abstract Closure로 둡니다:
    1. ? CompareTypedArrayElements(x, y, comparator)를 반환합니다.
  8. sortedList를 ? SortIndexedProperties(obj, length, sortCompare, read-through-holes)로 둡니다.
  9. j를 0으로 둡니다.
  10. j < length인 동안 다음을 반복합니다.
    1. ! TypedArraySetElement(resultArray, 𝔽(j), sortedList[j])를 수행합니다.
    2. j를 j + 1로 설정합니다.
  11. resultArray를 반환합니다.

23.2.3.34 %TypedArray%.prototype.toString ( )

"toString" 프로퍼티의 초기 값은 23.1.3.36에 정의된 %Array.prototype.toString%입니다.

23.2.3.35 %TypedArray%.prototype.values ( )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. ? ValidateTypedArray(obj, seq-cst)를 수행합니다.
  3. CreateArrayIterator(obj, value)를 반환합니다.

23.2.3.36 %TypedArray%.prototype.with ( index, value )

이 메서드는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. actualIndex를 ? ToAbsoluteIndex(index, length)로 둡니다.
  5. obj.[[ContentType]]이 bigint이면 numericValue를 ? ToBigInt(value)로 둡니다.
  6. 그렇지 않으면 numericValue를 ? ToNumber(value)로 둡니다.
  7. IsValidIntegerIndex(obj, 𝔽(actualIndex))가 false이면 RangeError 예외를 던집니다.
  8. resultArray를 ? TypedArrayCreateSameType(obj, length)로 둡니다.
  9. k를 0으로 둡니다.
  10. k < length인 동안 반복합니다.
    1. k = actualIndex이면 fromValue를 numericValue로 둡니다.
    2. 그렇지 않으면 fromValue를 TypedArrayGetElement(obj, 𝔽(k))로 둡니다.
    3. 참고: index 또는 value가 Number나 BigInt로 변환될 때 코드를 실행하는 객체이고, 해당 코드가 obj의 기반 버퍼를 축소하면 fromValue는 undefined일 수 있습니다.
    4. 다음을 수행합니다: ? TypedArraySetElement(resultArray, 𝔽(k), fromValue).
    5. k를 k + 1로 설정합니다.
  11. resultArray를 반환합니다.

23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 프로퍼티의 초기 값은 23.2.3.35에 정의된 %TypedArray.prototype.values%입니다.

23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]

%TypedArray%.prototype[%Symbol.toStringTag%]는 set 접근자 함수가 undefined인 접근자 프로퍼티입니다. get 접근자 함수는 호출되면 다음 단계를 수행합니다:

  1. obj를 this 값으로 둡니다.
  2. obj가 Object가 아니면 undefined를 반환합니다.
  3. obj에 [[TypedArrayName]] 내부 슬롯이 없으면 undefined를 반환합니다.
  4. name을 obj.[[TypedArrayName]]으로 둡니다.
  5. 단언: name은 String입니다.
  6. name을 반환합니다.

이 프로퍼티는 { [[Enumerable]]: false, [[Configurable]]: true } 속성을 갖습니다.

이 함수의 "name" 프로퍼티의 초기 값은 "get [Symbol.toStringTag]"입니다.

23.2.4 TypedArray 객체를 위한 추상 연산

23.2.4.1 TypedArrayCreateFromConstructor ( ctor, argList )

추상 연산 TypedArrayCreateFromConstructor. 인수 ctor (생성자) 및 argList (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: TypedArray) 또는 throw 완료). 생성자 함수를 사용하여 새로운 TypedArray를 생성하는 것을 명시하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. ta를 ? Construct(ctor, argList)로 둡니다.
  2. taRecord를 ? ValidateTypedArray(ta, seq-cst)로 둡니다.
  3. 단언: ta는 TypedArray 인스턴스의 프로퍼티에서 언급된 모든 내부 슬롯을 갖습니다.
  4. argList의 요소 수가 1이고 argList[0]이 Number이면, 다음을 수행합니다.
    1. IsTypedArrayOutOfBounds(taRecord)가 true이면 TypeError 예외를 던집니다.
    2. length를 TypedArrayLength(taRecord)로 둡니다.
    3. length < ℝ(argList[0])이면 TypeError 예외를 던집니다.
  5. ta를 반환합니다.

23.2.4.2 TypedArrayCreateSameType ( exemplar, length )

추상 연산 TypedArrayCreateSameType. 인수 exemplar (TypedArray) 및 length (음이 아닌 정수). 반환값: (정상 완료 (값: TypedArray) 또는 throw 완료). exemplar에서 파생된 생성자 함수를 사용하여 새로운 TypedArray를 생성하는 것을 명시하는 데 사용됩니다. %Symbol.species%를 사용하여 사용자 정의 TypedArray 하위 클래스를 생성할 수 있는 TypedArraySpeciesCreate와 달리 이 연산은 항상 내장 TypedArray 생성자 중 하나를 사용합니다. 호출되면 다음 단계를 수행한다.

  1. ctor를 표 71에서 생성자 이름 exemplar.[[TypedArrayName]]과 연결된 내재 객체로 둡니다.
  2. result를 ? TypedArrayCreateFromConstructor(ctor, « 𝔽(length) »)로 둡니다.
  3. 단언: result에는 [[TypedArrayName]] 및 [[ContentType]] 내부 슬롯이 있습니다.
  4. 단언: result.[[ContentType]]은 exemplar.[[ContentType]]입니다.
  5. result를 반환합니다.

23.2.4.3 TypedArraySpeciesCreate ( exemplar, argList )

추상 연산 TypedArraySpeciesCreate. 인수 exemplar (TypedArray) 및 argList (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: TypedArray) 또는 throw 완료). exemplar에서 파생된 생성자 함수를 사용하여 새로운 TypedArray를 생성하는 것을 명시하는 데 사용됩니다. %Symbol.species%를 사용하여 Array가 아닌 객체를 생성할 수 있는 ArraySpeciesCreate와 달리 이 연산은 생성자 함수가 실제 TypedArray를 생성하도록 강제합니다. 호출되면 다음 단계를 수행한다.

  1. defaultCtor를 표 71에서 생성자 이름 exemplar.[[TypedArrayName]]과 연결된 내재 객체로 둡니다.
  2. ctor를 ? SpeciesConstructor(exemplar, defaultCtor)로 둡니다.
  3. result를 ? TypedArrayCreateFromConstructor(ctor, argList)로 둡니다.
  4. result.[[ContentType]]이 exemplar.[[ContentType]]이 아니면 TypeError 예외를 던집니다.
  5. result를 반환합니다.

23.2.4.4 ValidateTypedArray ( obj, order )

추상 연산 ValidateTypedArray. 인수 obj (ECMAScript 언어 값) 및 order ((seq-cst 또는 unordered)). 반환값: (정상 완료 (값: TypedArray With Buffer Witness 레코드) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ? RequireInternalSlot(obj, [[TypedArrayName]])를 수행합니다.
  2. 단언: obj에는 [[ViewedArrayBuffer]] 내부 슬롯이 있습니다.
  3. ? ValidateTypedArrayBounds(obj, order)를 반환합니다.

23.2.4.5 ValidateTypedArrayBounds ( ta, order )

추상 연산 ValidateTypedArrayBounds. 인수 ta (TypedArray) 및 order ((seq-cst 또는 unordered)). 반환값: (정상 완료 (값: TypedArray With Buffer Witness 레코드) 또는 throw 완료). ta가 기반 버퍼의 범위를 초과하지 않는지 검증합니다. 호출되면 다음 단계를 수행한다.

  1. taRecord를 MakeTypedArrayWithBufferWitnessRecord(ta, order)로 둡니다.
  2. IsTypedArrayOutOfBounds(taRecord)가 true이면 TypeError 예외를 던집니다.
  3. taRecord를 반환합니다.

23.2.4.6 TypedArrayElementSize ( obj )

추상 연산 TypedArrayElementSize. 인수 obj (TypedArray). 반환값: 음이 아닌 정수. 호출되면 다음 단계를 수행한다.

  1. obj.[[TypedArrayName]]에 대해 표 71에 지정된 Element Size 값을 반환합니다.

23.2.4.7 TypedArrayElementType ( obj )

추상 연산 TypedArrayElementType. 인수 obj (TypedArray). 반환값: TypedArray 요소 타입. 호출되면 다음 단계를 수행한다.

  1. obj.[[TypedArrayName]]에 대해 표 71에 지정된 Element Type 값을 반환합니다.

23.2.4.8 CompareTypedArrayElements ( x, y, comparator )

추상 연산 CompareTypedArrayElements. 인수 x ((Number 또는 BigInt)), y ((Number 또는 BigInt)) 및 comparator ((함수 객체 또는 undefined)). 반환값: (정상 완료 (값: Number) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. 단언: x가 Number이고 y가 Number이거나, x가 BigInt이고 y가 BigInt입니다.
  2. comparator가 undefined가 아니면, 다음을 수행합니다.
    1. result를 ? ToNumber(? Call(comparator, undefined, « x, y »))로 둡니다.
    2. result가 NaN이면 +0𝔽을 반환합니다.
    3. result를 반환합니다.
  3. x가 NaN이고 y가 NaN이면 +0𝔽을 반환합니다.
  4. x가 NaN이면 1𝔽을 반환합니다.
  5. y가 NaN이면 -1𝔽을 반환합니다.
  6. x < y이면 -1𝔽을 반환합니다.
  7. x > y이면 1𝔽을 반환합니다.
  8. x가 -0𝔽이고 y가 +0𝔽이면 -1𝔽을 반환합니다.
  9. x가 +0𝔽이고 y가 -0𝔽이면 1𝔽을 반환합니다.
  10. +0𝔽을 반환합니다.
참고
이는 23.1.3.30.2에서 사용하는 문자열 비교 대신 숫자 비교를 수행합니다.

23.2.5 TypedArray 생성자

각 TypedArray 생성자는:

  • 달리 언급된 경우를 제외하고 표 71에서 TypedArray 대신 생성자 이름으로 사용되는 이름만 다르며 아래에 설명된 구조를 갖는 내재 객체입니다.
  • 인수의 수와 타입에 따라 동작이 달라지는 함수입니다. TypedArray 호출의 실제 동작은 전달되는 인수의 수와 종류에 따라 달라집니다.
  • 함수로 호출하도록 의도되지 않았으며 그러한 방식으로 호출되면 예외를 던집니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 TypedArray 동작을 상속하려는 하위 클래스 생성자는 %TypedArray%.prototype의 내장 메서드를 지원하는 데 필요한 내부 상태를 갖도록 하위 클래스 인스턴스를 생성하고 초기화하기 위해 TypedArray 생성자에 대한 super 호출을 포함해야 합니다.

23.2.5.1 TypedArray ( ...args )

각 TypedArray 생성자는 호출되면 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 던집니다.
  2. ctorName을 이 TypedArray 생성자에 대해 표 71에 지정된 Constructor Name 값의 String 값으로 둡니다.
  3. proto를 "%TypedArray.prototype%"로 둡니다.
  4. numberOfArgs를 args의 요소 수로 둡니다.
  5. numberOfArgs = 0이면 ? AllocateTypedArray(ctorName, NewTarget, proto, 0)을 반환합니다.
  6. firstArg를 args[0]으로 둡니다.
  7. firstArg가 Object이면, 다음을 수행합니다.
    1. obj를 ? AllocateTypedArray(ctorName, NewTarget, proto)로 둡니다.
    2. firstArg에 [[TypedArrayName]] 내부 슬롯이 있으면, 다음을 수행합니다.
      1. ? InitializeTypedArrayFromTypedArray(obj, firstArg)를 수행합니다.
    3. 그렇지 않고 firstArg에 [[ArrayBufferData]] 내부 슬롯이 있으면, 다음을 수행합니다.
      1. numberOfArgs > 1이면 byteOffset을 args[1]로 둡니다. 그렇지 않으면 byteOffset을 undefined로 둡니다.
      2. numberOfArgs > 2이면 length를 args[2]로 둡니다. 그렇지 않으면 length를 undefined로 둡니다.
      3. ? InitializeTypedArrayFromArrayBuffer(obj, firstArg, byteOffset, length)를 수행합니다.
    4. 그렇지 않으면,
      1. 단언: firstArg는 Object이고 firstArg에는 [[TypedArrayName]] 또는 [[ArrayBufferData]] 내부 슬롯 중 어느 것도 없습니다.
      2. usingIterator를 ? GetMethod(firstArg, %Symbol.iterator%)로 둡니다.
      3. usingIterator가 undefined가 아니면, 다음을 수행합니다.
        1. values를 ? IteratorToList(? GetIteratorFromMethod(firstArg, usingIterator))로 둡니다.
        2. ? InitializeTypedArrayFromList(obj, values)를 수행합니다.
      4. 그렇지 않으면,
        1. 참고: firstArg는 반복 가능 객체가 아니므로 이미 배열과 유사한 객체라고 가정합니다.
        2. ? InitializeTypedArrayFromArrayLike(obj, firstArg)를 수행합니다.
    5. obj를 반환합니다.
  8. 단언: firstArg는 Object가 아닙니다.
  9. elementLength를 ? ToIndex(firstArg)로 둡니다.
  10. ? AllocateTypedArray(ctorName, NewTarget, proto, elementLength)를 반환합니다.

23.2.5.1.1 AllocateTypedArray ( ctorName, newTarget, defaultProto [ , length ] )

추상 연산 AllocateTypedArray. 인수 ctorName (a String which is the name of a TypedArray constructor in 표 71), newTarget (생성자) 및 defaultProto (String) 및 선택적 인수 length (음이 아닌 정수). 반환값: (정상 완료 (값: TypedArray) 또는 throw 완료). TypedArray 생성자의 인스턴스를 검증하고 생성하는 데 사용됩니다. length 인수가 전달되면 해당 길이의 ArrayBuffer도 할당하여 새로운 TypedArray 인스턴스와 연결합니다. AllocateTypedArray는 TypedArray가 사용하는 공통 의미론을 제공합니다. 호출되면 다음 단계를 수행한다.

  1. proto를 ? GetPrototypeFromConstructor(newTarget, defaultProto)로 둡니다.
  2. obj를 TypedArrayCreate(proto)로 둡니다.
  3. 단언: obj.[[ViewedArrayBuffer]]는 undefined입니다.
  4. obj.[[TypedArrayName]]을 ctorName으로 설정합니다.
  5. ctorName이 "BigInt64Array" 또는 "BigUint64Array" 중 하나이면 obj.[[ContentType]]을 bigint로 설정합니다.
  6. 그렇지 않으면 obj.[[ContentType]]을 number로 설정합니다.
  7. length가 존재하지 않으면, 다음을 수행합니다.
    1. obj.[[ByteLength]]를 0으로 설정합니다.
    2. obj.[[ByteOffset]]을 0으로 설정합니다.
    3. obj.[[ArrayLength]]를 0으로 설정합니다.
  8. 그렇지 않으면,
    1. ? AllocateTypedArrayBuffer(obj, length)를 수행합니다.
  9. obj를 반환합니다.

23.2.5.1.2 InitializeTypedArrayFromTypedArray ( obj, sourceArray )

추상 연산 InitializeTypedArrayFromTypedArray. 인수 obj (TypedArray) 및 sourceArray (TypedArray). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. sourceData를 sourceArray.[[ViewedArrayBuffer]]로 둡니다.
  2. elementType을 TypedArrayElementType(obj)로 둡니다.
  3. elementSize를 TypedArrayElementSize(obj)로 둡니다.
  4. sourceType을 TypedArrayElementType(sourceArray)로 둡니다.
  5. sourceElementSize를 TypedArrayElementSize(sourceArray)로 둡니다.
  6. sourceByteOffset을 sourceArray.[[ByteOffset]]으로 둡니다.
  7. sourceRecord를 ? ValidateTypedArrayBounds(sourceArray, seq-cst)로 둡니다.
  8. elementLength를 TypedArrayLength(sourceRecord)로 둡니다.
  9. byteLength를 elementSize × elementLength로 둡니다.
  10. elementType이 sourceType이면, 다음을 수행합니다.
    1. data를 ? CloneArrayBuffer(sourceData, sourceByteOffset, byteLength)로 둡니다.
  11. 그렇지 않으면,
    1. data를 ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)로 둡니다.
    2. sourceArray.[[ContentType]]이 obj.[[ContentType]]이 아니면 TypeError 예외를 던집니다.
    3. sourceByteIndex를 sourceByteOffset으로 둡니다.
    4. targetByteIndex를 0으로 둡니다.
    5. count를 elementLength로 둡니다.
    6. count > 0인 동안 다음을 반복합니다.
      1. value를 GetValueFromBuffer(sourceData, sourceByteIndex, sourceType, true, unordered)로 둡니다.
      2. SetValueInBuffer(data, targetByteIndex, elementType, value, true, unordered)를 수행합니다.
      3. sourceByteIndex를 sourceByteIndex + sourceElementSize로 설정합니다.
      4. targetByteIndex를 targetByteIndex + elementSize로 설정합니다.
      5. count를 count - 1로 설정합니다.
  12. obj.[[ViewedArrayBuffer]]를 data로 설정합니다.
  13. obj.[[ByteLength]]를 byteLength로 설정합니다.
  14. obj.[[ByteOffset]]을 0으로 설정합니다.
  15. obj.[[ArrayLength]]를 elementLength로 설정합니다.
  16. unused를 반환합니다.

23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( obj, buffer, byteOffset, length )

추상 연산 InitializeTypedArrayFromArrayBuffer. 인수 obj (TypedArray), buffer ((ArrayBuffer 또는 SharedArrayBuffer)), byteOffset (ECMAScript 언어 값) 및 length (ECMAScript 언어 값). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. elementSize를 TypedArrayElementSize(obj)로 둡니다.
  2. offset을 ? ToIndex(byteOffset)로 둡니다.
  3. offset modulo elementSize ≠ 0이면 RangeError 예외를 던집니다.
  4. bufferIsFixedLength를 IsFixedLengthArrayBuffer(buffer)로 둡니다.
  5. length가 undefined가 아니면, 다음을 수행합니다.
    1. newLength를 ? ToIndex(length)로 둡니다.
  6. IsDetachedBuffer(buffer)가 true이면 TypeError 예외를 던집니다.
  7. bufferByteLength를 ArrayBufferByteLength(buffer, seq-cst)로 둡니다.
  8. length가 undefined이고 bufferIsFixedLength가 false이면, 다음을 수행합니다.
    1. offset > bufferByteLength이면 RangeError 예외를 던집니다.
    2. obj.[[ByteLength]]를 auto로 설정합니다.
    3. obj.[[ArrayLength]]를 auto로 설정합니다.
  9. 그렇지 않으면,
    1. length가 undefined이면, 다음을 수행합니다.
      1. bufferByteLength modulo elementSize ≠ 0이면 RangeError 예외를 던집니다.
      2. newByteLength를 bufferByteLength - offset으로 둡니다.
      3. newByteLength < 0이면 RangeError 예외를 던집니다.
    2. 그렇지 않으면,
      1. newByteLength를 newLength × elementSize로 둡니다.
      2. offset + newByteLength > bufferByteLength이면 RangeError 예외를 던집니다.
    3. obj.[[ByteLength]]를 newByteLength로 설정합니다.
    4. obj.[[ArrayLength]]를 newByteLength / elementSize로 설정합니다.
  10. obj.[[ViewedArrayBuffer]]를 buffer로 설정합니다.
  11. obj.[[ByteOffset]]을 offset으로 설정합니다.
  12. unused를 반환합니다.

23.2.5.1.4 InitializeTypedArrayFromList ( obj, values )

추상 연산 InitializeTypedArrayFromList. 인수 obj (TypedArray) 및 values (리스트 (요소: ECMAScript 언어 값)). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. length를 values의 요소 수로 둡니다.
  2. ? AllocateTypedArrayBuffer(obj, length)를 수행합니다.
  3. k를 0으로 둡니다.
  4. k < length인 동안 다음을 반복합니다.
    1. kValue를 values[k]로 둡니다.
    2. ? TypedArraySetElement(obj, 𝔽(k), kValue)를 수행합니다.
    3. k를 k + 1로 설정합니다.
  5. unused를 반환합니다.

23.2.5.1.5 InitializeTypedArrayFromArrayLike ( obj, arrayLike )

추상 연산 InitializeTypedArrayFromArrayLike. 인수 obj (TypedArray) 및 arrayLike (an Object, but not a TypedArray or an ArrayBuffer). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. length를 ? LengthOfArrayLike(arrayLike)로 둡니다.
  2. ? AllocateTypedArrayBuffer(obj, length)를 수행합니다.
  3. k를 0으로 둡니다.
  4. k < length인 동안 다음을 반복합니다.
    1. propertyKey를 ! ToString(𝔽(k))로 둡니다.
    2. kValue를 ? Get(arrayLike, propertyKey)로 둡니다.
    3. ? TypedArraySetElement(obj, 𝔽(k), kValue)를 수행합니다.
    4. k를 k + 1로 설정합니다.
  5. unused를 반환합니다.

23.2.5.1.6 AllocateTypedArrayBuffer ( obj, length )

추상 연산 AllocateTypedArrayBuffer. 인수 obj (TypedArray) 및 length (음이 아닌 정수). 반환값: (정상 완료 (값: unused) 또는 throw 완료). ArrayBuffer를 할당하여 obj와 연결합니다. 호출되면 다음 단계를 수행한다.

  1. 단언: obj.[[ViewedArrayBuffer]]는 undefined입니다.
  2. elementSize를 TypedArrayElementSize(obj)로 둡니다.
  3. byteLength를 elementSize × length로 둡니다.
  4. data를 ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)로 둡니다.
  5. obj.[[ViewedArrayBuffer]]를 data로 설정합니다.
  6. obj.[[ByteLength]]를 byteLength로 설정합니다.
  7. obj.[[ByteOffset]]을 0으로 설정합니다.
  8. obj.[[ArrayLength]]를 length로 설정합니다.
  9. unused를 반환합니다.

23.2.6 TypedArray 생성자의 프로퍼티

각 TypedArray 생성자는:

  • 값이 %TypedArray%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 값이 3𝔽인 "length" 프로퍼티를 갖습니다.
  • 값이 표 71에서 해당 생성자에 지정된 생성자 이름의 String 값인 "name" 프로퍼티를 갖습니다.
  • 다음 프로퍼티를 갖습니다:

23.2.6.1 TypedArray.BYTES_PER_ELEMENT

TypedArray.BYTES_PER_ELEMENT의 값은 TypedArray에 대해 표 71에 지정된 Element Size 값입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

23.2.6.2 TypedArray.prototype

TypedArray.prototype의 초기 값은 대응하는 TypedArray 프로토타입 내재 객체(23.2.7)입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

23.2.7 TypedArray 프로토타입 객체의 프로퍼티

각 TypedArray 프로토타입 객체는:

  • 값이 %TypedArray.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • 일반 객체입니다.
  • [[ViewedArrayBuffer]] 또는 TypedArray 인스턴스 객체에 고유한 다른 어떤 내부 슬롯도 갖지 않습니다.

23.2.7.1 TypedArray.prototype.BYTES_PER_ELEMENT

TypedArray.prototype.BYTES_PER_ELEMENT의 값은 TypedArray에 대해 표 71에 지정된 Element Size 값입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 갖습니다.

23.2.7.2 TypedArray.prototype.constructor

주어진 TypedArray 생성자의 프로토타입에 있는 "constructor" 프로퍼티의 초기 값은 해당 생성자 자체입니다.

23.2.8 TypedArray 인스턴스의 프로퍼티

TypedArray 인스턴스는 TypedArray입니다. 각 TypedArray 인스턴스는 대응하는 TypedArray 프로토타입 객체에서 프로퍼티를 상속합니다. 각 TypedArray 인스턴스는 [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] 내부 슬롯을 갖습니다.

23.3 Uint8Array 객체

Uint8Array는 위에서 설명한 특정 종류의 TypedArray입니다. 또한 Uint8Array 생성자(23.3.1)와 Uint8Array 프로토타입 객체(23.3.2)에는 추가 메서드가 있습니다.

23.3.1 Uint8Array 생성자의 추가 프로퍼티

23.3.1.1 Uint8Array.fromBase64 ( string [ , options ] )

  1. string이 String이 아니면 TypeError 예외를 던집니다.
  2. optionsObj를 ? GetOptionsObject(options)로 둡니다.
  3. alphabet을 ? Get(optionsObj, "alphabet")로 둡니다.
  4. alphabet이 undefined이면 alphabet을 "base64"로 설정합니다.
  5. alphabet이 "base64"도 "base64url"도 아니면 TypeError 예외를 던집니다.
  6. lastChunkHandling을 ? Get(optionsObj, "lastChunkHandling")로 둡니다.
  7. lastChunkHandling이 undefined이면 lastChunkHandling을 "loose"로 설정합니다.
  8. lastChunkHandling이 "loose", "strict" 또는 "stop-before-partial" 중 하나가 아니면 TypeError 예외를 던집니다.
  9. result를 FromBase64(string, alphabet, lastChunkHandling)로 둡니다.
  10. result.[[Error]]가 none이 아니면, 다음을 수행합니다.
    1. result.[[Error]]를 던집니다.
  11. resultLength를 result.[[Bytes]]의 요소 수로 둡니다.
  12. ta를 ? AllocateTypedArray("Uint8Array", %Uint8Array%, "%Uint8Array.prototype%", resultLength)로 둡니다.
  13. 단언: ta.[[ViewedArrayBuffer]].[[ArrayBufferByteLength]]는 result.[[Bytes]]의 요소 수입니다.
  14. ta.[[ViewedArrayBuffer]].[[ArrayBufferData]]의 각 인덱스 값을 result.[[Bytes]]의 대응하는 인덱스 값으로 설정합니다.
  15. ta를 반환합니다.

23.3.1.2 Uint8Array.fromHex ( string )

  1. string이 String이 아니면 TypeError 예외를 던집니다.
  2. result를 FromHex(string)로 둡니다.
  3. result.[[Error]]가 none이 아니면, 다음을 수행합니다.
    1. result.[[Error]]를 던집니다.
  4. resultLength를 result.[[Bytes]]의 요소 수로 둡니다.
  5. ta를 ? AllocateTypedArray("Uint8Array", %Uint8Array%, "%Uint8Array.prototype%", resultLength)로 둡니다.
  6. 단언: ta.[[ViewedArrayBuffer]].[[ArrayBufferByteLength]]는 result.[[Bytes]]의 요소 수입니다.
  7. ta.[[ViewedArrayBuffer]].[[ArrayBufferData]]의 각 인덱스 값을 result.[[Bytes]]의 대응하는 인덱스 값으로 설정합니다.
  8. ta를 반환합니다.

23.3.2 Uint8Array 프로토타입 객체의 추가 프로퍼티

23.3.2.1 Uint8Array.prototype.setFromBase64 ( string [ , options ] )

  1. into를 this 값으로 둡니다.
  2. ? ValidateUint8Array(into)를 수행합니다.
  3. string이 String이 아니면 TypeError 예외를 던집니다.
  4. optionsObj를 ? GetOptionsObject(options)로 둡니다.
  5. alphabet을 ? Get(optionsObj, "alphabet")로 둡니다.
  6. alphabet이 undefined이면 alphabet을 "base64"로 설정합니다.
  7. alphabet이 "base64"도 "base64url"도 아니면 TypeError 예외를 던집니다.
  8. lastChunkHandling을 ? Get(optionsObj, "lastChunkHandling")로 둡니다.
  9. lastChunkHandling이 undefined이면 lastChunkHandling을 "loose"로 설정합니다.
  10. lastChunkHandling이 "loose", "strict" 또는 "stop-before-partial" 중 하나가 아니면 TypeError 예외를 던집니다.
  11. taRecord를 ? ValidateTypedArrayBounds(into, seq-cst)로 둡니다.
  12. byteLength를 TypedArrayLength(taRecord)로 둡니다.
  13. result를 FromBase64(string, alphabet, lastChunkHandling, byteLength)로 둡니다.
  14. bytes를 result.[[Bytes]]로 둡니다.
  15. written을 bytes의 요소 수로 둡니다.
  16. 참고: FromBase64는 사용자 코드를 호출하지 않으므로 into의 기반 ArrayBuffer는 분리되거나 축소될 수 없습니다.
  17. 단언: written ≤ byteLength입니다.
  18. SetUint8ArrayBytes(into, bytes)를 수행합니다.
  19. result.[[Error]]가 none이 아니면, 다음을 수행합니다.
    1. result.[[Error]]를 던집니다.
  20. resultObj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  21. ! CreateDataPropertyOrThrow(resultObj, "read", 𝔽(result.[[Read]]))를 수행합니다.
  22. ! CreateDataPropertyOrThrow(resultObj, "written", 𝔽(written))을 수행합니다.
  23. resultObj를 반환합니다.

23.3.2.2 Uint8Array.prototype.setFromHex ( string )

  1. into를 this 값으로 둡니다.
  2. ? ValidateUint8Array(into)를 수행합니다.
  3. string이 String이 아니면 TypeError 예외를 던집니다.
  4. taRecord를 ? ValidateTypedArrayBounds(into, seq-cst)로 둡니다.
  5. byteLength를 TypedArrayLength(taRecord)로 둡니다.
  6. result를 FromHex(string, byteLength)로 둡니다.
  7. bytes를 result.[[Bytes]]로 둡니다.
  8. written을 bytes의 요소 수로 둡니다.
  9. 참고: FromHex는 사용자 코드를 호출하지 않으므로 into의 기반 ArrayBuffer는 분리되거나 축소될 수 없습니다.
  10. 단언: written ≤ byteLength입니다.
  11. SetUint8ArrayBytes(into, bytes)를 수행합니다.
  12. result.[[Error]]가 none이 아니면, 다음을 수행합니다.
    1. result.[[Error]]를 던집니다.
  13. resultObj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  14. ! CreateDataPropertyOrThrow(resultObj, "read", 𝔽(result.[[Read]]))를 수행합니다.
  15. ! CreateDataPropertyOrThrow(resultObj, "written", 𝔽(written))을 수행합니다.
  16. resultObj를 반환합니다.

23.3.2.3 Uint8Array.prototype.toBase64 ( [ options ] )

  1. obj를 this 값으로 둡니다.
  2. ? ValidateUint8Array(obj)를 수행합니다.
  3. optionsObj를 ? GetOptionsObject(options)로 둡니다.
  4. alphabet을 ? Get(optionsObj, "alphabet")로 둡니다.
  5. alphabet이 undefined이면 alphabet을 "base64"로 설정합니다.
  6. alphabet이 "base64"도 "base64url"도 아니면 TypeError 예외를 던집니다.
  7. omitPadding을 ToBoolean(? Get(optionsObj, "omitPadding"))으로 둡니다.
  8. toEncode를 ? GetUint8ArrayBytes(obj)로 둡니다.
  9. alphabet이 "base64"이면, 다음을 수행합니다.
    1. outAscii를 RFC 4648 제4절에 지정된 base64 인코딩에 따라 toEncode를 인코딩한 결과인 코드 포인트 시퀀스로 둡니다. 패딩은 omitPadding이 false인 경우에만 포함됩니다.
  10. 그렇지 않으면,
    1. 단언: alphabet은 "base64url"입니다.
    2. outAscii를 RFC 4648 제5절에 지정된 base64url 인코딩에 따라 toEncode를 인코딩한 결과인 코드 포인트 시퀀스로 둡니다. 패딩은 omitPadding이 false인 경우에만 포함됩니다.
  11. CodePointsToString(outAscii)을 반환합니다.

23.3.2.4 Uint8Array.prototype.toHex ( )

  1. obj를 this 값으로 둡니다.
  2. ? ValidateUint8Array(obj)를 수행합니다.
  3. toEncode를 ? GetUint8ArrayBytes(obj)로 둡니다.
  4. out을 빈 String으로 둡니다.
  5. toEncode의 각 바이트 byte에 대해 다음을 수행합니다.
    1. hex를 Number::toString(𝔽(byte), 16)으로 둡니다.
    2. hex를 StringPad(hex, 2, "0", start)로 설정합니다.
    3. out을 out과 hex의 문자열 연결로 설정합니다.
  6. out을 반환합니다.

23.3.3 Uint8Array 객체를 위한 추상 연산

23.3.3.1 ValidateUint8Array ( ta )

추상 연산 ValidateUint8Array. 인수 ta (ECMAScript 언어 값). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. ? RequireInternalSlot(ta, [[TypedArrayName]])를 수행합니다.
  2. ta.[[TypedArrayName]]이 "Uint8Array"가 아니면 TypeError 예외를 던집니다.
  3. unused를 반환합니다.

23.3.3.2 GetUint8ArrayBytes ( ta )

추상 연산 GetUint8ArrayBytes. 인수 ta (Uint8Array). 반환값: (정상 완료 (값: 리스트 (요소: 바이트 값)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. buffer를 ta.[[ViewedArrayBuffer]]로 둡니다.
  2. taRecord를 ? ValidateTypedArrayBounds(ta, seq-cst)로 둡니다.
  3. length를 TypedArrayLength(taRecord)로 둡니다.
  4. byteOffset을 ta.[[ByteOffset]]으로 둡니다.
  5. bytes를 새로운 빈 List로 둡니다.
  6. index를 0으로 둡니다.
  7. index < length인 동안 다음을 반복합니다.
    1. byteIndex를 byteOffset + index로 둡니다.
    2. byte를 ℝ(GetValueFromBuffer(buffer, byteIndex, uint8, true, unordered))로 둡니다.
    3. byte를 bytes에 추가합니다.
    4. index를 index + 1로 설정합니다.
  8. bytes를 반환합니다.

23.3.3.3 SetUint8ArrayBytes ( into, bytes )

추상 연산 SetUint8ArrayBytes. 인수 into (Uint8Array) 및 bytes (리스트 (요소: 바이트 값)). 반환값: unused. 호출되면 다음 단계를 수행한다.

  1. offset을 into.[[ByteOffset]]으로 둡니다.
  2. length를 bytes의 요소 수로 둡니다.
  3. index를 0으로 둡니다.
  4. index < length인 동안 다음을 반복합니다.
    1. byte를 bytes[index]로 둡니다.
    2. byteIndexInBuffer를 index + offset으로 둡니다.
    3. SetValueInBuffer(into.[[ViewedArrayBuffer]], byteIndexInBuffer, uint8, 𝔽(byte), true, unordered)를 수행합니다.
    4. index를 index + 1로 설정합니다.
  5. unused를 반환합니다.

23.3.3.4 SkipAsciiWhitespace ( string, index )

추상 연산 SkipAsciiWhitespace. 인수 string (String) 및 index (음이 아닌 정수). 반환값: 음이 아닌 정수. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. index < length인 동안 다음을 반복합니다.
    1. char를 string 안의 인덱스 index에 있는 코드 단위로 둡니다.
    2. char가 0x0009 (TAB), 0x000A (LF), 0x000C (FF), 0x000D (CR) 또는 0x0020 (SPACE) 중 하나가 아니면, 다음을 수행합니다.
      1. index를 반환합니다.
    3. index를 index + 1로 설정합니다.
  3. index를 반환합니다.

23.3.3.5 DecodeFinalBase64Chunk ( chunk, throwOnExtraBits )

추상 연산 DecodeFinalBase64Chunk. 인수 chunk ((a String of length 2 또는 3)) 및 throwOnExtraBits (Boolean). 반환값: (정상 완료 (값: 리스트 (요소: 바이트 값)) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. chunkLength를 chunk의 길이로 둡니다.
  2. chunkLength = 2이면, 다음을 수행합니다.
    1. chunk를 chunk과 "AA"의 문자열 연결로 설정합니다.
  3. 그렇지 않으면,
    1. 단언: chunkLength는 3입니다.
    2. chunk를 chunk과 "A"의 문자열 연결로 설정합니다.
  4. bytes를 DecodeFullLengthBase64Chunk(chunk)로 둡니다.
  5. chunkLength = 2이면, 다음을 수행합니다.
    1. throwOnExtraBits가 true이고 bytes[1] ≠ 0이면 SyntaxError 예외를 던집니다.
    2. « bytes[0] »을 반환합니다.
  6. throwOnExtraBits가 true이고 bytes[2] ≠ 0이면 SyntaxError 예외를 던집니다.
  7. « bytes[0], bytes[1] »을 반환합니다.

23.3.3.6 DecodeFullLengthBase64Chunk ( chunk )

추상 연산 DecodeFullLengthBase64Chunk. 인수 chunk (a String of length 4). 반환값: 리스트 (요소: byte values of length 3).

표준 base64 알파벳은 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"입니다. 즉, 유니코드 Basic Latin 블록의 모든 문자와 숫자에 대응하는 코드 단위에 "+" 및 "/"를 더한 것을 요소로 갖는 String입니다.

  1. byteSequence를 chunk를 base64로 디코딩하여 얻는 고유한 3바이트 시퀀스로 둡니다(즉, RFC 4648 제4절에 지정된 base64 인코딩을 byteSequence에 적용하면 chunk가 생성되는 시퀀스).
  2. byteSequence의 요소를 순서대로 요소로 갖는 List를 반환합니다.

23.3.3.7 FromBase64 ( string, alphabet, lastChunkHandling [ , maxLength ] )

추상 연산 FromBase64. 인수 string (String), alphabet (("base64" 또는 "base64url")) 및 lastChunkHandling (("loose", "strict" 또는 "stop-before-partial")) 및 선택적 인수 maxLength (음이 아닌 정수). 반환값: 레코드 (필드: [[Read]] (정수), [[Bytes]] (리스트 (요소: 바이트 값)), [[Error]] ((a SyntaxError object 또는 none))). 호출되면 다음 단계를 수행한다.

  1. maxLength가 존재하지 않으면, 다음을 수행합니다.
    1. maxLength를 253 - 1로 설정합니다.
    2. 참고: 입력이 String이므로 String의 길이는 253 - 1자로 제한되고, 출력에 필요한 바이트 수는 입력의 문자 수보다 많지 않으므로 이 제한에는 절대 도달할 수 없습니다. 그러나 편집상 maxLength에 유한 값을 사용하는 것이 편리합니다.
  2. 참고: 아래 알고리즘에서 검증과 디코딩의 순서는 관찰할 수 없습니다. 구현체는 가장 효율적인 순서로 수행하는 것이 권장되며, 검증과 디코딩을 서로 섞어서 수행할 수도 있습니다.
  3. maxLength = 0이면, 다음을 수행합니다.
    1. Record { [[Read]]: 0, [[Bytes]]: « », [[Error]]: none }을 반환합니다.
  4. read를 0으로 둡니다.
  5. bytes를 새로운 빈 List로 둡니다.
  6. chunk을 빈 String으로 둡니다.
  7. chunkLength를 0으로 둡니다.
  8. index를 0으로 둡니다.
  9. length를 string의 길이로 둡니다.
  10. 다음을 반복합니다.
    1. 단언: bytes의 요소 수는 3으로 나누어떨어집니다.
    2. index를 SkipAsciiWhitespace(string, index)로 설정합니다.
    3. index = length이면, 다음을 수행합니다.
      1. chunkLength > 0이면, 다음을 수행합니다.
        1. lastChunkHandling이 "stop-before-partial"이면, 다음을 수행합니다.
          1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.
        2. lastChunkHandling이 "strict"이면, 다음을 수행합니다.
          1. error를 새로 생성된 SyntaxError 객체로 둡니다.
          2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
        3. 단언: lastChunkHandling은 "loose"입니다.
        4. chunkLength = 1이면, 다음을 수행합니다.
          1. error를 새로 생성된 SyntaxError 객체로 둡니다.
          2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
        5. bytes를 bytes와 ! DecodeFinalBase64Chunk(chunk, false)의 목록 연결로 설정합니다.
      2. Record { [[Read]]: length, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.
    4. char를 string의 index부터 index + 1까지의 부분 문자열로 둡니다.
    5. index를 index + 1로 설정합니다.
    6. char가 "="이면, 다음을 수행합니다.
      1. chunkLength < 2이면, 다음을 수행합니다.
        1. error를 새로 생성된 SyntaxError 객체로 둡니다.
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
      2. index를 SkipAsciiWhitespace(string, index)로 설정합니다.
      3. chunkLength = 2이면, 다음을 수행합니다.
        1. index = length이면, 다음을 수행합니다.
          1. lastChunkHandling이 "stop-before-partial"이면, 다음을 수행합니다.
            1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.
          2. error를 새로 생성된 SyntaxError 객체로 둡니다.
          3. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
        2. char를 string의 index부터 index + 1까지의 부분 문자열로 설정합니다.
        3. char가 "="이면, 다음을 수행합니다.
          1. index를 SkipAsciiWhitespace(string, index + 1)로 설정합니다.
      4. index < length이면, 다음을 수행합니다.
        1. error를 새로 생성된 SyntaxError 객체로 둡니다.
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
      5. lastChunkHandling이 "strict"이면 throwOnExtraBits를 true로 둡니다. 그렇지 않으면 throwOnExtraBits를 false로 둡니다.
      6. decodeResult를 Completion(DecodeFinalBase64Chunk(chunk, throwOnExtraBits))로 둡니다.
      7. decodeResult가 갑작스러운 완료이면, 다음을 수행합니다.
        1. error를 decodeResult.[[Value]]로 둡니다.
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
      8. bytes를 bytes와 ! decodeResult의 목록 연결로 설정합니다.
      9. Record { [[Read]]: length, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.
    7. alphabet이 "base64url"이면, 다음을 수행합니다.
      1. char가 "+" 또는 "/" 중 하나이면, 다음을 수행합니다.
        1. error를 새로 생성된 SyntaxError 객체로 둡니다.
        2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
      2. 그렇지 않고 char가 "-"이면, 다음을 수행합니다.
        1. char를 "+"로 설정합니다.
      3. 그렇지 않고 char가 "_"이면, 다음을 수행합니다.
        1. char를 "/"로 설정합니다.
    8. char의 유일한 코드 단위가 표준 base64 알파벳의 요소가 아니면, 다음을 수행합니다.
      1. error를 새로 생성된 SyntaxError 객체로 둡니다.
      2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
    9. remaining을 maxLength - bytes의 요소 수로 둡니다.
    10. remaining = 1이고 chunkLength = 2이거나, remaining = 2이고 chunkLength = 3이면, 다음을 수행합니다.
      1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.
    11. chunk을 chunk과 char의 문자열 연결로 설정합니다.
    12. chunkLength를 chunk의 길이로 설정합니다.
    13. chunkLength = 4이면, 다음을 수행합니다.
      1. bytes를 bytes와 DecodeFullLengthBase64Chunk(chunk)의 목록 연결로 설정합니다.
      2. chunk을 빈 String으로 설정합니다.
      3. chunkLength를 0으로 설정합니다.
      4. read를 index로 설정합니다.
      5. bytes의 요소 수 = maxLength이면, 다음을 수행합니다.
        1. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.

23.3.3.8 FromHex ( string [ , maxLength ] )

추상 연산 FromHex. 인수 string (String) 및 선택적 인수 maxLength (음이 아닌 정수). 반환값: 레코드 (필드: [[Read]] (정수), [[Bytes]] (리스트 (요소: 바이트 값)), [[Error]] ((a SyntaxError object 또는 none))). 호출되면 다음 단계를 수행한다.

  1. maxLength가 존재하지 않으면 maxLength를 253 - 1로 설정합니다.
  2. length를 string의 길이로 둡니다.
  3. bytes를 새로운 빈 List로 둡니다.
  4. read를 0으로 둡니다.
  5. length modulo 2 ≠ 0이면, 다음을 수행합니다.
    1. error를 새로 생성된 SyntaxError 객체로 둡니다.
    2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
  6. read < length이고 bytes의 요소 수 < maxLength인 동안 다음을 반복합니다.
    1. hexits를 string의 read부터 read + 2까지의 부분 문자열로 둡니다.
    2. hexits에 "0123456789abcdefABCDEF"에 포함되지 않은 코드 단위가 있으면, 다음을 수행합니다.
      1. error를 새로 생성된 SyntaxError 객체로 둡니다.
      2. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: error }를 반환합니다.
    3. read를 read + 2로 설정합니다.
    4. byte를 16진법 표기에서 hexits가 나타내는 정수 값으로 둡니다. 값 10부터 15까지의 숫자에는 문자 A부터 F 및 a부터 f를 사용합니다.
    5. byte를 bytes에 추가합니다.
  7. Record { [[Read]]: read, [[Bytes]]: bytes, [[Error]]: none }을 반환합니다.