JS数据类型
今天我们所讲的JS,是特指ECMAscript。在ECMAscript中,数据类型没有其他强类型语言丰富,ES6之前的数据类型由5种基本数据类型(Undefined, Null, Number, String, Boolean)和一种特殊复杂数据类型构成(Object),在ES6之后,有新增了一种基本数据类型(Symbol)。接下来,我们将对各数据类型做出简介:
基本数据类型
Undefined
Undefined 类型 只有一个唯一值undefined,表示”缺省值”,即此处应该有值存在,但为声明。产生undefined值的场景主要有以下几大典型:
1. 声明变量但未赋值时
var variables; // undefined
2. 调用为定义的变量或函数使用未声明的参数时
console.log(myObject); // undefined
3. 函数没有显示返回值时
function myFunction(){ } // 此时函数返回值为undefined
4. 调用对象未声明的属性或方法时
Object.muchMoney // undefined
而检测Undefined类型,我们使用 typeof (typeof someVarible)去进行类型检查;需要注意,以下两种方式都会返回undefined值,但他们有本质的区别:
var money;
typeof money === 'undefined' // true
typeof house === 'undefined' // true
在此,我们注意到,对于声明未赋值的变量和未声明的变量,typeof都会返回undefined值,但我们在实际开发中,应该注意变量都要赋一个初值,这样,我们就能很好的判断,返回undefined值的变量时由于没有定义而不是没有赋值;
Number
在JS中,并不会想起它强类型语言一样区分数值类型,即整数和浮点数在JS中是没有区别的,它们均以双精度64位格式储存。但在具体实现时,整型的数字值通常被当做32位整型。
整型数字的常用进制:
- 二进制 以前缀为0b开头的数字,数字只能有0或1组成,如 0b10;
- 八进制 以前缀 0 开头数字,数字只能以0~7组成, 如070;
- 十进制 最常用的进制,目前不指定进制时,默认都为10进制,如 10;
- 十六进制 以前缀0x开头,数字只能由0~9和A~F的字母混合组成,字母不区分大小写,如 0xaf15;
进制之间的转换
整数之间的进制转换可以使用parseInt() 或者 toString(), 只需知道进制即可转换为相应的数字;
注意点
千万不能将两个浮点数运算之后与另一个浮点数比较,这会给你带来意想不到的错误。由于浮点数存在精度问题,此问题在大多数语言中均存在,如0.1 + 0.2 是不会乖乖的等于0.3的。
Null
Null 也是只有一个唯一值的类型,其值为null。Null实际上是一个空对象指针,故,我们在声明一个空对象时,可以将其初值设为null。
var myObject = null;
typeof null; // Object
Boolean
Boolean 类型有两个值,true 和 false。在JS中,控制流语句中,会存在自动执行Boolean类型的转换,我们需要注意其转换规则。唯一能转换为false的值有以下几类:
- 空字符串 “”;
- 数字0 与 NaN;
- null
- undefined
- false (Boolean)
除这几种数据之外,其余均会被转化为true;
String
JS中的String类型数据用”” 或 ”,二者的使用在JS中没有区别,只需保证其开闭统一即可。需注意,String类型的值虽是基本类型数据,但其值实际上属于引用类型,这是由于String类型的值没有固定的大小,只能使用引用类型进行储存。String对象具有很多强大的内置方法,在此就不一一介绍。
Symbol
Symbol类型是ES6中新引入的基本类型数据,其作用是生成一个独一无二的数据值。
var onlyOne = Symbol("it's me");
var onlyOne_ = Symbol("it's me");
此处,onlyOne的值与onlyOne_的值虽然相同,但他们是不相等的,因为他们是独一无二的数据。
复杂数据类型
Object
Object 类型的数据是有一系列属性与方法组成,它实质上一个键值对的组合体。在JS中,不存在自定义对象类型,他们实际上都属于Object类型数据。