一.数据类型

js中的数据类型:
5种基础类型:Undefined,Null,Boolean,Number,String
1种复合类型:Object(对象包括数组,函数等)

1.字符串String

字符串是一组由16位值组成的不可变的有序序列,由单引号或双引号括起来的字符序列。字符串的长度是其所包含的16位值的个数,字符串可以通过\反斜线来转义。

2.数字Number

数字是由整数和浮点数组成的,infinity表示无穷大的数,表示超出js所能表示的数字的上限,NaN表示非数字值,且NaN与其他任何值都不相等,包括它自身

3.布尔值Boolean

布尔值是有true和false两个值组成的,且在js中true和false都是保留字。

4.Undefined

Undefined是有undefined一个值组成的,通常用来表示未定义或’值的空缺’。

5.Null

Null是由null一个值组成的,通常用来表示’空值’,对null执行typeof运算,会返回’object’,所以通常null一般被认为是一个空对象的引用。

6.对象Object

对象是是属性的容器,其中每个属性都有名字和值。对象类型包括对象,数组和函数。

二.类型转换

显示转换:

使用String(), Number(), Boolean(), Object()分别对数据进行字符串,数字,布尔值,对象等的转换,也称为强制转换,用法如下:

1
2
3
4
5
6
7
String(123) // “123"
Number(‘123’) // 123,
Number(‘fddas4234’) // NaN
Boolean(0) // false
Boolean(23) // true
Boolean(‘adsf’) // true
Object(3) // new Number(3)

而且除了null和undefined外,其他任何值都具有toString(),通常toString()方法和String()方法返回的结果一致!parseInt()和parseFloat()方法分别把数据转换成整数和浮点数,parseInt()方法还可以接受第二个参数,表示转换的基数:

1
parseInt(11, 2) // 3

而对于对象都继承了两个转换方法,第一个是toString()方法,他返回:

1
({a:1}).toString() // “[object object]"

第二个方法是valueOf(),大多数情况下,valueOf()方法只是简单的返回对象本身:

1
({a:1}).valueOf() // {a:1}
隐式转换:

在js中,很多情况下部分运算符会对操作数进行隐式的类型转换,这也是很多面试官喜欢在面试题中考大家的重点内容如:

1
2
3
4
5
6
1 + '1' // ‘11'
2 - ‘1// 1
+'32' // 32
!0 // true
var a = 2; a++ // 2
var a = 2; ++a // 3

在js中,- * /会把操作数转换成数字,但是请注意,+比较特殊,因为在js中,+号不仅是数字运算符,也是字符串连接符,所以在出现加号的时候就要根据具体情况去看结果了,如果+号的两端都是数字,那么结果自然也是数字,同理两端都是字符串,那么结果也同样是字符串,如一端是数字,一端是字符串,那么就会把数字先转换成字符串,在进行连接,所以结果是字符串:

1
2
3
4
1 + 1 // 2
1’ + ’2// ’12'
1 + ‘1// ‘11'
2’ + 1 // ‘21'

同时还要注意,在多个数同时进行运算时,同样要按照运算符的优先级顺序进行计算:

1
2
'12' + 1 * 2 // ‘122’
12 + 1 + ‘2// ‘132'

在这里特别要注意的是相等性比较运算符==也会对操作数进行隐式转换,而===则不会进行类型转换:

1
2
3
0 == false // true
'1' == 1 // true
1 === ‘1// false

三.类型检测:

typeof运算符:
typeof 返回:undefined,boolean,number,string,object,function。6种值

在对null进行typeof操作是返回object,
这是因为null一般被认为是一个空对象的引用,所以会返回object

在对
数组进行typeof运算时同样也会返回object,
这在遇到需要对数组进行类型检测的时候,显然是无法使用typeof运算符的,这是我们可以使用对象的toString()方法:

1
Object.prototype.toString.call([1,2])//"[object Array]"

这样我们可以简单封装成一个检测是否为数组的函数:

1
2
3
4
5
6
function isArray(array) {
return Object.prototype.toString.call(array).slice(8, 13) === 'Array';
}
// isArray()方法返回true or false
isArray(123) // false
isArray([1,2]) // true

同样的,也可以封装成一个类型检测函数:

1
2
3
4
5
6
7
8
9
10
11
12
function type(array) {
return Object.prototype.toString.call(array).match(/\w+/g)[1];
}
// type()返回”String",”Number",”Object",”Function”,”Boolean”,”Null",”Undefined”,”Array”等具体的类型
type(NaN) // ”Number"
type(undefined) // "Undefined"
type([1,2]) // "Array"
type(’sdfsd’) // ”String"
type(null) // ”Null"
type({a:2}) // ”Object"
type(function(){}) // ”Function”
type(true) // ”Boolean”

instanceof运算符:
instanceof运算符用于检测所给数据是否属于所给的类型:

1
[1,2] instanceof Array //true

不过对于字符串,数字的原始值的检测中instanceof总是返回false:

1
2
‘dsa' instanceof String//false
new String(123) instanceof String//true

当还有一种方式可以用.constructor检测其构造函数的方式来进行类型检测:

1
"fdsff".constructor == String//true

以上内容对js中的几种数据类型,以及数据类型转换,数据类型检查等做了简单介绍。相信大家也都有所了解!

本文允许全文转载,转载请注明来源:
平凡公子 - 数据类型及类型转换