Skip to content

Commit

Permalink
Fix typeof Symbol.prototype (babel#3686)
Browse files Browse the repository at this point in the history
* formatting

* fix `typeof Symbol.prototype`

Babel uses a helper function to return the correct value for `typeof
obj` when obj is a Symbol and support for Symbol has been polyfilled.

This function assumes that `obj.constructor === Symbol` implies `typeof
obj === 'symbol'`.

This isn't true when obj is `Symbol.prototype`. In that case (REPL from
node 6, the same holds in Firefox):

```
> Symbol.prototype.constructor === Symbol
true
> typeof Symbol.prototype
'object'
>
```

AFAICS, that's the only case where the assumption doesn't hold.

The test added by this patch fails only on node 0.10, as 0.12 already
has a native implementation of Symbol and the polyfill code doesn't run.

This caused a problem in core-js when it's compiled with babel (the
issue was isolated by @skozin here:
zloirock/core-js#189 (comment)).
  • Loading branch information
brainlock authored and panagosg7 committed Jan 17, 2017
1 parent 0967256 commit 7296517
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 2 deletions.
6 changes: 5 additions & 1 deletion packages/babel-helpers/src/helpers.js
Expand Up @@ -8,7 +8,11 @@ export default helpers;
helpers.typeof = template(`
(typeof Symbol === "function" && typeof Symbol.iterator === "symbol")
? function (obj) { return typeof obj; }
: function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
: function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype
? "symbol"
: typeof obj;
};
`);

helpers.jsx = template(`
Expand Down
@@ -1,4 +1,4 @@
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _Symbol = foo();
typeof s === "undefined" ? "undefined" : _typeof(s);
Expand Down
@@ -1,3 +1,4 @@
var s = Symbol("s");
assert.equal(typeof s, "symbol");
assert.ok(typeof s === "symbol");
assert.ok(typeof Symbol.prototype === 'object', "`typeof Symbol.prototype` should be 'object'");

0 comments on commit 7296517

Please sign in to comment.