JavaScript的数据类型

200 阅读5分钟

最新的ECMAScript标准定义了7种数据类型:

  • Boolean
  • String
  • Number
  • Null
  • Undefined
  • Symbol
  • Object

Null和Undefined

NullUndefined都可以表示为没有的意思,并且在if语句中,都表示false

var a=null;

var a=undefined;

上面代码中变量a被分别赋值为nullundefined,这两种写法实现的效果几乎是一样的。

 if(!null){
     consolo.log('null is false')
 }
 //null is false
 if(!undefined){
     console.log('undefined is false')
 }
 //undefined is false
 
 null==undefined
 //true

从上面👆的代码可以看出nullundefinedif语句中都表示为false,并且实现的效果也几乎是一样的。

但是为什么会有这两种似乎一致的数据的类型呢

1995年JavaScript诞生时,最初的设计是null只表示,并且null可以自动转换为0

Number(null)
//0
10+null
//10

上面代码表示, null转化数字是0。 JavaScript的作者感觉这样可能不是很严谨,因为null也是被当做一个对象的,他认为最好不是一个对象,并且null会自动转换为0,当时的JavaScript还不包括错误处理机制,很不容易发现错误。

所以他又设计了一个undefined,两者的区别是null表示一个空对象,转换为数值时为0; undefined表示此处无定义的原始值,转换为数值时为NaN

Number(undefined)
//Nan
10+undefined
//NaN

使用场景

//声明了变量,但是没有赋值
var a;
//undefined

 function fn(a){
     return a;
 }
 //没有传入参数a,表示参数为空
 fn();
 //undefined
 
 //参数a未设置任何值,这时候就可以传入null
 fn(null);
 //null
 

布尔

布尔 是英国著名的数学家,因为他对逻辑学做出的突出贡献,所以用他的名字来命名,以此来纪念这位伟大的数学家。

布尔类型只有真和假两个状态。真用true表示,假用false表示。

下面运算符会返回布尔值:

  • 逻辑运算符:!container
  • 相等运算符:===,==,!==,!=
  • 比较运算符:>,<,>=,<=

与其他类型的转换规则

转换规则除了以下六个值被转为false,其他都视为true

  • false
  • Null
  • Undefined
  • 0
  • ""或 ''(空字符串)
  • NaN

使用场景

布尔类型通常用于流程的控制,比如:

if(true){
    consolo.log('hello');
}
//hello

注意,空数据([])和空对象({})对应的布尔值都是true

Number

整数和浮点数

JavaScript内部,所有数字都是以64位浮点数形式保存的,即使整数也是如此,所以11.0是相同的,是同一个数。

1===1.0
//true

数值的进制

JavaScript对整数提供四种进制的表达方式:十进制,十六进制,八进制,二进制。

  • 十进制:不是以0开头的数值
  • 八进制:有前导0o0O的数值,或者有前导0并且只有0-7的八个阿拉伯数字的数值。
  • 十六进制:有前缀0x0X的数值
  • 二进制:有前缀ob或者0B的数值

默认情况下,JavaScript内部会将八进制、十六进制、二进制,自动转换为十进制。

0xff //255
0o377 //255
ob11 //3

如果八进制,十六进制,二进制中出现了不属于该进制的数字,就会报错。

通常来说,有前导0的数字会被识别成八进制的数字,但是如果前导0后面有8或者9,就会被识别为十进制的数字。

特殊数值

正零和负零

JavaScript内部实际存在两个0,是+0-0,区别就是64位浮点数表示法的符号不一致。它们是相同的。

-0===+0 //true
0===-0 //true
0===+0 //true

几乎所有的场合+0-0都是当做正常的0

+0 //0
-0 //0
(-0).toString() //'0'
(+0).toString() //'0'

唯一有区别的场合是做分母的时候,+0-0的返回值是不一样的。

(1/-0)===(1/+0)  //false

以上代码是不成立的,因为除以正0得到的是+Infinity,除以负0得到的是-Infinity,这两者是不相等的。

Nan

Nan是JavaScript的特殊值,表示“非数字”,(Not a Number),主要出现在把字符串解析成数字的出错的场合。

10-'a'
//Nan

上面代码运行时,会自动讲字符串a转换成数值,但是a不是数值,所有最后得到Nan,表示它是Nan 非数字。

0除以0也会得到Nan

0/0
//NaN

NaN并不是一个独立的数据类型,它是一个特殊的数值,它的数据类型依然是Number,使用typeof可以看到

typeof NaN
//number

NaN不等于任何值,包括它本身。

NaN === NaN
//false

数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立

[NaN].indexOf(NaN)
//-1

NaN在布尔运算时当做false

Boolean(NaN)
//false

**NaN与任何数(包括它自己)的运算结果都是NaN

1 + NaN 
//Nan
NaN + NaN
//NaN
NaN / 1 
//NaN

Infinity

Infinity表示无穷,用来表示两种场景,一种是正的数值太大,一种是负的数值太小,无法表示;另一种是0除以0得到Infinity

Infinity有正负之分,+Infinity表示正的无穷,-Infinity表示负的无穷

Math.pow(4, 1024)
//Infinity
0 / 0
//NaN
1 / 0
//Infinity

0除以0会得到NaN,而非0数除以0会得到NaN

Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)

InfinityNaN比较,总是返回false

0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity

0*Infinity
//NaN
0/Infinity
//0
Infinity/0
//Infinity

Infinity加上或乘以Infinity,结果都是Infinity

Infinity + Infinity
//Infinity
Infinity * Infinity
//Infinity

Infinity减去或除以Infinity,结果都是Nan

Infinity-Infinity
//NaN
Infinity / Infinity
//NaN

Infinitynull 计算时,null会转成0,等同与0的计算

null * Infinity
//NaN
null / Infinity
//0
Infinity / null
//Infinity

Infinityundefined计算,结果都是NaN