JavaScript 数据类型小结

我们可以将 JavaScript 中所有数据分为基本数据类型引用类型,基本数据类型存在在中,引用类型存在中,变量名存储的是一个指向堆中的地址。

基本数据类型

一共有五种基本数据类型:数值型 Number、字符串 String、布尔型 Boolean、Undefined 型、Null 型。

数值型

数值型有整数型和浮点型,整数有十进制、八进制(严格模式下无效)、十六进制,其他进制在计算时都会转换为十进制。

浮点型保留小数点后十七位,有 e 指数表示形式。

数值型有一个特别的值:NaN(Not a Number),NaN 表示一个本来要返回数值的操作数未返回数值的情况,比如除数为 0 的情况,这样可以避免抛出错误,不影响其他代码的执行。

涉及任何 NaN 的操作都会返回 NaN;NaN 与任何值都不相等,包括它自己。可以用 isNaN() 方法判断,其他数据类型自动转换为数值类型。

1
2
3
4
5
isNaN(NaN); // false
isNaN(7); // false
isNaN("7"); // false
isNaN("echo"); // true
isNaN(false); // false

字符串

用单引号或者双引号括起来的就叫字符串,引号嵌套可以用转义字符。

布尔型

布尔型有两个值:true 和 false。

Undefined

Undefined 型只有一个值:undefined,表示变量声明了但未初始化。

1
2
var msg;
console.log(msg); // undefined

Null

Null 型也只有一个值:null,表示空对象指针,若定义的变量想用来保存对象,最好将其初始化为 null。

关于 null 和 undefined

undefined 是 null 派生而来。

1
2
undefined == null; // true
undefined === null; //false

相互转换

其他 – > 数值

转换情况: Number()、parseInt()、parseFloat()、一元加运算符。

Number()

Number() 的效果与一元加运算符等效(+ 一边是字符串时,+ 为连接符)。

true –> 1;false –> 0;null – >0;undefined –> NaN。

空字符串 –> 0;非空字符串全为数值时,直接转换为数值型,忽略八进制前缀 0(即不转换为八进制),不忽略十六进制前缀 0x,其他字符串为 NaN。

1
2
3
4
5
6
7
8
9
10
Number(true); // 1
Number(false); // 0
Number(null); // 0
Number(undefined); // NaN
Number(""); // 0
Number("123"); // 123
Number("0123"); // 123
Number("0x123"); // 291
Number("123echo"); // NaN
Number("echo"); // NaN

parseInt()

由于 Number() 函数转换字符串时复杂且不太合理,所以我们一般使用 parseInt() 将字符串转换成整数,使用 parseFloat() 转换成浮点数。parseInt() 会忽略字符串前面的空格,如果第一个非空字符是数字,函数会一直解析到第一个非数字字符。

1
2
3
4
5
6
7
8
9
10
11
12
parseInt(true); // NaN
parseInt(false); // NaN
parseInt(null); // NaN
parseInt(undefined); // NaN
parseInt(""); // NaN
parseInt("123"); // 123
parseInt("123.4"); // 123
parseInt("0123"); // 123
parseInt("0x123"); // 291
parseInt("123echo"); // 123
parseInt("echo"); // NaN
parseInt("echo123"); // NaN

我们可以看到除了非空字符串,parseInt() 均返回 NaN,因此 parseInt() 通常只用于字符串转数值的情况。

parseFloat()

类似 parseInt(),parseFloat() 不同的只是不会忽略字符串中的小数点。

其他 – > 布尔

在使用 Boolean(xxx) 方法,或条件和循环中的判断语句中其他数据类型会转换成布尔型。

对于基本数据格式:数值(0/NaN)、空字符串、null、undefined 转为 false。其余转换为 true。

其他 – > 字符串

加号操作符(连接符)

一元加号运算符除了计算之外,还有一个用途就是连接字符串与其他数据类型。

1
2
3
4
5
6
"echo" + 123; // "echo123"
"echo" + true; // "echotrue"
var age = 18;
"echo" + age; // echo18
"echo" + null; // "echomull"
"echo" + undefined; // "echoundefined"

toString()

1
xxx.toString(2/8/10/16)

String()

1
String(xxx)

toString() 与 String() 的区别在于:null 和 undefined 没有 toString() 这个方法。所有基本数据类型都有 String() 方法。

引用类型

引用类型是一种数据类型,引用类型的值也叫对象,常见的引用类型有 Object、数组 Array、正则表达式 Rep、日期 Date、函数 Function 等。由于数组的方法较多容易混淆,所以只归纳了数据的一些常用方法。

数组

常用方法

push(elements): 添加到数组尾部,返回新数组长度。

pop(): 移除数组最后一项,返回移除元素。

shift(): 移除数组第一项,返回移除元素。

unshfit(elements): 添加到数组头部,返回新数组长度。

reverse(): 反转数组。

sort(): 排序方法,直接使用 sort 方法会默认调用 toString(),因此通常使用比较函数。

1
2
3
arr.sort(function(a,b) { // 从小到大
return a - b;
});

arr.concat(arrs): 连接多个数组,返回新数组

splice(): 删除/插入数组,不影响原数组。

1
2
3
arr.splice(start)
arr.splice(start, deleteCount)
arr.splice(start, deleteCount, item1, item2, ...)

indexOf()/lastIndexOf(): 查找某一项所在位置,返回索引,默认使用全等符号。

every(): 对数组中每一项执行给定函数,若每一项返回 true 则返回 true。

filter(): 对数组中每一项执行给定函数,返回所有返回 true 的项组成的数组。

forEach(): 对数组中每一项执行给定函数,无返回。

map(): 对数组中每一项执行给定函数,返回所有结果。

some(): 对数组中每一项执行给定函数,若任一项返回 true,则返回 true。

redeuce()/reduceRight(): 函数返回值会左右第一个参数自动传给下一项,类似迭代。

join(“连接符”): 通过连接符将数组转换成字符串。同样可以通过 split(“连接符”) 方法将字符串转换成数组。

1
2
3
4
var arr = [1,2,3,4,5];
var sum = arr.reduce(function(prev,cur,index,array) {
return prev + cur;
}); // 15

类型检测

typeof

typeof 不能检测出具体引用数据类型,特别地 null 返回 object。

typeof 返回值:object、number、string、boolean、undefined(变量未声明或者声明了未初始化)、function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var arr = [];
var oNum = 123;
var oStr = "Echo";
var oBoolean = false;
var oo;
var fun = funtion() {
console.log("I am a function");
}
typeof arr; // object
typeof null; // object
typeof oNum; // number
typeof oStr; // string
typeof oBoolean; // boolean
typeof oo; // undefined
typeof yy; // undefined
typeof fun; // function

typeof 经常用来判断一个变量是否存在。

1
if (typeof xx != "undefined") {}

instanceof

instanceof 一般用来判断对象的具体类型,或者判断某个变量是否是某个对象的实例。

1
2
3
4
var arr = [];
arr instanceof Array; // true
arr instanceof Object; // true
Array instanceof Object; // true
Fork me on GitHub