JavaScript有两种数据类型:简单数据类型(基本数据类型)和复杂数据类型(引用类型)。
简单数据类型:Nndefined,Null,Boolean,Number和String
复杂数据类型:object
简单数据类型
Nndefined
undefined类型只有一个值,即特殊的undefined。在使用var和let声明变量但未对其加以初始化时,这个变量的值就是undefined。
var msg; let num; console.log(msg) // undefined console.log(num) // undefined console.log(msg == num) // true var a = undefined let b = undefined console.log(a) // undefined console.log(b) // undefined
Boolean
Boolean类型是使用最多的一种类型,该类型只有两个字面值:true和false。这两个值与数字值不是一回事,因此true不一定等于1,而false也不一定等于0.(true和false是区分大小写的)
各数据类型对Boolean类型的转换:
var num1 = 100; var num2 = 0; var str1 = 'qwer'; var str2 = ''; var bool1 = false; var bool2 = true; var und = undefined; var nul = null; var arr1 = [1,2,3]; var arr2 = []; var obj1 = {}; var obj2 = {a: 1}; console.log(Boolean(num1)) // true console.log(Boolean(num2)) // false console.log(Boolean(str1)) // true console.log(Boolean(str2)) // false console.log(Boolean(bool1)) // false console.log(Boolean(bool2)) // true console.log(Boolean(und)) // false console.log(Boolean(nul)) // false console.log(Boolean(arr1)) // true console.log(Boolean(arr2)) // true console.log(Boolean(obj1)) // true console.log(Boolean(obj2)) // true
Null
Null类型只有一个值,即特殊值null。从逻辑角度来看,null值表示一个空对象指针,这也正是使用typeof操作符检测null值时会返回‘object’的原因。
如果定义一个空变量准备用来保存对象,那么最好将该变量初始化为null。
Number
Number类型有两种类型的数值:整数型和浮点类型
浮点数值
所谓的浮点类型,就是该数值必须包含一个小数点,并且小数点后面必须至少有一位数字。
var float1 = 1.01
var float2 = 0.1
var float3 = .3 // 有效,但不推荐
由于保存浮点数值需要的内存空间是保存整数值得两倍,因此ECMAScript会将浮点数值转换为整数值。如果小数点后没有跟任何数字,那么这个数值就可以作为整数来保存。如果浮点数值本身表示的就是一个整数,那么该值也会被转换成整数。
对于那些极大或极小值,可以使用科学计数法表示(e)。用e表示法表示的数值等于e前面的数值乘以10的指数次幂(e后面的数值)
var num = 3.2345e7 // 32345000
数值范围
由于内存限制,ECMAScript并不能保存世界上所有的数值,能保存的最小数值是5e-324,最大数值是1.7976931348623157e+308。如果超过最大值则会被自动转化为Infinity,小于最小值会被转化为-Infinity。他们将不再参与下一次的计算。
NaN
NaN,即非数值是一个特殊的数值,这个值用于表示一个本来要返回数值的操作数未返回数值的情况。涉及到NaN的操作都会返回NaN,其次,NaN与任何值都不相等,包括本身。
数值转换
有三个函数可以把非数值转换为数值1:Number()、parseInt()和parseFloat()。第一个函数可以用于任何数据类型的转换,另外两个函数专门用于把字符串转换成数值。
Number()的转换规则:
- 如果是Boolean值,true和false分别被转化为1和0
- 如果是数字值,只是单纯的传入和返回
- 如果是null,返回0
- 如果是nudefind,返回NaN
- 如果是字符串:只包含数字且前面没有0,将其转换为数值返回,有0将忽略前导的0,返回后面的数值;如果是十六进制的格式将转换为同大小的十进制数值;空字符串,则将其转化为0;如果包含除上述格式外的其他字符串,则将其转换为NaN
- 如果是对象,则调用对象的valueOf()方法,然后依赖前面的规则转换。如果转换的结果是NaN,则调用toString()方法,在依次按照前面的规则转换。
parseInt()在转换字符串的时候,更多是看其是否符合数值模式,他会忽略字符串前面的空格,知道找到第一个非空字符。如果第一个字符不是数字字符或负号,将返回NaN,如果第一个字符是数字字符,将继续解析下面的字符,直至解析完所有的字符或者遇到一个非数字字符。
var num1 = parseInt('12345hjk'); // 12345 var num2 = parseInt(''); // NaN var num3 = parseInt('0xA'); // 10 var num4 = parseInt(22.2); // 22 var num5 = parseInt('070'); // 70 var num6 = parseInt('70'); // 70 var num7 = parseInt('0xf'); // 15
String
String类型多由0个或多个16位的Unicode字符逐层的字符序列。字符串可以有单引号或双引号表示。
字符字面量
字面量 | 含义 |
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\' | 单引号 |
\" | 双引号 |
字符串特点:字符串是不可变得,字符串一旦创建,他们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后在把新的字符串赋值给这个变量。
如果要把其他类型的值转换成字符串,可以使用toString()方法。null和undefined类型的值不可以使用。但是可以使用String()方法
Object
在ECMAScript中对象就是一组数据和功能的集合。对象的创建方法有两种,第一种是通过new关键字后跟要创建的对象类型的名称来创建,第二种是直接给变量赋上一个空的对象或数组。
var o = new Object()
object的每一个实例都具有一下的方法和属性:
- Constructor:保存着用于创建当前对象的函数。o的构造函数就是Object()
- hasOwnProperty():用于检查给定的属性在当前的实例中是否存在。
- isPrototypeOf():用于检查传入的对象是否是另一个对象的原型
- propertyIsEnumerable():用于检查给定的属性是否能被for-in语句来枚举
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
- toString():返回对象的字符串表示
- valueOf():返回对象的字符串、数值或布尔值表示。
Symbol
Symbol类型是es6新添加的一种基本类型的数据,它表示的是独一无二的值。它通过symbol函数来生成,凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
数据类型的检测
要想检测一个变量是基本数据类型或者是复杂数据类型可以使用typeof进行检测。使用typeof检测数据类型时null、对象和数组都是返回的object
var a = null // object var b = 12 // number var c = '123' // string var d = true // boolean var e = undefined // undefined var f = new Object() // object var g = Symbol() // symbol var h = new Array() // object console.log(typeof a) console.log(typeof b) console.log(typeof c) console.log(typeof d) console.log(typeof e) console.log(typeof f) console.log(typeof g) console.log(typeof h) console.log(h instanceof Array) // true console.log(f instanceof Object) // true console.log(a instanceof Object) // false console.log(h instanceof Object) // true