12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 'use strict';
- var implementation = require('./implementation');
- var lacksProperEnumerationOrder = function () {
- if (!Object.assign) {
- return false;
- }
- /*
- * v8, specifically in node 4.x, has a bug with incorrect property enumeration order
- * note: this does not detect the bug unless there's 20 characters
- */
- var str = 'abcdefghijklmnopqrst';
- var letters = str.split('');
- var map = {};
- for (var i = 0; i < letters.length; ++i) {
- map[letters[i]] = letters[i];
- }
- var obj = Object.assign({}, map);
- var actual = '';
- for (var k in obj) {
- actual += k;
- }
- return str !== actual;
- };
- var assignHasPendingExceptions = function () {
- if (!Object.assign || !Object.preventExtensions) {
- return false;
- }
- /*
- * Firefox 37 still has "pending exception" logic in its Object.assign implementation,
- * which is 72% slower than our shim, and Firefox 40's native implementation.
- */
- var thrower = Object.preventExtensions({ 1: 2 });
- try {
- Object.assign(thrower, 'xy');
- } catch (e) {
- return thrower[1] === 'y';
- }
- return false;
- };
- module.exports = function getPolyfill() {
- if (!Object.assign) {
- return implementation;
- }
- if (lacksProperEnumerationOrder()) {
- return implementation;
- }
- if (assignHasPendingExceptions()) {
- return implementation;
- }
- return Object.assign;
- };
|