JavaScript从入门到放弃(2)——数据类型和变量

JavaScript从入门到放弃(2)——数据类型

JavaScript 数据类型

假定你已经有其他的程序设计语言基础,诸如C++,JAVA等,那么对Int、Char等一定不会陌生。结合ECMA-262[^1]中相关定义,抛开“类型”在静态类型和动态类型语言中的定义的争论,我们暂且认为JavaScript也想其他静态程序设计语言一样,具备如Int一样的数据类型定义,而在稍后的的描述中,你又会看到他们的不一样之处。
截至本文发布,JavaScript一共有以下七种内置类型:

  • null (空值)
  • undefined (未定义)
  • boolean (布尔值)
  • number (数字)
  • string (字符串值)
  • object (对象)
  • symbol (符号)
    其中除了object(对象以外),其他统称为简单数据类型(基本数据类型)。

null

null 类型只有一个值即null,从计算机存逻辑角度来说,null值表示一个空对象。所以当我们使用typeof运算符来查看其类型时,会发现返回类型为"object":
typeof null
事实上,这是JavaScript第一个版本设计时留下的BUG,但因为其改动会破坏现有语言结构,反而会产生更多的BUG,所以便一直留存下来。简单说一下这个BUG出现的原因:在第一个版本中,数值是以32位存储的,由标志位(1~3位)和其他部分组成,标志位和它所对应的类型如下:

  • 000:对象,数据是对象的应用。
  • 1:整型,数据是31位带符号整数。
  • 010:双精度类型,数据是双精度数字。
  • 100:字符串,数据是字符串。
  • 110:布尔类型,数据是布尔值。

而null的存储是全0,如此一来,当typeof监测标志位的时候发现前三位和对象类型的标志位是完全一致的,所以便有了上图的结果。关于这些类容可以参考这里
null值一般用于变量初始化或者判断一个已声明变量是否被赋值。但是,当判断一个变量的值是否为null时候应该用下面的复合条件来判断:

//正确做法
var a = null;
(!a && typeof a==="object") //true
//反例
var b=undefined
b==null //true

事实上,null是唯一一个使用typeof运算符后除object类型以外会返回"object"的数据类型。

undefined

Undefined 类型也只有一个值那就是undefined,一般而言,已经申明但未赋值的时候变量的值(javascript)类型即为undefined:
undefined
值得注意的是,对未声明(undeclared)的变量执行typeof运算,返回的也是undefined:
undeclared
但当我们试图使用test时程序运行正常,而anyVar则会抛出异常:
在这里插入图片描述
所以这里需要注意的是,变量未定义(not defined/undeclared)和undefined有着严格意义上的区别。假设当typeof 一个没有声明的变量时返回的结果为undeclared,那么我们就不需要这么多废话了[^2]。

boolean

同其他程序设计语言一样,boolean类型只有两个值:true 和 false。

number

number的值包含了所有数字(我们常见的1,2,1.2等),还包含了NA,无穷(正无穷(positive Infinity)和负无穷(negative Infinity)):
在这里插入图片描述
由于浮点保存浮点类型所需空间是整数值的两倍,所以浮点型会被转换为整数值,如 var a=1,b=1.000(a===b / true)。对于极大或极小的数,可以用科学计数法(e)表示,一般来说,当小数点以后有六个零或以上时,会被自动转换为e表示的值:
在这里插入图片描述
在浮点运算时不要尝试去做比较,老生常谈的一个例子
在这里插入图片描述
是因为JavaScript采用了IEEE754浮点计算规则,这当然不只是JavaScript会出现类似情况,IEEE754可以看这里
处理上述十进制以外,整数还可以通过其他进制来表示:
在这里插入图片描述
但应该注意,八进制中当后面的数字超过进制表示范围(0~7)的时候,前导0将会被忽略,后面的数值当作十进制解析。

WU在这里插入图片描述

无论八进制还是十六进制,在进行算数运算时都会被转换成十进制。

string

string是一个有序的、长度有限的包含领个或更多16位无符号的整数列表。
可以这么理解,字符串值是一个二维数组,一个维度表示字符的顺序,一个维度是字符的二进制表达。
这里需要注意的是,和其他设计语言不同,JavaScript的字符串是不可变的,操作string类型的值意味着必然生成一个新的对象(开辟新的存储空间),和C语言的string类型不同,通过相似方法操作字符串会使得两者其实是同一个字符串,即前后的存储空间未发生改变。
在这里插入图片描述

object

JavaScript对象其实就是一组数据和功能的集合[^3]。类似Java中的object,JavaScript的object也是所有对象的基础。

在这里插入图片描述

[1]:ECMAScript 第九版 (http://www.ecma-international.org/publications/standards/Ecma-262.htm)
[2]: Kyle Simpson《你不知道的JAVASCRIPT(中卷)》
[3]: Nicholas C.Zakas《JavaScript高级程序设计(第三版)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值