JavaScript进阶3--类型和值

347 阅读3分钟

系列文章:

Javascript 类型

类型 和值

在 JavaScript 中,共有7种类型主要类型:

  • 基本类型:
    • string
    • number
    • boolean
    • undefined
    • symbol,ES6 中新增
    • null:typeof null === 'object',这是语言本身的一个bug
  • 非基本类型:object 对象,就是键/值对的集合。包括以下子类型:
    • array
    • function:typeof function === "function"
    • 内置对象

在js中,有以下几点需要注意⚠️:

  • 变量没有类型,有类型区分的是值,变量可以随时持有任何类型的值。
  • 变量未声明是 undeclared,变量已声明未赋值是undefined。但 JS 不区分 undeclared 和 undefined,typeof统一返回 undefined
  • 有两个办法可以判断 x 是否在全局命名空间中:
    • 通过 typrof(x) !== ‘undefined’
    • 通过 window.x

数字

JS 数字类型使用“双精度”格式,.运算符是一个有效的数字字符,会被优先识别为数字常量的一部分,然后才是对象属性访问运算符。

数字表示格式

数字常量除了用十进制表示,还可以通过0x, 0o, 0b做前缀的十六进制、八进制、二进制来表示。

数字的特殊值

Number 内有几个特殊值:

  • Number.ESPILON:浮点数最大的问题是会出现精度问题,比如0.1 + 0.2 === 0.3 (false),解决此问题最常见的是设置一个误差范围值Number.ESPILON
  • 最大浮点数是Number.MAX_VALUE,最小的浮点数是Number.MIN_VALUE,正数无限接近于0
  • 最大安全整数Number.MAX_SAFE_INTEGER,最小安全整数Number.MIN_SAFE_INTEGER,是负数。
  • a | 0可以将 a 中的数值转换成32位有符号整数
  • NaN:不是数字的数字,可以理解为“无效数值”、“失败数值”或“坏数值”,它和自身不相等。使用Number.isNaN()来确定是否是NaN
  • 正无穷数 Infinity,负无穷数 -Infinity,Infinity / Infinity = NaN
  • 加法和减法不会得到-0,乘除法可以,可以通过 isNegZero() 判读是否为 -0

原生函数

JS 中有一些原生函数:

  • String()
  • Boolean()
  • Number()
  • Symbol(): ES6 新加
  • Object()
  • Array()
  • Function()
  • RegExp()
  • Date()
  • Error()

通过这些原生函数 new 出的数据,是封装了基本类型值对象,可通过 valueof 得到基本类型值。

内部 [[Class]] 就是内部的分类,比如通过 Object.prototype.toString.call([1, 2])可以得到结果 "[object Array]",后面部分就是[[Class]]

这些原生函数,除了 RegExp()/Date()/Error() 都尽量不要使用,避免出现问题

类型转换

将值从一个类型转换成另外一个类型,发生在静态类型语言的编译阶段称为显式强制类型转换。发生在动态类型语言的运行时,称为隐式强制类型转换。

ToString 非字符串 => 字符串

  • toString():
    • 基本类型规则:null => 'null'; undefined => 'undefined'
    • 对象规则:
      • 数组:用,连接的字符串,如[1,2,3] => '1,2,3'
      • 函数:字符串,如function hh() {} => 'function hh() {}'
      • 普通对象:[object object],如{label: 'xx'} => [object object]
  • JSON.stringify()
    • 格式:
      • 普通值:null => 'null'; '42' => ''42''
      • 特殊值:若对象定义了 toJSON(),会先调用它再转成JSON值
        • undefined => undefined
        • function() {} => undefined
        • 在对象中遇到undefined、function、symbol会自动将其忽略,在数组中会返回 null
    • 可选参数:
      • replacer:数组或函数,用来指定对象序列化过程中哪些属性应该被处理
      • space:数字或字符串,指定输出的缩进格式

ToNumber 非数字 => 数字

  • Number:
    • 普通值:true => 1; false => 0; undefined => NaN; null => 0
    • 对象:首先转换成相应的基本类型值,基本类型值再转成数字,如果转不成功,就是 NaN

ToBoolean 非布尔值 => 布尔值

假值:undefined、null、0、-0、NaN、''、false => 0

  • Boolean()
  • !
  • if(...)
  • for(;;)
  • while(...)
  • do ... while(...)
  • ? :
  • || 和 && 左边的操作数

字符串和数字之间的转换

字符串 => 数字 数字 => 字符串
Number() String()
+ + ''
|0 toString()
parseInt()
- 0
/ 1
* 1