细说数据类型(下)
Number 类型
??ECMAScript 中最有意思的数据类型或许就是 Number 类型了。 Number 类型使用 IEEE 754 格式表示整数和浮点值(在某些语言中也叫双精度值)。
??最基本的数值字面量格式是十进制整数,直接写出来即可:
var demo = 55;
??整数也可以用八进制(以 8 为基数)或十六进制(以 16 为基数)字面量表示。对于八进制字面量,第一个数字必须是零(0),然后是相应的八进制数字(数值 0~7)。要创建十六进制字面量,必须让真正的数值前缀 0x(区分大小写),然后是十六进制数字(0~9 以及 A~F )。十六进制数字中的字母大小写均可(有关进制的转换可以自行了解学习)。
var demoNum1 = 070;
var demoNum2 = 079;
var demoNum3 = 08;
var demoNum4 = 0xA;
var demoNum5 = 0x1f;
??注意:由于 JavaScript 保存数值的方式,实际中可能存在正零(+0)和负零(-0)。正零和负零在所有情况下都被认为是等同的,这里特地说明一下。
浮点数
??要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少要有一位数字。虽然小数点前面不是必须有整数,但最佳实践推荐加上。 ??下面是几个例子:
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;
??对于非常大或非常小的数值,浮点值可以用科学记数法来表示。ECMAScript 中科学记数法的格式要求是一个数值(整数或浮点数)后跟一个大写或小写的字母 e ,再加上一个要乘的 10 的多少次幂。 比如:
var floatNum1 = 3.125e7;
var floatNum2 = 3.125e-7;
0.1+0.2 = ?
??如果你问我,0.1+0.2 = ? ,那么显然是0.3 。但是,在 JavaScript 中可不是 0.3 。
var a = 0.1;
var b = 0.2;
console.log(a+b);
??如果两个数值分别是 0.05 和 0.25,得到的仍是我们想要的 0.3 ,但是 0.1 和 0.2 却不是。 ??注意:之所以存在这种舍入错误,是因为使用了 IEEE 754 数值,这种错误并非 ECMAScript 所独有,其他使用相同格式的语言也有这个问题。所以在涉及浮点数的计算时要十分注意这种情况。
值的范围
??由于内存的限制, ECMAScript 并不支持表示这个世界上的所有数值。
??ECMAScript 可以表示的最小数值保存在Number.MIN_VALUE 中,这个值在多数浏览器中是 5e-324 ;可以表示的最大数值保存在Number.MAX_VALUE 中,这个值在多数浏览器中是 1.797 693 134 862 315 7e+308 。如果某个计算得到的数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity (无穷)值。
??任何无法表示的负数以 -Infinity(负无穷大)表示,任何无法表示的正数以 Infinity (正无穷大)表示。
NaN
??有一个特殊的数值叫 NaN ,意思是“不是数值”( Not a Number )。
??用于表示本来要返回数值的操作失败了(而不是控制台抛出错误)。
举个例子:
console.log(0/0);
console.log(0/5);
console.log(5/0);
console.log(5/-0);
??如果用 0 除任意数值会返回 NaN ;而如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity 。
??如果你用数值和字符串一起做运算,也会返回 NaN 。
NaN 独特的属性
??首先,任何涉及 NaN 的操作始终返回 NaN(如 NaN/10),在连续多步计算时这可能是个问题。
??其次, NaN 不等于包括 NaN 在内的任何值。例如,下面的比较操作会返回 false :
console.log(NaN === NaN);
??为此, ECMAScript 提供了 isNaN() 函数。该函数接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。实际上,底层先调用 Number() 将其中的参数先转换成数值。
console.log(isNaN(NaN));
console.log(isNaN(10));
console.log(isNaN("10"));
console.log(isNaN("blue"));
console.log(isNaN(true));
数值转换
??有 3 个函数可以将非数值转换为数值: Number() 、 parseInt() 和parseFloat() 。 Number() 是转型函数,可用于任何数据类型。后两个函数主要用于将字符串转换为数值。
Number()
??Number() 函数基于如下规则执行转换:
- 布尔值, true 转换为 1, false 转换为 0。
- 数值,直接返回相应的数值。
- null,返回 0。
- undefined,返回 NaN。
- 字符串,应用以下规则:如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。忽略前面的
零(所以不涉及八进制格式);如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值(同样,忽略前面的零);如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值。如果字符串包含除上述情况之外的其他字符,则返回 NaN 。 - 对象,调用
valueOf() 方法,并按照上述规则转换返回的值。如果转换结果是 NaN ,则调用 toString() 方法,再按照转换字符串的规则转换。
var num1 = Number("Hello world!");
var num2 = Number("");
var num3 = Number("000011");
var num4 = Number(true);
parseInt() 和 parseFloat()
??考虑到用 Number() 函数转换字符串时相对复杂且有点反常规,通常在需要得到整数时可以优先使用 parseInt() 函数。
??parseInt() 函数更专注于字符串是否包含数值模式。字符串最前面的空格会被忽略,从第一个非空格字符开始转换,直到字符串末尾,或碰到非数值字符(包括小数点. )。如果第一个字符不是数值字符、加号或减号,parseInt() 立即返回 NaN 。这意味着空字符串也会返回 NaN (这一点跟Number() 不一样,它返回 0 )。parseInt() 函数也能识别不同的整数格式(十进制、八进制、十六进制),实际上可以传入第二个参数表示进制。
举个例子:
var num1 = parseInt("1234blue");
var num2 = parseInt("");
var num3 = parseInt("0xA");
var num4 = parseInt(22.5);
var num5 = parseInt("70");
var num6 = parseInt("0xf");
如果传入第二个参数:表示进制
var num1 = parseInt("10", 2);
var num2 = parseInt("10", 8);
var num3 = parseInt("10", 10);
var num4 = parseInt("10", 16);
??parseFloat() 函数的工作方式跟 parseInt() 函数类似,都是从位置 0开始检测每个字符。同样,它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。这意味着第一次出现的小数点是有效的,但第二次出现的小数点就无效了,此时字符串的剩余字符都会被忽略。注意 parseFloat() 只解析十进制值,因此不能指定底数,故也只有一个参数。
举个例子:
var num1 = parseFloat("1234blue");
var num2 = parseFloat("0xA");
var num3 = parseFloat("22.5");
var num4 = parseFloat("22.34.5");
var num5 = parseFloat("0908.5");
var num6 = parseFloat("3.125e7");
String 类型
??字符和任何符号连成的串就是字符串(使用时,必须加上"",也可以使用’’ 或者模板字符串``)。字符串在 JavaScript 的使用非常广泛,加引号的数据一定是字符串,空字符 “” 和 一个空格字符 " " 是完全不同的两个字符串。
字面量
??经过个人总结,字面量就是不用 js 的 new 操作符创建实例。在 JavaScript 中,字面量就是一种表示法,例如对象字面量、函数字面量、数组字面量等等。对象字面量就是一种方便地按指定规格创建新对象的的表示法。一般来说,字面量的写法较 new 操作符的写法更为简便且容易看懂。涉及字面量的一般与对象有关,后续作详细整理。
字符串字面量
??直接使用引号的方式就是字符串字面量。
举个例子:
var str1 = "hello";
var str2 = 'hi';
var str3 = `hello,hi`;
转义字符 \
??字符串数据类型包含一些特殊的字符,用于表示非打印字符或有其他用途的字符。而这些符号需要用到 (\) 转义字符。例如,\n 表示换行,\t 表示一个制表符等。转义字符可以用在需要只表示字符本身意义的前面。
举个例子:
console.log('\t');
console.log('\\t');
字符串转换
??有两种方式把一个值转换为字符串。首先是使用几乎所有值都有的 toString() 方法。这个方法唯一的用途就是返回当前 值的字符串等价物。toString() 方法可见于数值、布尔值、对象和字符串值。(没错,字符串值也有 toString() 方法,该方法只是简单地 返回自身的一个副本。) null 和 undefined 值没有 toString() 方法。 ??这里的方法其实和函数是同一个含义,但是方法指的是对象本身拥有的一个特殊的函数,故和函数做区分,一般的方法只有对象或者变量本身才能调用,使用. 的方式。
举个例子:
var num = 11;
var numAsString = age.toString();
var bool = true;
var boolAsString = found.toString();
??如果你不确定一个值是不是 null 或 undefined ,可以使用 String() 转型函数,它始终会返回表示相应类型值的字符串。
举个例子:
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1));
console.log(String(value2));
console.log(String(value3));
console.log(String(value4));
Symbol、Bigint、Object 类型
??由于Symbol 、Bigint 类型是 ES6 之后才提出的,现在不做整理和阐述。而 Object 类型身为唯一的一种引用数据类型,比较复杂,后面单独整理和阐述。
|