Undefined 类型
只有一个值,即特殊的 undefined
。声明了但未对其加以初始化时,这个变量的值就是undefined
。对未声明的变量使用typeof
操作符会返回undefined
。但是其它操作的话就会报错。
console.log(typeof foo) // "undefined"
console.log(foo) // ReferenceError
关于 undefined
还有一种严谨的做法就是通过 void 0
来实现。这样实现的原因是 undefined
不是 JavaScript 的关键字,也就是说可以将 undefined
作为标识符,或者说 window.undefined
的值是可以被修改的。
Null 类型
只有一个值,即特殊的 null
。从逻辑角度来看,null
值表示一个空对象指针,所以使用typeof
操作符检测null
值返回object
。
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为
null
。
Boolean 类型
主要介绍 Boolean() 函数
console.log(Boolean('a')) // true
console.log(Boolean('')) // false
console.log(Boolean(1)) // true
console.log(Boolean(0)) // false
console.log(Boolean(-1)) // true
console.log(Boolean(NaN)) // false
console.log(Boolean(Infinity)) // true
console.log(Boolean(-Infinity)) // true
console.log(Boolean({})) // true
console.log(Boolean(null)) // false
console.log(Boolean(undefined)) // false
Number 类型
采用IEEE754格式来表示整数和浮点数值。
// 十进制
const intNum = 55;
// 八进制 -- 第一位必须是 0 ,后面是八进制数字序列(0 ~ 7)在严格模式下无效,并抛出错误。
const octalNum1 = 070; // 八进制的 56
const octalNum2 = 079; // 无效的八进制数值--解析为79
const octalNum3 = 08; // 无效的八进制数值--解析为8
// 十六进制 -- 前两位必须是 0x ,后面是十六进制数字(0 ~ 9 及 A ~ F),字母 A ~ F 不分大小写。
const hexNum1 = 0xA; // 十六进制的10
const hexNum1 = 0x1f; // 十六进制的31
在进行算数运算时,所有八进制和十六进制的数值都将被转换为十进制数值。
浮点数值
- 最高精度是17位小数。
- 默认情况下,ECMAScript会将小数点后面带有6个零以上的浮点数值转换为科学计数法。
- 永远不要测试某个特定的浮点数值。
const floatNum1 = .1; // 有效,不推荐
const floatNum2 = 1.; // 小数点后没有数字,解析为1
const floatNum3 = 10.0; // 整数,解析为10
const floatNum4 = 3.125e7; // 科学计数法。3.125乘以10的7次方。等于 31250000。
//判断两个数是否相等
function equal(n1, n2) {
return Math.abs(n1 - n2) < Number.EPSILON;
}
equal(0.1 + 0.2, 0.3) // true
数值范围
- Number.MIN_VALUE。最小数值,多数浏览器这个值是 5e-324
- Number.MAX_VALUE。最大数值,多数浏览器这个值是 1.7976931348623157e+308
- 如果超出范围就会自动转为特殊的 Infinity 值,如果是正数就是 Infinity(正无穷),负数就是 -Infinity(负无穷)。
- isFinite() 函数判断一个数是否是有穷的。
- Number.NEGATIVE_INFINITY。负无穷的值。
- Number.POSITIVE_INFINITY。正无穷的值。
NaN
- 任何涉及NaN的操作都会返回NaN。
- NaN不等于任何值,包括NaN本身。
通过 isNaN() 函数检查传入的参数是否“不是数值”。
console.log(0/0); // NaN console.log(10/0); // Infinity console.log(-10/0); // -Infinity console.log(10/'a'); // NaN console.log(10/''); // Infinity console.log(10/undefined); // NaN console.log(10/true); // 10 console.log(10/false); // Infinity console.log(10/null); // Infinity console.log(isNaN(NaN)); // true console.log(isNaN(10)); // false console.log(isNaN("10")); // false -- 可以被转换成数值10 console.log(isNaN("blue")); // true -- 不能转换成数值 console.log(isNaN(true)); // true -- 可以被转换成数值 1 // isNaN() 也适用于对象。会先调用对象的 valueOf() 方法,如果返回值不能转换为数值,则基于这个返回值再调用 toString() 方法,再测试返回值。
数值转换
- Number()
- parseInt()
- parseFloat()
console.log(Number(10)); // 10
console.log(Number("")); // 0
console.log(Number("abc")); // NaN
console.log(Number("000011")); // 11
console.log(Number("123abc")); // NaN
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(null)); // 0
// 使用 parseInt() 推荐始终带上第二个参数:转换时使用的基数(即多少进制)。
console.log(parseInt(22.5); // 22
console.log(parseInt("")); // NaN
console.log(parseInt("70")); // 70
console.log(parseInt("123abc")); // 1234
console.log(parseInt("070")); // ECMAScript 5 认为是70(十进制),ECMAScript 3 认为是56(八进制)
console.log(parseInt("0xA")); // 10
console.log(parseInt("0xf")); // 15
// parseFloat() 会解析每个字符,或解析到遇见一个无效的浮点数字符为止。而且始终会忽略前导的零。只解析十进制值。
console.log(parseFloat("22.5")); // 22.5
console.log(parseFloat("123abc")); // 123
console.log(parseFloat("0xA")); // 0
console.log(parseFloat("22.34.5")); // 22.34
console.log(parseFloat("0908.5")); // 908.5
console.log(parseFloat("3.125e7")); // 31250000
String 类型
String 类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。任何字符串的长度都可以通过访问其length
属性取得。
字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列。
字面量 含义 \n 换行 \t 制表 \b 退格 \r 回车 \f 进纸 \\ 斜杠 \’ 单引号 ( ‘ ) ,在用单引号表示的字符串中使用,例如: ‘He said, \’hey.\’ ‘ \” 双引号 ( ” ) ,在用双引号表示的字符串中使用,例如: “He said, \”hey.\” “ \xnn 以十六进制代码 nn 表示的一个字符(其中 n 为 0 ~ F)。例如, x41 表示 ‘A’ \unnnn 以十六进制代码 nnnn 表示的一个 Unicode 字符(其中 n 为 0 ~ F)。例如, u03a3 表示希腊字符 Σ
转换为字符串
1. toString()
除了null
和undefined
没有这个方法,其它都有。有一个参数:输出数值的基数,默认是十进制。
const num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"
const bool = true;
console.log(bool.toString()); // "true"
const obj = {};
console.log(obj.toString()); // "[object Object]"
const func = function() {};
console.log(func.toString()); // "function() {}"
const nul = null;
console.log(nul.toString()); // TypeError: Cannot read property 'toString' of null
const unde= undefined;
console.log(unde.toString()); // TypeError: Cannot read property 'toString' of undefined
2. String()
在不知道要转换的值是不是null
或undefined
的情况下,还可以使用转型函数String()
,这个可以将任何类型的值转为字符串。遵循以下转换规则
- 如果值有
toString()
方法,则调用该方法(没有参数)并返回相应的结果; - 如果值是
null
,则返回"null"
- 如果值是
undefined
,则返回"undefined"
3. 使用加号操作符与一个字符串(” “)加在一起
const bool = true;
console.log(bool + ""); // "true"
const nul = null;
console.log(nul + ""); // "null"
const unde= undefined;
console.log(unde + ""); // "undefined"
typeof 操作符
// typeof的操作数可以是变量也可以是字面量
console.log(typeof foo) // "undefined"
console.log(typeof true) // "boolean"
console.log(typeof "abcd") // "string"
console.log(typeof 1) // "number"
console.log(typeof null) // "object"
console.log(typeof {}) // "object"
console.log(typeof function(){}) // "function"