core-js
Version:
Standard library
295 lines (287 loc) • 10.3 kB
JavaScript
// ECMAScript 6 shim
!function(isFinite, tmp){
$define(STATIC, OBJECT, {
// 19.1.3.1 Object.assign(target, source)
assign: assign,
// 19.1.3.10 Object.is(value1, value2)
is: same
});
// 19.1.3.19 Object.setPrototypeOf(O, proto)
// Works with __proto__ only. Old v8 can't works with null proto objects.
'__proto__' in ObjectProto && function(buggy, set){
try {
set = ctx(call, getOwnDescriptor(ObjectProto, '__proto__').set, 2);
set({}, ArrayProto);
} catch(e){ buggy = true }
$define(STATIC, OBJECT, {
setPrototypeOf: function(O, proto){
assertObject(O);
assert(proto === null || isObject(proto), proto, ": can't set as prototype!");
if(buggy)O.__proto__ = proto;
else set(O, proto);
return O;
}
});
}();
// 20.1.2.3 Number.isInteger(number)
var isInteger = Number.isInteger || function(it){
return !isObject(it) && isFinite(it) && floor(it) === it;
}
// 20.2.2.28 Math.sign(x)
, sign = Math.sign || function sign(it){
return (it = +it) == 0 || it != it ? it : it < 0 ? -1 : 1;
}
, abs = Math.abs
, exp = Math.exp
, log = Math.log
, sqrt = Math.sqrt
, fcc = String.fromCharCode;
// 20.2.2.5 Math.asinh(x)
function asinh(x){
return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : log(x + sqrt(x * x + 1));
}
$define(STATIC, NUMBER, {
// 20.1.2.1 Number.EPSILON
EPSILON: pow(2, -52),
// 20.1.2.2 Number.isFinite(number)
isFinite: function(it){
return typeof it == 'number' && isFinite(it);
},
// 20.1.2.3 Number.isInteger(number)
isInteger: isInteger,
// 20.1.2.4 Number.isNaN(number)
isNaN: sameNaN,
// 20.1.2.5 Number.isSafeInteger(number)
isSafeInteger: function(number){
return isInteger(number) && abs(number) <= MAX_SAFE_INTEGER;
},
// 20.1.2.6 Number.MAX_SAFE_INTEGER
MAX_SAFE_INTEGER: MAX_SAFE_INTEGER,
// 20.1.2.10 Number.MIN_SAFE_INTEGER
MIN_SAFE_INTEGER: -MAX_SAFE_INTEGER,
// 20.1.2.12 Number.parseFloat(string)
parseFloat: parseFloat,
// 20.1.2.13 Number.parseInt(string, radix)
parseInt: parseInt
});
$define(STATIC, MATH, {
// 20.2.2.3 Math.acosh(x)
acosh: function(x){
return x < 1 ? NaN : log(x + sqrt(x * x - 1));
},
// 20.2.2.5 Math.asinh(x)
asinh: asinh,
// 20.2.2.7 Math.atanh(x)
atanh: function(x){
return x == 0 ? +x : log((1 + +x) / (1 - x)) / 2;
},
// 20.2.2.9 Math.cbrt(x)
cbrt: function(x){
return sign(x) * pow(abs(x), 1 / 3);
},
// 20.2.2.11 Math.clz32 (x)
clz32: function(x){
return (x >>>= 0) ? 32 - x[TO_STRING](2).length : 32;
},
// 20.2.2.12 Math.cosh(x)
cosh: function(x){
return (exp(x) + exp(-x)) / 2;
},
// 20.2.2.14 Math.expm1(x)
expm1: function(x){
return x == 0 ? +x : x > -1e-6 && x < 1e-6 ? +x + x * x / 2 : exp(x) - 1;
},
// 20.2.2.16 Math.fround(x)
// TODO: fallback for IE9-
fround: function(x){
return new Float32Array([x])[0];
},
// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
// TODO: work for very large & small numbers
hypot: function(value1, value2){
var sum = 0
, length = arguments.length
, value;
while(length--){
value = +arguments[length];
if(value == Infinity || value == -Infinity)return Infinity;
sum += value * value;
}
return sqrt(sum);
},
// 20.2.2.18 Math.imul(x, y)
imul: function(x, y){
var UInt16 = 0xffff
, xl = UInt16 & x
, yl = UInt16 & y;
return 0 | xl * yl + ((UInt16 & x >>> 16) * yl + xl * (UInt16 & y >>> 16) << 16 >>> 0);
},
// 20.2.2.20 Math.log1p(x)
log1p: function(x){
return x > -1e-8 && x < 1e-8 ? x - x * x / 2 : log(1 + +x);
},
// 20.2.2.21 Math.log10(x)
log10: function(x){
return log(x) / Math.LN10;
},
// 20.2.2.22 Math.log2(x)
log2: function(x){
return log(x) / Math.LN2;
},
// 20.2.2.28 Math.sign(x)
sign: sign,
// 20.2.2.30 Math.sinh(x)
sinh: function(x){
return x == 0 ? +x : (exp(x) - exp(-x)) / 2;
},
// 20.2.2.33 Math.tanh(x)
tanh: function(x){
return isFinite(x) ? x == 0 ? +x : (exp(x) - exp(-x)) / (exp(x) + exp(-x)) : sign(x);
},
// 20.2.2.34 Math.trunc(x)
trunc: trunc
});
// 20.2.1.9 Math[@@toStringTag]
setToStringTag(Math, MATH, true);
function assertNotRegExp(it){
if(isObject(it) && it instanceof RegExp)throw TypeError();
}
$define(STATIC, STRING, {
// 21.1.2.2 String.fromCodePoint(...codePoints)
fromCodePoint: function(){
var res = []
, len = arguments.length
, i = 0
, code
while(len > i){
code = +arguments[i++];
if(toIndex(code, 0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');
res.push(code < 0x10000
? fcc(code)
: fcc(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
);
} return res.join('');
},
// 21.1.2.4 String.raw(callSite, ...substitutions)
raw: function(callSite){
var raw = ES5Object(assertDefined(callSite.raw))
, len = toLength(raw.length)
, sln = arguments.length
, res = []
, i = 0;
while(len > i){
res.push(String(raw[i++]));
if(i < sln)res.push(String(arguments[i]));
} return res.join('');
}
});
$define(PROTO, STRING, {
// 21.1.3.3 String.prototype.codePointAt(pos)
codePointAt: createPointAt(false),
// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])
endsWith: function(searchString, endPosition /* = @length */){
assertNotRegExp(searchString);
var len = this.length
, end = endPosition === undefined ? len : min(toLength(endPosition), len);
searchString += '';
return String(this).slice(end - searchString.length, end) === searchString;
},
// 21.1.3.7 String.prototype.includes(searchString, position = 0)
includes: function(searchString, position /* = 0 */){
return !!~String(assertDefined(this)).indexOf(searchString, position);
},
// 21.1.3.13 String.prototype.repeat(count)
repeat: function(count){
var str = String(assertDefined(this))
, res = ''
, n = toInteger(count);
if(0 > n || n == Infinity)throw RangeError("Count can't be negative");
for(;n > 0; (n >>>= 1) && (str += str))if(n & 1)res += str;
return res;
},
// 21.1.3.18 String.prototype.startsWith(searchString [, position ])
startsWith: function(searchString, position /* = 0 */){
assertNotRegExp(searchString);
var index = toLength(min(position, this.length));
searchString += '';
return String(this).slice(index, index + searchString.length) === searchString;
}
});
$define(STATIC, ARRAY, {
// 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
from: function(arrayLike, mapfn /* -> it */, that /* = undefind */){
var O = Object(assertDefined(arrayLike))
, result = new (generic(this, Array))
, mapping = mapfn !== undefined
, f = mapping ? ctx(mapfn, that, 2) : undefined
, index = 0
, length;
if(isIterable(O))for(var iter = getIterator(O), step; !(step = iter.next()).done; index++){
result[index] = mapping ? f(step.value, index) : step.value;
} else for(length = toLength(O.length); length > index; index++){
result[index] = mapping ? f(O[index], index) : O[index];
}
result.length = index;
return result;
},
// 22.1.2.3 Array.of( ...items)
of: function(/* ...args */){
var index = 0
, length = arguments.length
, result = new (generic(this, Array))(length);
while(length > index)result[index] = arguments[index++];
result.length = length;
return result;
}
});
$define(PROTO, ARRAY, {
// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
copyWithin: function(target /* = 0 */, start /* = 0 */, end /* = @length */){
var O = Object(assertDefined(this))
, len = toLength(O.length)
, to = toIndex(target, len)
, from = toIndex(start, len)
, fin = end === undefined ? len : toIndex(end, len)
, count = min(fin - from, len - to)
, inc = 1;
if(from < to && to < from + count){
inc = -1;
from = from + count - 1;
to = to + count - 1;
}
while(count-- > 0){
if(from in O)O[to] = O[from];
else delete O[to];
to += inc;
from += inc;
} return O;
},
// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
fill: function(value, start /* = 0 */, end /* = @length */){
var O = Object(assertDefined(this))
, length = toLength(O.length)
, index = toIndex(start, length)
, endPos = end === undefined ? length : toIndex(end, length);
while(endPos > index)O[index++] = value;
return O;
},
// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
find: createArrayMethod(5),
// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
findIndex: createArrayMethod(6)
});
// 24.3.3 JSON[@@toStringTag]
setToStringTag(global.JSON, 'JSON', true);
if(framework){
// 19.1.3.6 Object.prototype.toString()
tmp[SYMBOL_TAG] = DOT;
if(cof(tmp) != DOT)hidden(ObjectProto, TO_STRING, function(){
return '[object ' + classof(this) + ']';
});
// 21.2.5.3 get RegExp.prototype.flags()
if(/./g.flags != 'g')defineProperty(RegExp[PROTOTYPE], 'flags', {
configurable: true,
get: createReplacer(/^.*\/(\w*)$/, '$1')
});
}
}(isFinite, {});