数据类型
ECMAScript 有6种简单数据类型:Undefined、Null、Boolean、Number、String和Symbol。Symbol是ECMAScript 6新增的。还有一种复杂数据类型叫Object(对象)。Object是一种无序名值对的集合。
typeof 操作符
首先介绍一下typeof 操作符。因为ECMAScript 的类型系统是松散的,所以需要一种手段来确定任意变量的数据类型。typeof 操作符就是因此而生。对一个值使用typeof操作符会返回下列字符串之一。
"undefined" 表示值未定义
"boolean" 表示值为布尔值
"string" 表示值为字符串
"number" 表示值为数值
"object" 表示值为对象(而不是函数)或null
"function" 表示值为函数
"symbol" 表示值为符号
下面是typeof 的简单使用
let message = 'string'
console.log(typeof message) // string
console.log(typeof null) // object
console.log(typeof 22) // number
当然 null 的输出为 object 类型,所以 null 被认为是一个空对象的引用。
1. Undefined 类型
Undefined 类型只有一个值,就是特殊值 undefined。当使用 var 或 let 声明变量但是没有初始化时,就相当于给变量赋予了 undefined 值。
如下演示:变量在声明的时候未初始化。而在比较它和 undefined 的字面量值时,两者是相等的。
let msg
console.log(msg == undefined) // true
在这边有一个坑,就是没有声明的变量在通过typeof 返回的数据类型也是 undefined,通过如下代码可以看出。message是未声明的变量,msg 是声明了的变量,两者返回的都是 undefined。
let msg
console.log(typeof msg) // undefined
console.log(typeof message) // undefined
2. Null 类型
Null 类型同样只有一个值,即特殊值 null。逻辑上讲,null 值表示一个空指针,这也是给typeof 传一个 null 会返回 "object' 的原因。
在定义将来要保存对象值的变量时,建议使用 null 来初始化,不用使用其他值。这样,只要检查这个变量是不是 null 就知道这个变量是否在后来被赋予了一个对象的引用,如:
if ( user != null ) {
// user 是一个对象的引用
}
注:当用等于操作符(==)比较 null 和 undefined 始终返回 true。
let user = null
console.log(user == null) // true
console.log(user == undefined) // true
3. Boolean 类型
Boolean(布尔值)类型在ECMAScript 中使用最频繁的类型之一,有两个字面值:true 和 false 。这两个布尔值不等同于数值,因此 true 不等于1,false 不等于 0.
注意,布尔值是区分大小写的,因此 True 和 False (及其他大小写混合形势)是有效的标识符,但不是布尔值。
所有其他 ECMAScirpt 类型的值都可以转换为响应的布尔值等价形式。要将其他类型转换为布尔值,可以调用特定的 Boolean() 转换函数:
let message = 'hello world'
let messageBoolean = Boolean(message) // true
下表总结的不同类型与不同类型的转换
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | "" (空字符串) |
Number | 非零数值(包括无穷值) | 0、NaN |
Object | 任意对象 | null |
Undefined | N/A(不存在) | undefined |
理解如上转换是很重要的,因为像 if 等流程控制语句会自动执行其他类型值到布尔值的转换。
例如:
let message = "hello world"
if(message) {
console.log('this is true') // 这条语句将会输出
}
4. Number 类型
ECMAScript 中最有意思的或许就是 Number 了。Number 类型使用 IEEE 754格式表示整数和浮点数。不同数值类型相应地也有不同的数值字面量格式。
整数可以用十进制、八进制(以 0o 开头,数值在0~7之间)、十六进制(以0x开头,数值在0~9、A~F 之间,字母不区分大小写)
例:
let num1 = 20
let num2 = 0o77
let num3 = 0xAab
console.log(num1)
console.log(num2)
console.log(num3)
1. 浮点值
要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少要有一个数字。
例:
let num1 = 1.1
let num2 = 0.1
let num3 = .1 // 有效,但不推荐
因为浮点值内存空间是存储整数值的两倍,所以ECMAScript 总是想法设法将浮点值转换为整数。在小数点后面没有数字的情况下,数值就会变为整数。数值本身是整数,只不过小数点后面跟着的是 0 。
let floatNum1 = 1.0 // 小数点后面是零,可以当成整数1
let floatNum2 = 1. // 小数点后面没有数值,可以当成整数1
对于非常大或非常小的数值,浮点值可以用科学记数法来表示。数值跟着一个大写或小写的 e ,在加上一个要乘以 10 的多少次幂。
例如:
let num1 = 1.1e7 // 11000000
let num2 = 3.14e-5 // 0.0000314
这边写者标上一个注意的点。浮点值的精度最高可达17位,但在算术运算中远不如整数精确。如 0.1 加上 0.2 的值为 0.30000000000000004。
2. 值的范围
由于内存的限制,ECMAScript 并不支持这个世界上的所有数值。最大保存在 Number.MAX_VALUE,最小保存在 Number.MIN_VALUE 。
console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
console.log(Number.MIN_VALUE) // 5e-324
当超过最大和最小数值的表示范围时,数值会自动转换为 Infinity (正无穷大)或 -Infinity(负无穷大)。可以使用函数 isFinite() 判断数值是否在合法范围。
例如:以下运算会得到 Infinity 和 -Infinity
console.log(6/0) // Infinity
console.log(4/-0) // -Infinity
3. NaN
有一个特殊的数值叫NaN,意识是"不是数值”(Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出异常)。
例如:如下运算会得到NaN 的数值。
console.log(0/0) // NaN
console.log(+0/-0) // NaN
NaN有几个独特属性:
1.任何涉及 NaN 的操作始终返回 NaN(如:NaN / 2)
2.NaN 不等于包括 NaN 在内的任何值 ( 如:NaN == NaN 为 false )
我们可以使用一个内置函数 isNaN() 。任何不能转换为数值的值都会导致这个函数返回值为 true。
如下举例几个特殊值的 isNaN() 的返回值
console.log(isNaN(NaN)) // true,NaN 不能转换为数值
console.log(isNaN("10")) // false,字符串"10",可以转换为数值10
console.log(isNaN(true)) // false,布尔值 true 可以转换为数值 1
console.log(isNaN(false)) // false,布尔值 false 可以转换为 0
console.log(isNaN(undefined)) // true,undefined 不能转换为数值
console.log(isNaN(null)) // false,null 可以转换为数值 0
4.数值转换
这边介绍三种内置转换为数值的函数。Number() 、parseInt() 和 parseFloat().Number() 是转型函数,可用于任何数据类型。后两个函数主要是将字符串转换为数值。
比较Number() 和 parseInt() 之间的区别。parseInt() 函数更专注与字符串是否包含数值模式。字符串最前面的空格会被省略,从第一个非空格字符开始转换,转换其中的数值而忽略字符串后面的非数值数据。parseInt() 转换空串的结果为0,这一点是和 Number() 是不同的。
console.log(parseInt('123sa')) // 123
console.log(Number('123sa`')) // NaN
console.log(parseInt('')) // 0
console.log(Number('')) // NaN
同样,parseInt() 转换其他进制表示的数,需要传入第二个参数,表示该数字是几进制表示。
如下:
console.log(parseInt('af',16)) // 转换16进制数,结果是175
console.log(parseInt('12',8)) // 转换8进制数,结果是10
5. String 类型
String(字符串)数据类型表示零或多个 16 位Unicode 字符序列。字符串可以使用双引号(")、单引号(')或反引号(`)标示。
注:以某种引号开头作为字符串开头,必须仍然以该引号作为字符串结尾。
let msg = '这是字符串" // 这是错误的写法
1. toString() 和 String() 函数
toString() 方法可见于数值、布尔值、对象、和字符串值 。null 和 undefined 值没有 toString ()方法。多数情况下toString() 方法不接收参数,但是对数值调用该函数可以使用传入参数,可以通过参数得到数值的二进制、八进制、十六进制等。
如下示例代码:
let a = 255
console.log(a.toString()) // "255"
console.log(a.toString(2)) // "11111111"
console.log(a.toString(8)) // "377"
console.log(a.toString(10)) // "255"
console.log(a.toString(16)) // "ff"
String() 方法可以返回 null,undefiend字面量文本。
console.log(String(null)) // null
console.log(String(undefined)) // undefined
2. 模板字符串的使用
当我们需要拼接字符串和变量时,原始写法是非常头疼的一件事。在ES6之后,为我们提供了字符串插值的形式拼接字符串。首先使用反引号(`)包裹字符串,其中的变量使用 ${} 的形式书写。如下提供了简单的使用方法:
let index = 6
let msg = `这很${index}`
console.log(msg) // 这很6
当然我们可以在字符串插值中使用一些简单的运算。如:三元运算。
let index = 4
let msg = `这很${index > 6 ? index : '6'}`
console.log(msg) // 这很6
更多细节用法以后在做补充。
6. Symbol 类型
Symbol (符号)是ECMAScript 6 新增的数据类型。符号是原始值,且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。
1. 符号的基本用法
符号需要使用 Symbol() 函数初始化。因为符号本身是原始类型,所有 typeof操作返回symbol。
let sym = Symbol()
console.log(typeof sym) // symbol
调用Symbol() 函数时,可以传入一个字符串参数作为对符号的描述(description) ,将来可以通过这个字符串来调试代码。但是,这个字符串参数与符号定义或标识完全无关。
let syb1 = Symbol('syb')
let syb2 = Symbol('syb')
console.log(syb1 === syb2) // false
至于Symbol的具体使用以及内置函数以后作品会详解。
7. Object 类型
ECMAScirpt 中对象其实就是一组数据和功能的集合。对象通过 new 操作符后跟对象的名称来创建。
let o = new Object()
let obj = new Object // 合法但是不推荐
注:ECMAScript 中的 Object 也是派生其他对象的基类。Object 类型的所有属性和方法在派生的对象上同样存在(涉及之后的原型链的讲解)。
每个Object 实例都有如下属性和方法。
1. constructor: 用于创建当前对象的函数。
2. hasOwnProperty(propertyName) :用于判断当前对象实例(不是原型)上是否存在给定的属性。
3. isPrototypeof(object): 用于判断当前对象是否为另一个对象的原型。
4.propertyIsEnumerable(propertyName): 用于判断给定属性是否可以使用for-in 语句枚举。
5.toLocaleString() :返回对象字符串表示,该字符串反映对象所在本地化执行环境。
6.toString(): 返回对象的字符串表示。
7.valueOf():返回对象对应的字符串、数值或布尔值表示。通常与toString()的返回值相同。
创作不易,对你有用就点个赞吧!