https://github.com/rousan/symbol-es6
:snowman: ES6 Symbol polyfill in pure ES5
https://github.com/rousan/symbol-es6
es es-symbol es5 es6 es6-symbol harmony harmony-symbol implementation js js-symbol polyfill ponyfill symbol
Last synced: 6 months ago
JSON representation
:snowman: ES6 Symbol polyfill in pure ES5
- Host: GitHub
- URL: https://github.com/rousan/symbol-es6
- Owner: rousan
- License: mit
- Created: 2017-06-13T12:52:30.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2020-01-26T10:48:51.000Z (over 5 years ago)
- Last Synced: 2024-06-18T19:53:05.081Z (12 months ago)
- Topics: es, es-symbol, es5, es6, es6-symbol, harmony, harmony-symbol, implementation, js, js-symbol, polyfill, ponyfill, symbol
- Language: JavaScript
- Homepage: https://rousan.io/symbol-es6/
- Size: 33.2 KB
- Stars: 18
- Watchers: 4
- Forks: 9
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://www.npmjs.com/package/symbol-es6)
[](https://www.npmjs.com/package/symbol-es6)
[](https://github.com/rousan/symbol-es6/graphs/contributors)
[](https://github.com/rousan/symbol-es6/blob/master/LICENSE)# Symbol-ES6
Provides support for `ES6` Symbol API in `ES5` for older JS environments i.e. older browsers or NodeJS.
> ES6 Symbol polyfill in pure ES5.
## Install
### NPM
Install it from `npm` and `require` it before any other modules:
```bash
$ npm install --save symbol-es6
``````javascript
require("symbol-es6");
```### CDN
If you prefer CDN, then just insert it into your HTML page on the top of other scripts:
```html
```
## Examples
```javascript
"use strict";var ES6 = require("symbol-es6");
console.log(Symbol("bar") === Symbol("bar")); //false
var sym = Symbol.for("bar");
var sym2 = Symbol("bar");console.log(Symbol.for("bar") === sym); //true
console.log(sym === sym2); //false
console.log(Symbol.keyFor(sym)); //bar
console.log(Symbol.keyFor(sym2)); //undefinedconsole.log(Array.from("Hello")); //[ 'H', 'e', 'l', 'l', 'o' ]
var it = [1, 2].entries();
console.log(it.next()); //{ done: false, value: [ 0, 1 ] }
console.log(it.next()); //{ done: false, value: [ 1, 2 ] }
console.log(it.next()); //{ done: true, value: undefined }it = [1, 2].keys();
console.log(it.next()); //{ done: false, value: 0 }
console.log(it.next()); //{ done: false, value: 1 }
console.log(it.next()); //{ done: true, value: undefined }function Bar() {
}
console.log(Object.prototype.toString.call(new Bar())); //[object Object]Bar.prototype[Symbol.toStringTag] = "Bar";
console.log(Object.prototype.toString.call(new Bar())); //[object Bar]
it = "Bar"[Symbol.iterator]();
console.log(it.next()); //{ done: false, value: 'B' }
console.log(it.next()); //{ done: false, value: 'a' }
console.log(it.next()); //{ done: false, value: 'r' }console.log(ES6.isSymbol({})); //fasle
console.log(ES6.isSymbol(sym)); ///truefunction Baz() {
}
console.log(ES6.instanceOf(89, Baz)); //false
Object.defineProperty(Baz, Symbol.hasInstance, {
value: function (value) {
return typeof value === "number";
}
});
console.log(ES6.instanceOf(89, Baz)); //trueES6.forOf([1, 2], function (v) {
console.log(v);
});
//1
//2console.log(ES6.spreadOperator([]).spread("Bar").array()); //[ 'B', 'a', 'r' ]
function TestSpread() {
return Array.prototype.reduce.call(arguments, function (acc, currvalue) {
return acc + currvalue;
}, 0);
}console.log(ES6.spreadOperator(TestSpread).spread([1, 2, 3, 4, 5]).call()); //15
function Student(name, roll) {
this.name = name;
this.roll = roll;
}console.log(ES6.spreadOperator(Student).spread(["Ariyan", 10]).new().name); //Ariyan
```## Polyfills
* `Symbol`
* `for()`
* `keyFor`
* `@@hasInstance`
* `@@isConcatSpreadable`
* `@@iterator`
* `@@toStringTag`
* `Symbol.prototype.toString()`
* `Symbol.prototype.valueOf()`
* `Function`
* `Function.prototype[@@hasInstance]()`
* `Array`
* `Array.prototype.concat()` (ES6 version, addition of `@@isConcatSpreadable` support)
* `Array.prototype[@@iterator]()`
* `Array.from()`
* `Array.prototype.entries()`
* `Array.prototype.keys()`* `Object`
* `Object.prototype.toString()` (ES6 version, addition of `@@toStringTag` support)* `String`
* `String.prototype[@@iterator]()`## Limitation
Some `ES6` features can't be implemented in `ES5` natively like `spread operator`, `for..of` loop,
`ES6` version of `instanceOf` operator etc. So this module exports a object named `ES6` globally,
that provides some approximate equivalent implementation of those features.## `ES6` Object
This object provides,
* `isSymbol()` (It can be used as equivalent API of: `typeof symbol === 'symbol'`)
* `instanceOf()` (Provides ES6 version of `instanceOf`)
* `forOf()` (This method behaves exactly same as ES6 `for...of` loop)
* `spreadOperator` (Gives same functionality of the `spread operator` of ES6)## Contributing
Your PRs and stars are always welcome.
Please, try to follow:
* Clone the repository.
* Checkout `develop` branch.
* Install dependencies.
* Add your new features or fixes.
* Build the project.```sh
$ git clone https://github.com/rousan/symbol-es6.git
$ cd symbol-es6
$ git checkout develop
$ npm i
$ npm run build
```