JavaScript中的数据类型以及相关细节详解

数据类型

        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 的值
Booleantruefalse
String非空字符串"" (空字符串)
Number非零数值(包括无穷值)0、NaN
Object任意对象

null

UndefinedN/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()的返回值相同。

创作不易,对你有用就点个赞吧!

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值