1 | 'use strict';
|
2 | var DESCRIPTORS = require('../internals/descriptors');
|
3 | var global = require('../internals/global');
|
4 | var isForced = require('../internals/is-forced');
|
5 | var redefine = require('../internals/redefine');
|
6 | var has = require('../internals/has');
|
7 | var classof = require('../internals/classof-raw');
|
8 | var inheritIfRequired = require('../internals/inherit-if-required');
|
9 | var toPrimitive = require('../internals/to-primitive');
|
10 | var fails = require('../internals/fails');
|
11 | var create = require('../internals/object-create');
|
12 | var getOwnPropertyNames = require('../internals/object-get-own-property-names').f;
|
13 | var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
|
14 | var defineProperty = require('../internals/object-define-property').f;
|
15 | var trim = require('../internals/string-trim').trim;
|
16 |
|
17 | var NUMBER = 'Number';
|
18 | var NativeNumber = global[NUMBER];
|
19 | var NumberPrototype = NativeNumber.prototype;
|
20 |
|
21 |
|
22 | var BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;
|
23 |
|
24 |
|
25 |
|
26 | var toNumber = function (argument) {
|
27 | var it = toPrimitive(argument, false);
|
28 | var first, third, radix, maxCode, digits, length, index, code;
|
29 | if (typeof it == 'string' && it.length > 2) {
|
30 | it = trim(it);
|
31 | first = it.charCodeAt(0);
|
32 | if (first === 43 || first === 45) {
|
33 | third = it.charCodeAt(2);
|
34 | if (third === 88 || third === 120) return NaN;
|
35 | } else if (first === 48) {
|
36 | switch (it.charCodeAt(1)) {
|
37 | case 66: case 98: radix = 2; maxCode = 49; break;
|
38 | case 79: case 111: radix = 8; maxCode = 55; break;
|
39 | default: return +it;
|
40 | }
|
41 | digits = it.slice(2);
|
42 | length = digits.length;
|
43 | for (index = 0; index < length; index++) {
|
44 | code = digits.charCodeAt(index);
|
45 |
|
46 |
|
47 | if (code < 48 || code > maxCode) return NaN;
|
48 | } return parseInt(digits, radix);
|
49 | }
|
50 | } return +it;
|
51 | };
|
52 |
|
53 |
|
54 |
|
55 | if (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
|
56 | var NumberWrapper = function Number(value) {
|
57 | var it = arguments.length < 1 ? 0 : value;
|
58 | var dummy = this;
|
59 | return dummy instanceof NumberWrapper
|
60 |
|
61 | && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)
|
62 | ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);
|
63 | };
|
64 | for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (
|
65 |
|
66 | 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
|
67 |
|
68 | 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
|
69 | 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'
|
70 | ).split(','), j = 0, key; keys.length > j; j++) {
|
71 | if (has(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {
|
72 | defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));
|
73 | }
|
74 | }
|
75 | NumberWrapper.prototype = NumberPrototype;
|
76 | NumberPrototype.constructor = NumberWrapper;
|
77 | redefine(global, NUMBER, NumberWrapper);
|
78 | }
|