重学Javascript(3)

63 阅读7分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第13天

前言

本章节是数据类型的学习笔记

数据类型分类

简单数据类型:Undefined,Null,Boolean,Number,String,Symbol(ES6新增) 复杂数据类型:Object,Array,Function(Array,Function也属于Object,也可以看做是一种)

undefined

undefined类型只有一个值,就是undefined。当使用var或let声明变量没有赋值时,变量的值就是undefined。一般来说,不需要特意显式的给变量赋值undefined,这样做的目的主要是区分null和undefined。

对未初始化的变量调用typeof时,返回undefined(对未声明的变量调用typeof也是返回undefined)。

undefined是一个假值,下面这种方式也能检测,但是也会存在其他可能的假值,使用这种方法之前,也需要明确自己检测的就是undefined

let message;
if(message) {
    // 此时,这里不会执行
}
if(!message) {
    // 这里会被执行
}

null

null的值就是null。null在逻辑上表示一个空对象指针,所以使用typeof时会返回object。在定义对象且队对象没有初始值的情况下,建议使用null来初始化。

undefined值是由null派生而来,所以有null == undefined。

上述检测undefined假值的方式,null也可用。

boolean

值有true和false两种,True和False不是布尔值,boolean是区分大小写的。

调用Boolean()可以将其他类型的值转换为boolean的值,

number

number类型使用IEEE754格式表示整数和浮点数。最基本的数值字面量是十进制整数,也可以用八进制或十六进制

浮点数

包含小数点,且小数点后必须有至少一个数字,推荐小数点前面也加上数字。

浮点数的内存空间是整数的两倍。

小数点后没有数字或数字为0,这会被转化为整数。

浮点数的精度最高17位小数,但在计算中,不如整数精确

值的范围

由于内存的限制,可以标识的最小数值保存在Number.MIN_VALUE中,这个值在多数浏览器中是5e-324;可以表示的最大数值保存在Number.MAX_VALUE中,值在多数浏览器中是1.797693134862315 7e+308,超出这个范围,转为正负Infinity值,此时不能在进行计算。

NaN

特殊的数值,NaN。用于表示本来要返回数值的操作失败了。使用isNaN()来判断传参是否是数值,是数值则返回false,且如果传参是布尔值true,也会返回false,因为true可以转为数值1。

数值转换

有3个函数可以将非数值转换为数值:Number()、parseInt()和parseFloat()。Number()是转型函数,可用于任何数据类型。后两个函数主要用于将字符串转换为数值。对于同样的参数,这3个函数执行的操作也不同。

Number()函数基于如下规则执行转换。

  • 布尔值,true转换为1,false转换为0。
  • 数值,直接返回。
  • null,返回0。
  • undefined,返回NaN。
  • 字符串,应用以下规则。
    • 如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。因此,Number("1")返回1, Number("123")返回123, Number("011")返回11(忽略前面的零)。
    • 如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值(同样,忽略前面的零)。
    • 如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值。
    • 如果是空字符串(不包含字符),则返回0。
    • 如果字符串包含除上述情况之外的其他字符,则返回NaN。
  • 对象,调用valueOf()方法,并按照上述规则转换返回的值。如果转换结果是NaN,则调用toString()方法,再按照转换字符串的规则转换。

parseInt()函数更专注于字符串是否包含数值模式。字符串最前面的空格会被忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即返回NaN。parseInt()函数更专注于字符串是否包含数值模式。字符串最前面的空格会被忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即返回NaN

parseFloat()函数和parseInt()函数蕾西,从位置0开始检测每个字符,解析到字符串末尾或解析到一个无效的浮点数值位置,也就是说,只有第一个小数点有效。另外,该函数会始终忽略字符串开头的0。parseFloat函数值解析十进制值。如果字符串没有小数点或小数点后只有一个0,返回整数。

string

该数据类型表示0或多个16位Unicode字符序列,可以用单引号,双引号或反引号(模板字符串)表示。

字面量

字符串中存在一些其他用途的字面量,也就是我们常说的转义符:

  • \n:换行
  • \t:制表
  • \b:退格
  • \r:回车
  • \f:换页
  • \:反斜杠(\)
  • ':单引号('),在字符串以单引号标示时使用,例如'He said, 'hey.''
  • ":双引号("),在字符串以双引号标示时使用,例如"He said, "hey.""
  • `:反引号(`),在字符串以反引号标示时使用,例如`He said, \`hey.\`
  • \xnn:以十六进制编码nn表示的字符(其中n是十六进制数字0-F),例如\x41等于"A"
  • \unnnn:以十六进制编码nnnn表示的Unicode字符(其中n是十六进制数字0-F),例如\u03a3表示希腊字符"∑"

这些字符字面量可以出现在字符串中的任意位置,且可以作为单个字符被解释、转义序列只占用一个字符。

使用toString()方法来转换字符串。null和undefined值没有toString()方法。该方法默认可以不传参数,也可以接收一个参数,表示用什么底数来输出值的字符串表示,默认是十进制字符表示,传参可以得到二进制,八进制,十六进制或其他任何有效基数的字符串表示。

String()转型函数,始终会返回表示相应类型值的字符串,在不确定一个值是不是null或undefined的时候可以使用,其规则如下:

  • 如果值有toString方法,则调用该方法(不传参数)并返回结果
  • 如果值是null,则返回"null"
  • 如果值是undefined,则返回"undefined"

数值后面用加号操作符加上""也可以转换为字符串。

symbol

ES6新增数据类型。符号是原始值,且符号实例是唯一,不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。起作用是创建唯一记号,进而用作非字符串形式的对象属性。

基本用法

需要使用Symbol()初始化。typeof操作符对符号返回symbol。

let sym = Symbol()
console.log(typeof sym) // symbol

调用Symbol()函数时,也可以传入一个字符串参数作为对符号的描述(description),将来可以通过这个字符串来调试代码。但是,这个字符串参数与符号定义或标识完全无关

object

ECMAScript中的对象其实就是一组数据和功能的集合。对象通过new操作符后跟对象类型的名称来创建。

    let o = new Object();

属性和方法

  • constructor:用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性,要检查的属性名必须是字符串或符号
  • isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型
  • propertyIsEnumberable(propertyName):用于判断给定的属性是否可以使用for-in语句枚举,属性名必须是字符串
  • toLocaleString():返回对象的字符串表示,该字符串反应对象所在的本地化执行环境
  • toString():返回对象的字符串表示
  • valueOf():返回对象对应的字符串、数值或布尔值表示。通常与toString()的返回值相同

参考资料

JavaScript高级程序设计(第4版)