diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d1c1a57004a..3431452e73d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Changelog ##### Unreleased +- Added one more workaround of possible error with `Symbol` polyfill on global object, [#1289](https://github.com/zloirock/core-js/issues/1289#issuecomment-1768411444) - Directly specified `type: commonjs` in `package.json` of all packages to avoid potential breakage in future Node versions, see [this issue](https://github.com/nodejs/TSC/issues/1445) - Some minor internal fixes and optimizations - Compat data improvements: diff --git a/packages/core-js/modules/es.symbol.constructor.js b/packages/core-js/modules/es.symbol.constructor.js index 4e13305d6e3a..79c2beb84b93 100644 --- a/packages/core-js/modules/es.symbol.constructor.js +++ b/packages/core-js/modules/es.symbol.constructor.js @@ -168,14 +168,15 @@ if (!NATIVE_SYMBOL) { var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); var tag = uid(description); var setter = function (value) { - if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); - if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + var $this = this === undefined ? global : this; + if ($this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); + if (hasOwn($this, HIDDEN) && hasOwn($this[HIDDEN], tag)) $this[HIDDEN][tag] = false; var descriptor = createPropertyDescriptor(1, value); try { - setSymbolDescriptor(this, tag, descriptor); + setSymbolDescriptor($this, tag, descriptor); } catch (error) { if (!(error instanceof RangeError)) throw error; - fallbackDefineProperty(this, tag, descriptor); + fallbackDefineProperty($this, tag, descriptor); } }; if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); diff --git a/tests/unit-global/es.symbol.constructor.js b/tests/unit-global/es.symbol.constructor.js index 9845976911d3..864be5b0ea5d 100644 --- a/tests/unit-global/es.symbol.constructor.js +++ b/tests/unit-global/es.symbol.constructor.js @@ -32,6 +32,13 @@ QUnit.test('Symbol', assert => { } }); +QUnit.test('Symbol as global key', assert => { + const TEXT = 'test global symbol key'; + const symbol = Symbol(TEXT); + GLOBAL[symbol] = TEXT; + assert.same(GLOBAL[symbol], TEXT, TEXT); +}); + QUnit.test('Well-known Symbols', assert => { const wks = [ 'hasInstance', diff --git a/tests/unit-pure/es.symbol.constructor.js b/tests/unit-pure/es.symbol.constructor.js index be57a08a71d3..5db2ef5d77a0 100644 --- a/tests/unit-pure/es.symbol.constructor.js +++ b/tests/unit-pure/es.symbol.constructor.js @@ -1,4 +1,4 @@ -import { DESCRIPTORS } from '../helpers/constants.js'; +import { DESCRIPTORS, GLOBAL } from '../helpers/constants.js'; import create from 'core-js-pure/es/object/create'; import defineProperty from 'core-js-pure/es/object/define-property'; @@ -31,6 +31,13 @@ QUnit.test('Symbol', assert => { } }); +QUnit.test('Symbol as global key', assert => { + const TEXT = 'test global symbol key'; + const symbol = Symbol(TEXT); + GLOBAL[symbol] = TEXT; + assert.same(GLOBAL[symbol], TEXT, TEXT); +}); + QUnit.test('Well-known Symbols', assert => { const wks = [ 'hasInstance',