JS原生引用类型解析5-Number类型

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!)
(注2:更多内容请查看我的目录。)

1. 简介

为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类型作为基本包装类型:String,Number和Boolean。实际上,每当读取一个基本类型值得时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。

2. Number类型对象创建

Number类型是与数字值对应的引用类型,Number类型对象创建是使用Number构造函数。下面是使用Number构造函数传入不同类型参数后的情况。

// 传入Number类型
console.log(new Number(1));  // Number {1}
// 传入NaN类型
console.log(new Number(NaN));  // Number {NaN}
// 传入Infinity类型
console.log(new Number(Infinity));  // Number {Infinity}
// 传入String类型
console.log(new Number('123'));  // Number {123}
// 传入Undefined类型
console.log(new Number(undefined));  // Number {NaN}
// 传入Null类型
console.log(new Number(null));  // Number {0}
// 传入Boolean类型
console.log(new Number(true));  // Number {1}
// 传入Array类型
console.log(new Number([1,2]));  // Number {NaN}
// 传入Function类型
console.log(new Number(function(){return 1;}));  // Number {NaN}
// 传入Object类型
console.log(new Number({a: 1}));  // Number {NaN}
// 传入空对象
console.log(new Number({}));  // Number {NaN}

Number构造函数接收基本类型值时,能将其转换成对应的包含数字的对象,但是undefined会被转成{NaN},传入对象也会转换成{NaN}。

注意:null是基本类型值,是一个空对象指针,而{}是空对象。

省略new的效果一样。

3. 数字值读取

其实,在读取模式中访问数字值时,后台会自动完成以下处理:

(1)创建Number类型的一个实例;
(2)在实例上调用指定的方法;
(3)销毁该实例。

4. Number构造函数的属性与方法

我们用Object.getOwnPropertyNames()方法获取Number构造函数的所有属性与方法。

Object.getOwnPropertyNames(Number);
// (17) ["length", "name", "prototype", "isFinite", "isInteger", "isNaN", "isSafeInteger", "parseFloat", "parseInt", "MAX_VALUE", "MIN_VALUE", "NaN", "NEGATIVE_INFINITY", "POSITIVE_INFINITY", "MAX_SAFE_INTEGER", "MIN_SAFE_INTEGER", "EPSILON"]

发现一共有17个属性和方法。

4.1 Number构造函数的属性

Number.length
长度为1

Number.name
名称为"Number"

Number.prototype
指向Number构造函数的原型,可以为所有Number类型的对象添加属性。

Number.EPSILON
表示 1 和大于 1 的最小值的差值,是一个常量,接近于 2.2204460492503130808472633361816E-16,或者 2-52。引入这么小的一个常量的目的在于,为浮点数计算设置一个误差范围。因为浮点数的计算是不精确的。如果误差小于Number.EPSILON,我们就可以认为得到了正确的结果。

0.1+0.2;      //0.30000000000000004
0.1+0.2-0.3;     //5.551115123125783e-17
(0.1+0.2-0.3).toFixed(20);    //"0.00000000000000005551"
// 那么我们再来看看0.1+0.2-0.3的值是否小于Number.EPSILON,如果小于,返回true,那我们便可以认为结果正确
(0.1+0.2-0.3).toFixed(20)<Number.EPSILON;   // true

其实,Number.EPSILON就是一个可接受的误差范围。

Number.MAX_SAFE_INTEGER
该常量表示在 JavaScript 中最大的安全整数(maxinum safe integer)(253 - 1)。IEEE 754 标准规定能够准确地表示整数和正确地比较整数的数字范围是在 -(253 - 1) 到 253 - 1 之间,包含 -(253 - 1) 和 253 - 1。

Number.MIN_SAFE_INTEGER
代表在 JavaScript中最小的安全的integer型数字 (-(253 - 1)).

Number.MAX_VALUE
表示在 JavaScript 里所能表示的最大数值。该值接近于 1.79E+308,大于 MAX_VALUE 的值代表 "Infinity"。

Number.MIN_VALUE
表示在 JavaScript 里所能表示的最小的正数。MIN_VALUE 的值约为 5e-324。小于 MIN_VALUE ("underflow values") 的值将会转换为 0。

Number.NaN
表示“非数字”的值(Not-A-Number)。

Number.NEGATIVE_INFINITY
表示负无穷大,在溢出时返回该值。和全局对象的 Infinity 属性的负值相同。
为了成功返回一个有限值,你可能会使用 Number.NEGATIVE_INFINITY 属性来判断是否显示一个条件错误 。然而 isFinite()方法更适合这种情况。

Number.POSITIVE_INFINITY
表示正无穷大,在溢出时返回该值。和全局对象的 Infinity 属性的值相同。
为了成功返回一个有限值,你可能会使用 Number.POSITIVE_INFINITY 属性来判断是否显示一个条件错误 。然而 isFinite()方法更适合这种情况。

4.2 Number构造函数的方法

Number.isNaN()
确定传递的值是否是 NaN。

Number.isFinite()
确定传递的值类型及本身是否是有限数。

Number.isInteger()
判断给定的参数是否为整数。

Number.isSafeInteger()
确定传递的值是否为安全整数 ( -(253 - 1) 至 253 - 1之间)。

Number.parseFloat()
以把一个字符串解析成浮点数。该方法与全局的 parseFloat()函数相同。

Number.parseInt()
以把一个字符串解析成整数。该方法与全局的 parseFloat()函数相同。

5. Number原型对象的属性与方法

我们用Object.getOwnPropertyNames()方法获取Number原型对象的所有属性与方法。

Object.getOwnPropertyNames(Number.prototype);
// (7) ["constructor", "toExponential", "toFixed", "toPrecision", "toString", "valueOf", "toLocaleString"]

发现一共有7个属性和方法。其中有相当一部分是与HTML相关的方法。

5.1 Number原型对象的属性

Number.prototype.constructor
指向构造函数Array

5.2 Number原型对象的方法

注意:整数无法直接调用Number原型对象的方法(是JS装箱机制的原因吗?),但是将其赋值给变量以后可以。

Number.prototype.toExponential()
返回一个科学计数法字符串

console.log(3000.toExponential());  // 会报错
console.log(3000.0.toExponential());  // "3e+3"
console.log(new Number(3000).toExponential());  // "3e+3"

var a = 3000;
console.log(a.toExponential());  // "3e+3"

Number.prototype.toFixed()
转化成一个精确到小数点后指定位数的字符串返回,默认是小数点后0位。

console.log(3000.toFixed(2));  // 会报错
console.log(3000.0.toFixed(2));  // "3000.00"
console.log(new Number(3000).toFixed(2));  // "3000.00"

Number.prototype.toString()
转化成一个精确到指定进制的字符串返回,默认是十进制。

console.log(12.toString(16));  // 会报错
console.log(12.0.toString(16));  // "c"
console.log(new Number(12).toString(16));  // "c"

Number.prototype.toLocalString()
转化成一个精确到指定进制的字符串返回,默认是十进制。与语言相关,但大多数语言情况与Number.prototype.toString()相同。

Number.prototype.toPrecision()
转化成一个保留指定位数的字符串(四舍五入)返回。

console.log(666.toPrecision(2));  // 会报错
console.log(666.6666.toPrecision(2));  // "6.7e+2"
console.log(new Number(6666666).toPrecision(3));  // "6.67e+6"
console.log(6.67e+6.toPrecision(2));  // "6.7e+6"
console.log(new Number(6.6e+6).toPrecision(3));  // "6.60e+6"

Number.prototype.valueOf()
返回指定对象的原始值。覆盖了Object对象的 valueOf() 方法。

6. Number实例对象的属性与方法

我们用Object.getOwnPropertyNames()方法获取Number实例对象的所有属性与方法。

var num = new Number(123);
Object.getOwnPropertyNames(num);
// []

没有任何自有属性与方法。

参考

MDN-Number
BOOK-《JavaScript高级程序设计(第3版)》第5章
ES6中Number的一些扩展方法(一)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,116评论 0 13
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 1,036评论 0 1
  • 陈丹青说,中国会画画的人很多,会看画的人很少。他所表达的,与其说是一种审美,不如说是一种感知。 在达利的超现实主义...
    陌上花开wen阅读 667评论 0 1
  • 心尖儿颤~~~~~~
    ninvxv阅读 151评论 0 0
  • 在看一部小说,《寄居者》。 全书第一句话便让人喜欢:我很卑劣,爱情很高尚,因而我通过卑劣实现高尚。 明明是个乱世,...
    花之葭阅读 550评论 0 4