undefined

在数值类型环境中, undefined 的值会被转换为 NaN ,所以

  1. var a;
  2. a+2; // 计算为 NaN

null

空值 nulll 在数值类型环境中会被当做0来对待,所以

  1. var a=null;
  2. a*32; // 结果是0

number

使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)。

整数

整数可以用十进制(基数为10)、十六进制(基数为16)、八进制(基数为8)以及二进制(基数为2)表示。

  • 十进制整数字面量由一串数字序列组成,且没有前缀0。
  • 八进制的整数以 0(或0O、0o)开头,只能包括数字0-7。
  • 十六进制整数以0x(或0X)开头,可以包含数字(0-9)和字母 a~f 或 A~F。
  • 二进制整数以0b(或0B)开头,只能包含数字0和1。

严格模式下,八进制整数字面量必须以0o或0O开头,而不能以0开头。
image.png

在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。

浮点数

该数值中必须包含一个小数点,并且小数点后面必须至少一位数字。
由于保存浮点数值需要的内存空间是保存整数值的两倍,因为ES会不失时机地将浮点数值转换为整数值。

  1. var fnum1=1.; // 小数点后面没有数字,所以解析为1
  2. var fnum2=10.0; // 整数,解析为10

在默认情况下,ES会将那些小数点后面带有6个0以上的浮点数值转成为以e表示法(科学计数法)表示的数值。例如 0.0000003 会被转换为 3e-7

string

字符串是一组由16位值组成的不可变的有序序列。字符串的长度是其所含16位值的个数。
ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,例如:

  1. let lang = 'Java';
  2. lang = lang + 'Script';

以上示例中的变量lang开始时包含字符串”Java”。而第二行代码把1ang的值重新定义为”Java”与”Script”的组合,即”JavaScript”。实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充”Java”和”Script”,最后一步是销毁原来的字符串”Java”和字符串”Script”,因为这两个字符串已经没用了。这个过程是在后台发生的,而这也是在某些旧版本的浏览器(例如版本低于1.0的Firefox、IE6等)中拼接字符串时速度很慢的原因所在。但这些浏览器后来的版本已经解决了这个低效率问题。

js采用UTF-16编码的unicode字符集。最常用的unicode字符都是通过16位的内码表示,并代表字符串中的单个字符。那些不能表示为16为的unicode字符则遵循utf-16编码规则——用两个16位值组成一个序列(亦称作“代理项对”)表示。这意味着一个长度为2的js字符串(两个16位值)有可能表示一个Unicode字符。

  1. var a='𠮷';
  2. a.length; // =>2, 其通过utf-16编码之后包含两个16位值: "\uD842\uDFB7"

早期的 JavaScript 在推广时,仍然采用传统的数据类型的分类方法,也就是说,它宣称自己同时支持值类型和引用类型的数据,并且,所谓值类型中的字符串是按照引用来赋值和传递引用(而不是传递值)的。javascript中字符串是通过传址来复制和传递的,而它们是通过传值来比较的。

布尔值

下面这些值会转换为false:

  • null
  • undefined
  • 0
  • -0
  • NaN
  • “ “

所有其他值,包括所有对象(数组)都会转换成true,false和上面6个可以转换成false的值有时称做“假值”(falsy value),其他值称作“真值”(truthy value)。
js期望使用一个布尔值的时候,假值会被当成false,真值会被当成true