blob: 4cb56a613b71ce9069fa9f8aac794f911f89f064 [file] [log] [blame]
Tim van der Lippefdbd42e2020-04-07 14:14:361'use strict';
2
Tim van der Lippe2c891972021-07-29 15:22:503var GetIntrinsic = require('get-intrinsic');
Tim van der Lippefdbd42e2020-04-07 14:14:364
Nikolay Vitkovd76576c2024-12-02 14:10:155var $TypeError = require('es-errors/type');
Tim van der Lippefdbd42e2020-04-07 14:14:366var $Number = GetIntrinsic('%Number%');
7var $RegExp = GetIntrinsic('%RegExp%');
8var $parseInteger = GetIntrinsic('%parseInt%');
9
Tim van der Lippe2c891972021-07-29 15:22:5010var callBound = require('call-bind/callBound');
Nikolay Vitkovd76576c2024-12-02 14:10:1511var regexTester = require('safe-regex-test');
Tim van der Lippefdbd42e2020-04-07 14:14:3612var isPrimitive = require('../helpers/isPrimitive');
13
14var $strSlice = callBound('String.prototype.slice');
15var isBinary = regexTester(/^0b[01]+$/i);
16var isOctal = regexTester(/^0o[0-7]+$/i);
17var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
18var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
19var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
20var hasNonWS = regexTester(nonWSregex);
21
Nikolay Vitkovd76576c2024-12-02 14:10:1522var $trim = require('string.prototype.trim');
Tim van der Lippefdbd42e2020-04-07 14:14:3623
24var ToPrimitive = require('./ToPrimitive');
25
Nikolay Vitkovd76576c2024-12-02 14:10:1526// https://262.ecma-international.org/6.0/#sec-tonumber
Tim van der Lippefdbd42e2020-04-07 14:14:3627
28module.exports = function ToNumber(argument) {
29 var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
30 if (typeof value === 'symbol') {
31 throw new $TypeError('Cannot convert a Symbol value to a number');
32 }
33 if (typeof value === 'string') {
34 if (isBinary(value)) {
35 return ToNumber($parseInteger($strSlice(value, 2), 2));
36 } else if (isOctal(value)) {
37 return ToNumber($parseInteger($strSlice(value, 2), 8));
38 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
39 return NaN;
Tim van der Lippefdbd42e2020-04-07 14:14:3640 }
Tim van der Lippebc3a0b72021-11-08 15:22:3741 var trimmed = $trim(value);
42 if (trimmed !== value) {
43 return ToNumber(trimmed);
44 }
45
Tim van der Lippefdbd42e2020-04-07 14:14:3646 }
47 return $Number(value);
48};