ES6-数据类型

2021-10-11 JavaScriptES6

数据类型中的重头戏--Number、String、Symbol

# Number类型

Number类型使用IEEE 754 64位格式表示整数和浮点值,由于JavaScript保存数值的方式,实际中可能存在正零和负零,但它们在所有情况下都被认为是等同的。

  1. 浮点值
    • 如果小数点后没有小数位或为0,则会被转化为整数,因为存储浮点值使用的内存空间是存储整数值的两倍
    • 科学计数法如3.123e7 = 31250000,默认情况下,ECMAScript会将小数点后至少包含6个0的浮点值转换为科学计数法
    • 浮点值的精确度最高可达17位小数,但在算术计算中远不如整数精确,例如0.1+0.2得到的不是0.3,而是0.300 000 000 000 000 04,由于这种微小的舍入错误,导致很难测试特定的浮点值,所以永远不要测试某个特定的浮点值
    • 存在这种舍入错误,是因为使用了IEEE 754数值,这种错误并非ECMAScript所独有,其他使用相同格式的语言也有这个问题
  2. 值的范围
    • 最小值Number.MIN_VALUE,在多数浏览器中是5e-324
    • 最大值Number.MAX_VALUE,在多数浏览器中是1.797 693 134 862 315 7e+308
    • 如果超出JavaScript可以表示的范围,则会被自动转换成+(-)Infinity,如果计算返回+(-)Infinity,则该值不能进一步用于任何计算,要确定一个值有没有超出范围,可以使用isFinite()函数
  3. NaN
    • 用来表示本来要返回数值的操作失败了(而不是抛出错误),比如0、+0和-0相除会返回NaN
    • 任何涉及NaN的操作始终返回NaN
    • NaN不等于包括NaN在内的任何值,typeof NaN === 'number'
    • isNaN()函数判断参数是否可以转换为数值
    • :虽然不常见,但 isNaN()可以用于测试对象。此时,首先会调用对象的 valueOf() 方法,然后再确定返回的值是否可以转换为数值。如果不能,再调用 toString()方法, 并测试其返回值。这通常是 ECMAScript 内置函数和操作符的工作方式。
  4. 数值转换
    • 三个转换函数:Number()、parseInt()、parseFloat()。第一个可以用于任何数据类型;后两个主要用于将字符串转换为数值
    • Number()
      • 将null和""转换为0
      • undefined 和 不包括数值字符的字符串 转换为NaN
      • 如果字符串中的数值字符前有前缀0,转换时会忽略;如果符合十六进制的格式会转换成十六进制数
      • 转换对象时,调用 valueOf()方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用 toString()方法,再按照转换字符串的规则转换
    • parseInt()
      • 如果第一个字符不是数值字符、加减号,则返回NaN,也就是说前面必须为数值字符或加减号,后面有没有非数值字符都不影响
      • 如果是,则到字符串末尾或碰到非数值字符为止停止转换
      • 符合八进制或十六进制格式会相应转化,或者传入第二个参数指明要解析为几进制
    • parseFloat()
      • 与parseInt()类似,不同的是它始终忽略字符串的前缀0
      • parseFloat()只解析十进制值,因此不能指定底数
      • 如果字符串表示整数,则返回整数
      • parseFloat()能识别科学计数法

# String类型

  • 字符串表示0或多个以16位二进制为单位的Unicode字符序列,可以使用""、''、``标示
  • 转义序列表示一个字符,所以只算一个字符的长度,如果字符串中包含双字节字符,那么length属性返回的值可能不是准确的字符数
  • ECMAScript的字符串是不可变的,如果要修改变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量
  • 将值转换成字符串
    • toString():可用于数值、布尔值、对象和字符串值,null和undefined没有这个方法。可接收一个参数,用于指定转换为几进制的字符串
    • String():如果值有toString()方法,则调用该方法(不传参)并返回结果;如果是null,则返回"null";如果是undefined,则返回"undefined"
    • 加上一个空字符串
  • 模板字面量
    • 使用反引号(`)标示,会保持内部空格
    • 模板字面量不是字符串,而是一种特殊的句法表达式,但求值后得到的是字符串
    • 使用${ }表示字符串插值
    • 支持定义标签函数:function myTag(strings, args1, args2, ...,argsn) {} ,使用时myTag模板字符串前的myTag就是所谓的标签,strings:字符串数组,以${}为分隔符分割得到的数组;args1:模板字符串中第1个${}中的值;...;argsn:模板字符串中第n个${}中的值
  • 原始字符串:使用String.raw后跟模板字符串来获取原始内容,而不进行转义。但对于实际的换行符来说是不可行的,它们不会被转换成转义序列的形式

# Symbol类型

  • Symbol指符号,Symbol()接收一个可选参数用于描述,方便代码阅读和后期调试
  • 符号就是用来创建唯一记号,确保对象属性使用唯一标识符,不会发生属性冲突的危险
  • 符号需要使用Symbol()函数初始化
  • Symbol()函数不能与new关键字一起作为构造函数使用,因为Symbol是原始值
  • 凡是可以使用字符串或数值作为属性的地方,都可以使用符号
  • Symbol()定义的变量是不会相等的;Symbol.for("")创建共享Symbol(""里的内容要相同),如果已经存在,直接返回已有的Symbol
  • 用Object.getOwnPropertyNames()、Object.keys()或for-in无法显示Symbol属性,Object.getOwnPropertSymbols()方法返回包含所有Symbol属性的数组,Symbol.keyFor()返回已登记Symbol有关的键,Reflect.ownKeys()返回对象包括Symbol的所有属性
  • 了解Symbol是什么 (opens new window)

# Object类型

  • toString():返回对象的字符串表示,实例对象返回的是"[object object]";构造函数返回的是源代码
  • valueOf():返回对象对应的字符串、数值或布尔值表示,通常与toString()的返回值相同

今天学习的东西太琐碎了...只有应用是最好的记忆方式~推荐一个JavaScript练习网站 (opens new window)