update Iterator.range following the actual spec version to throw a RangeError on NaN start / end / step

This commit is contained in:
Denis Pushkarev
2026-02-13 23:43:32 +02:00
parent bf0204e299
commit 65825da182
6 changed files with 28 additions and 23 deletions
+1
View File
@@ -1,6 +1,7 @@
# Changelog
### Unreleased
- Improved performance of `atob` and `btoa`, [#1503](https://github.com/zloirock/core-js/issues/1503), [#1464](https://github.com/zloirock/core-js/issues/1464)
- [`Iterator.range`](https://github.com/tc39/proposal-iterator.range) updated following the actual spec version to throw a `RangeError` on `NaN` `start` / `end` / `step`
- Forced replacement of `Iterator.{ concat, zip, zipKeyed }` in the pure version for ensuring proper wrapped `Iterator` instances as the result
- Fixed some cases of iterators closing in `Iterator.{ zip, zipKeyed }` polyfill in the `strict` mode
- Fixed `DataView.prototype.setFloat16` polyfill in (0, 1) range
@@ -17,6 +17,10 @@ var $RangeError = RangeError;
var $TypeError = TypeError;
var $RangeIterator = createIteratorConstructor(function NumericRangeIterator(start, end, option, type, zero, one) {
// eslint-disable-next-line no-self-compare -- NaN check
if (start !== start || end !== end) {
throw new $RangeError(INCORRECT_RANGE);
}
// TODO: Drop the first `typeof` check after removing legacy methods in `core-js@4`
if (typeof start != type || (end !== Infinity && end !== -Infinity && typeof end != type)) {
throw new $TypeError(INCORRECT_RANGE);
@@ -43,11 +47,11 @@ var $RangeIterator = createIteratorConstructor(function NumericRangeIterator(sta
if (typeof step != type) {
throw new $TypeError(INCORRECT_RANGE);
}
if (step === Infinity || step === -Infinity || (step === zero && start !== end)) {
// eslint-disable-next-line no-self-compare -- NaN check
if (step !== step || step === Infinity || step === -Infinity || (step === zero && start !== end)) {
throw new $RangeError(INCORRECT_RANGE);
}
// eslint-disable-next-line no-self-compare -- NaN check
var hitsEnd = start !== start || end !== end || step !== step || (end > start) !== (step > zero);
var hitsEnd = end > start !== step > zero;
setInternalState(this, {
type: NUMERIC_RANGE_ITERATOR,
start: start,
+5 -5
View File
@@ -35,11 +35,11 @@ QUnit.test('Iterator.range', assert => {
assert.deepEqual(from(range(0, 0)), []);
assert.deepEqual(from(range(0, -5, 1)), []);
assert.deepEqual(from(range(NaN, 0)), []);
assert.deepEqual(from(range(0, NaN)), []);
assert.deepEqual(from(range(NaN, NaN)), []);
assert.deepEqual(from(range(0, 0, { step: NaN })), []);
assert.deepEqual(from(range(0, 5, NaN)), []);
assert.throws(() => range(NaN, 0), RangeError, 'NaN as start');
assert.throws(() => range(0, NaN), RangeError, 'NaN as end');
assert.throws(() => range(NaN, NaN), RangeError, 'NaN as start and end');
assert.throws(() => range(0, 0, { step: NaN }), RangeError, 'NaN as step option');
assert.throws(() => range(0, 5, NaN), RangeError, 'NaN as step argument');
iterator = range(1, 3);
assert.deepEqual(iterator.start, 1);
+5 -5
View File
@@ -35,11 +35,11 @@ QUnit.test('Number.range', assert => {
assert.deepEqual(from(range(0, 0)), []);
assert.deepEqual(from(range(0, -5, 1)), []);
assert.deepEqual(from(range(NaN, 0)), []);
assert.deepEqual(from(range(0, NaN)), []);
assert.deepEqual(from(range(NaN, NaN)), []);
assert.deepEqual(from(range(0, 0, { step: NaN })), []);
assert.deepEqual(from(range(0, 5, NaN)), []);
assert.throws(() => range(NaN, 0), RangeError, 'NaN as start');
assert.throws(() => range(0, NaN), RangeError, 'NaN as end');
assert.throws(() => range(NaN, NaN), RangeError, 'NaN as start and end');
assert.throws(() => range(0, 0, { step: NaN }), RangeError, 'NaN as step option');
assert.throws(() => range(0, 5, NaN), RangeError, 'NaN as step argument');
iterator = range(1, 3);
assert.deepEqual(iterator.start, 1);
+5 -5
View File
@@ -34,11 +34,11 @@ QUnit.test('Iterator.range', assert => {
assert.deepEqual(from(range(0, 0)), []);
assert.deepEqual(from(range(0, -5, 1)), []);
assert.deepEqual(from(range(NaN, 0)), []);
assert.deepEqual(from(range(0, NaN)), []);
assert.deepEqual(from(range(NaN, NaN)), []);
assert.deepEqual(from(range(0, 0, { step: NaN })), []);
assert.deepEqual(from(range(0, 5, NaN)), []);
assert.throws(() => range(NaN, 0), RangeError, 'NaN as start');
assert.throws(() => range(0, NaN), RangeError, 'NaN as end');
assert.throws(() => range(NaN, NaN), RangeError, 'NaN as start and end');
assert.throws(() => range(0, 0, { step: NaN }), RangeError, 'NaN as step option');
assert.throws(() => range(0, 5, NaN), RangeError, 'NaN as step argument');
iterator = range(1, 3);
assert.deepEqual(iterator.start, 1);
+5 -5
View File
@@ -33,11 +33,11 @@ QUnit.test('range', assert => {
assert.deepEqual(from(range(0, 0)), []);
assert.deepEqual(from(range(0, -5, 1)), []);
assert.deepEqual(from(range(NaN, 0)), []);
assert.deepEqual(from(range(0, NaN)), []);
assert.deepEqual(from(range(NaN, NaN)), []);
assert.deepEqual(from(range(0, 0, { step: NaN })), []);
assert.deepEqual(from(range(0, 5, NaN)), []);
assert.throws(() => range(NaN, 0), RangeError, 'NaN as start');
assert.throws(() => range(0, NaN), RangeError, 'NaN as end');
assert.throws(() => range(NaN, NaN), RangeError, 'NaN as start and end');
assert.throws(() => range(0, 0, { step: NaN }), RangeError, 'NaN as step option');
assert.throws(() => range(0, 5, NaN), RangeError, 'NaN as step argument');
iterator = range(1, 3);
assert.deepEqual(iterator.start, 1);