数据类型中的重头戏--Number、String、Symbol
# Number类型
Number类型使用IEEE 754 64位格式表示整数和浮点值,由于JavaScript保存数值的方式,实际中可能存在正零和负零,但它们在所有情况下都被认为是等同的。
- 浮点值
- 如果小数点后没有小数位或为0,则会被转化为整数,因为存储浮点值使用的内存空间是存储整数值的两倍
- 科学计数法如3.123e7 = 31250000,默认情况下,ECMAScript会将小数点后至少包含6个0的浮点值转换为科学计数法
- 浮点值的精确度最高可达17位小数,但在算术计算中远不如整数精确,例如0.1+0.2得到的不是0.3,而是0.300 000 000 000 000 04,由于这种微小的舍入错误,导致很难测试特定的浮点值,所以永远不要测试某个特定的浮点值
- 存在这种舍入错误,是因为使用了IEEE 754数值,这种错误并非ECMAScript所独有,其他使用相同格式的语言也有这个问题
- 值的范围
- 最小值Number.MIN_VALUE,在多数浏览器中是5e-324
- 最大值Number.MAX_VALUE,在多数浏览器中是1.797 693 134 862 315 7e+308
- 如果超出JavaScript可以表示的范围,则会被自动转换成+(-)Infinity,如果计算返回+(-)Infinity,则该值不能进一步用于任何计算,要确定一个值有没有超出范围,可以使用isFinite()函数
- NaN
- 用来表示本来要返回数值的操作失败了(而不是抛出错误),比如0、+0和-0相除会返回NaN
- 任何涉及NaN的操作始终返回NaN
- NaN不等于包括NaN在内的任何值,typeof NaN === 'number'
- isNaN()函数判断参数是否可以转换为数值
- 注:虽然不常见,但 isNaN()可以用于测试对象。此时,首先会调用对象的 valueOf() 方法,然后再确定返回的值是否可以转换为数值。如果不能,再调用 toString()方法, 并测试其返回值。这通常是 ECMAScript 内置函数和操作符的工作方式。
- 数值转换
- 三个转换函数: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)