-
-
Save jed/1031568 to your computer and use it in GitHub Desktop.
// based loosely on Kris Kowal's es-5shim.js | |
// https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js#L204 | |
// | |
// due to space constraints, this version does not check function type or cast length to a number | |
[].map || ( // if arrays have no map | |
Array.prototype.map = // set the prototype's map | |
function( // to a function | |
a // that takes a mapping function | |
/*, thisp */ // and an optional scope. | |
){ | |
for ( | |
var b = this // cache `this` and | |
, c = b.length // the array's length, | |
, d = [] // create the return array | |
, e = 0 // and initialize the cursor, | |
, f // and cache undefined. | |
; e < b; // while the cursor is less than the length | |
) d[e] = // set the result member | |
e in b // if it originally exists, | |
? a.call( // to the given function, called with | |
arguments[1], // the optional scope, | |
b[e], // existing member, | |
e++, // member index, and | |
b ) // current scope, | |
: f; // or to undefined otherwise. | |
return d // return the result. | |
}) |
[].map||(Array.prototype.map=function(a){for(var b=this,c=b.length,d=[],e=0,f;e<b;)d[e]=e in b?a.call(arguments[1],b[e],e++,b):f;return d}) |
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
Version 2, December 2004 | |
Copyright (C) 2011 Jed Schmidt <http://jed.is> | |
Everyone is permitted to copy and distribute verbatim or modified | |
copies of this license document, and changing it is allowed as long | |
as the name is changed. | |
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE | |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
0. You just DO WHAT THE FUCK YOU WANT TO. |
{ | |
"name": "map", | |
"description": "polyfill an ES5-compatibile Array.prototype.map where needed.", | |
"keywords": [ | |
"array", | |
"map", | |
"es5", | |
"polyfill" | |
] | |
} |
<!DOCTYPE html> | |
<title>Foo</title> | |
<div>Expected value: <b>2,4,6,8</b></div> | |
<div>Actual value: <b id="ret"></b></div> | |
<script> | |
var map = | |
[].map||(Array.prototype.map=function(a){for(var b=this,c=b.length,d=[],e=0,f;e<b;)d[e]=e in b?a.call(arguments[1],b[e],e++,b):f;return d}) | |
document.getElementById( "ret" ).innerHTML = map.call([1,2,3,4], function(x){ return x*2 }) | |
</script> |
well aware of that,@jdalton. we just do what we can in the space we're given.
@jed the description polyfill an ES5-compatibile Array.prototype.map
is misleading.
keep reading: due to space constraints, this version does not check function type or cast length to a number
let's agree to say it's 80% polyful.
There is more wrong with this gist than the disclaimer mentions as the snippet handles spare arrays incorrectly too.
Besides, adding methods to native prototypes that don't comply with spec is irresponsible.
wait, you do realize that when someone uses this code it doesn't change the native prototypes in your browser too, right?
maybe i give people too much credit, but doubt anyone expects a 140-byte implementation of a native prototype method to be a 100% spec-compliant drop-in replacement.
wait, you do realize that when someone uses this code it doesn't change the native prototypes in your browser too, right?
The snippet suggests [].map||(Array.prototype.map=function(a){..})
which will modify the Array.prototype
when the native method doesn't exist. Because the fallback doesn't follow spec it introduces inconsistencies between browsers that do and don't support native Array#map
.
maybe i give people too much credit, but doubt anyone expects a 140-byte implementation of a native prototype method to be a 100% spec-compliant drop-in replacement.
I think simply changing the description of the gist to avoid confusion would do.
How about we try to get this to 100% compliance? Like this:
[].map||(Array.prototype.map=function(a,t){for(var c=this,b=c.length,d=[],e=0;e<b;)e in c&&(d[e]=a.call(t,c[e],e++,c));d.lengh=b;return d})
@atk Found a typo in your version (you misspelled length
as lengh
). So just in case anyone wishes to use your version of the snippet, here it is fixed:
[].map||(Array.prototype.map=function(a,t){for(var c=this,b=c.length,d=[],e=0;e<b;)e in c&&(d[e]=a.call(t,c[e],e++,c));d.length=b;return d})
This fallback is not ES5 compliant.