Show More
Commit Description:
add model solution
Commit Description:
add model solution
References:
File last commit:
Show/Diff file:
Action:
node_modules/object.assign/polyfill.js
| 51 lines
| 1.3 KiB
| application/javascript
| JavascriptLexer
|
r789 | '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; | ||||
}; | ||||