关于ECMAScript 数据类型,“非常6+1”
6:六种简单数据类型(也称为原始类型)
Undefined
Null
Boolean
Number
String
Symbol(ES6新增)
1:一种复杂数据类型
Object
使用 typeof 操作符 (注意是操作符)可以判断一个变量的数据类型
"undefined"表示值未定义;
"boolean"表示值为布尔值;
"string"表示值为字符串;
"number"表示值为数值;
"object"表示值为对象(而不是函数)或 null;
"function"表示值为函数(可以理解为特殊的对象,有特殊的属性);
"symbol"表示值为符号。
注意:调用 typeof null 返回的是"object"。这是因为特殊值 null 被认为是一个对空对象的引用。
严格来讲,函数在 ECMAScript 中被认为是对象,并不代表一种数据类型。可是,函数也有自己特殊的属性。为此,就有必要通过 typeof 操作符来区分函数和其他对象
Undefined 类型只有一个特殊值 undefined。使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值
let hello;
console.log(hello == undefined); // true
注意声明未赋值和未声明的区别
let message; // 这个变量被声明了,只是值为 undefined
// age 没有声明
if (message) {
// 这个块不会执行
}
if (!message) {
// 这个块会执行
}
if (age) {
// 这里会报错
}
Null 类型同样只有一个特殊值 null。null 值表示一个空对象指针所以typeof 传一个 null 会返回"object"
undefined 值是由 null 值派生而来的,因此 ECMA-262 将它们定义为表面上相等,如下面的例子所示:
console.log(null == undefined); // true
用等于操作符(==)比较 null 和 undefined 始终返回 true。但要注意,这个操作符会为了比较而转换它的操作数。
即使 null 和 undefined 有关系,它们的用途也是完全不一样的。永远不必显式地将变量值设置为 undefined。但 null
不是这样的。任何时候,只要变量要保存对象,而当时又没有那个对象可保存,就要用 null 来填充该变量。这样就可以保持 null
是空对象指针的语义,并进一步将其与undefined 区分开来。
Boolean(布尔值)类型是 两个字面值:true 和 false。
这两个布尔值不同于数值,因此 true 不等于 1,false 不等于 0。但仍然和上面 null 和 undefined 使用 == 操作符时 会自动转换操作数,比如
console.log(true == 1 );// true
Number 类型 内容就比较多了
先看一下整数部分
十进制
let intNum = 36; // 整数
八进制
let octalNum1 = 070; // 八进制的 56
let octalNum2 = 079; // 无效的八进制值,当成 79 处理
let octalNum3 = 08; // 无效的八进制值,当成 8 处理
十六进制
let hexNum1 = 0xA; // 十六进制 10
let hexNum2 = 0x1f; // 十六进制 31
let hexNum3 = 0xG; //Uncaught SyntaxError: Invalid or unexpected token
再看一下浮点数
let floatNum1 = 1.; // 小数点后面没有数字,当成整数 1 处理
let floatNum2 = 10.0; // 小数点后面是零,当成整数 10 处理
let floatNum1 = 1.1;
let floatNum2 = 0.1;
let floatNum3 = .1; // 有效,但不推荐
// 科学计数法小写的字母 e,再加上一个要乘的 10 的多少次幂
let floatNum = 3.125e7; // 等于 31250000
默认情况下,ECMAScript 会将小数点后至少包含 6 个零的浮点值转换为科学记数法(例如,0.000 000 3 会被转换为 3e-7)。
又要提到面试中经常被问到的问题了
问:你好,同学,0.1 + 0.2 为什么不等于0.3
答:JS 浮点值的精确度最高可达 17 位小数,0.1的二进制表示的是一个无限循环小数,JS对这个小数的二进制进行截取前17位,截取之后0.1不再是0.1,截取之后0.1变成了 0.100…001,0.2变成0.200…002。所以两者相加变成了 0.300…004
注意 之所以存在这种舍入错误,是因为使用了 IEEE 754 数值,这种错误并非 ECMAScript 所独有。其他使用相同格式的语言也有这个问题。
值得范围
Number.MIN_VALUE // 5e-324
Number.MAX_VALUE // 1.797 693 134 862 315 7e+308。
Number.MAX_SAFE_INTEGER // 整数安全最大值
Number.MAX_SAFE_INTEGER // 整数安全最小值
Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
超出范围数值会被自动转换为一个特殊的 Infinity(无穷)值。任何无法表示的负数以-Infinity(负无穷大)表示,任何无法表示的正数以 Infinity(正无穷大)表示。
对应得也有两个常量
Number.NEGATIVE_INFINITY // -Infinity
Number.POSITIVE_INFINITY //Infinity
NaN
但在 ECMAScript 中,0、+0 或-0 相除会返回 NaN:
console.log(0/0); // NaN
console.log(-0/+0); // NaN
如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity:
console.log(5/0); // Infinity
console.log(5/-0); // -Infinit
// NaN 不等于包括 NaN 在内的任何值。例如,下面的比较操作会返回 false:
console.log(NaN == NaN); // false
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值 10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1
内容有点多,先欣赏个名句,以后接着搞
观书有感
朱熹 南宋
半亩方塘一鉴开,
天光云影共徘徊。
问渠那得清如许?
为有源头活水来。