文 / ChenMiaochun
JavaScript有7种数据类型,其中包括6种基本数据类型和1种引用类型(Object)。这篇文章主要讲讲JavaScript的6种基本数据类型和与基本类型相关的两种操作符typeof和比较操作符==和===。6种基本数据类型分别为:
1、Number
2、Boolean
3、String
4、Null
5、Undefined
6、Symbol
由于JavaScript(js)的设计者当初设计JavaScript的时候是参照Java来的,所以js有很多地方与Java相似,包括这里的基本数据类型。
Java的基本数据类型有4种,分别为整形,浮点型,布尔型以及字符型。
为什么是这四种呢?其实想一下就明白了,计算机刚开始是为了计算而被发明的,肯定包括整形和浮点型这两种关于计算的类型;另外字符型是因为计算机不仅仅用作计算,还可以展现很多信息,信息就是由字符构成的;最后为什么有布尔型,其实这跟我们计算的过程中的逻辑判断有关,我们现实世界也经常用到逻辑判断来交流,比如“如果今天不下雨我就出门玩”,这就是逻辑判断,计算机也一样,逻辑判断得到的值就用布尔型来表示。
js也差不多,用Number代表整形和浮点型,用Boolean代表布尔型,用String代表字符型和java中的String引用类型。
另外js还有3种数据类型,分别是Null,Undifined和Symbol。Symbol在ES6中新定义,符号类型是唯一的并且不可修改,这里不细讲。下面分别讲讲前面五种基本数据类型。
Number
js数字范围是 -(2的63次方-1) ~ (2的63次方-1) ,字面量除了具体的数值,还有三个特殊的值:+Infinity,-Infinity和NaN。这仨也是number类型,分别当计算为:19 /+0(或19/+0.0,下同), 19/-0, 0/0时取得。与Java不一样的是,Java是只有浮点型才会有这仨值+一个负零,分别是:19.0/0.0, -19.0/0.0, 0.0/0.0,,负零是:-19.0/inf。这仨示例如下(其中typeof操作符表示判断数据类型,最后会细讲):
var a = 19/+0; //或者19/+0.0,结果一样
var b = 19/-0;
var c = 0/0;
document.write(typeof a); //number
document.write(typeof b); //nunmber
document.write(typeof c); //number
document.write(a); //+Infinity(或Infinity)
document.write(b); //-Infinity
document.write(c); //NaN
Boolean
可以有两个值:true和false。这个与Java的一样。
String
第一个字符的下标为0,字面量为单引号或双引号括起来的值。
JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改(因为我们如果var str = "abcdefg";str = "zzzz";其实是弄了个新值给它而不是修改它的值,这点应该跟java一样)。但是,可以基于对原始字符串的操作来创建新的字符串。
例如:获取一个字符串的子串可通过选择个别字母或者使用String.substr()。这个方法参数与Java的substring有些不一样。js的substr(开始index,长度),而Java的substring为(开始Index,结束Index(不包括结束的Index字符)),Java这么设计是方便计算截取的子串的长度,这样长度=endIndex - startIndex。但如果只传入一个参数,两者一样,都是(开始Index)。但js也有一个substring()方法跟Java的完全一样。
又例如:两个字符串的连接使用连接操作符 (+) 或者String.concat()。
Null
Null 类型只有一个值:null,表示空值,表示没有被呈现。
Undefined
一个没有被赋值的变量会有个默认值undefined。JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
操作符
这里讲讲两种操作符typeof和比较操作符(==和===)。
typeof
由于JavaScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof就是负责提供这方面信息的操作符。
取值有:'undefined' —— 未定义,'boolean' —— 布尔值,'string' —— 字符串,'number' —— 数字值,'object' —— 对象或null,function —— 函数。举例如下:
typeof 'some string'; //string
typeof 95; //number
typeof null; //object
==和===
==会自动转换数据类型再比较,有时会有比较诡异的结果,而===不会转换数据类型,数据类型不一致时直接false,一致再比较。
如false == 0为true,false===0为false。
另外NaN与自己不相等,不管是NaN==NaN还是NaN===NaN都是false,这点与java一致。判断只能通过isNaN(NaN)来,这与Java的Float.isNaN()和Double.isNaN()一致。
最后注意浮点数的比较,如1 / 3 === (1 - 2 / 3); // false,这不是Js的错,这是计算本身的特性决定,所以要判断是否相等只能通过计算绝对值差值,如:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true。
网友评论