JS数据类型

114 阅读3分钟

JS中的基本数据类型

基本数据类型

  • number
  • string
  • boolean
  • null
  • undefined
  • symbol
  • bigint

引用数据类型

  • object
    • 普通对象
    • 数组对象
    • 正则对象
    • 日期对象
    • Math数学函数对象
    • ...
  • function

数据类型检测

  • typeof 检测数据类型的逻辑运算符
  • instanceof 检测是否为某个类的实例
  • constructor 检测构造函数
  • Object.prototype.toString.call 检测数据类型的

typeof [value] 返回当前值的数据类型 "数据类型"

  • 返回的结果都是字符串
  • 局限性:
    • typeof null => "object"
    • typeof 不能细分对象类型(检测普通对象或者数组对象等都是"object")

Number 详解

NaN/isNaN/infinity/paresInt/Number

把其它数据类型转换为数字的方法

  • 强转换(基于底层机制转换的) Number([value])
    • 一些隐式转换都是基于Number完成的
      • isNaN('12px') 先把其它类型值转换为数字在检测
      • 数学运算 '12px'-13
      • 字符串==数字 两个等于号比较很多时候也是要把其它值转换为数字
      • ...
  • 弱转换(基于一些额外的方法转换) parseInt([value])/parseFloat([value])

ParseInt

处理的值是字符串,从字符串的左侧开始查找有效数字字符(遇到非有效数字字符则停止查找) -> 如果处理的值不是字符串,需要先转换为字符串然后在开始查找接口

Number

直接调用浏览器最底层的数据类型检测机制来完成 : 字符串中必须保证都是有效数字才会转换为数字,否则都是NaN
"" \ false \ null 0

undefined : NaN

== 转化的规律

在进行比较的时候,如果左右两边数据类型不一致,则需要先转换为一致的数据类型,然后在进行比较

  • 对象 == 字符串 对象转化为字符串
  • null = undefined但是和其他都不相等
  • NaN 和谁都不相等(包括自己)
  • 剩下的两边不同都是转化为数字

+

  • 在两边出现字符串(或对象)的情况下,一定是字符串拼接
    • 对象本身是要转化为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串才能转换为数字,而一旦转换为字符串,就转换为字符串拼接了

Boolean

只有 0 / NaN / null / undefined / "" => false ,其余的全是 true

{}

  • 大括号在运算符前面
    • 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
    • 出现在预算符的后面,认为是数学运算
0+{}
{}+0 
({}+0) 
({})+0

Object

在JS中对象的属性名是什么格式的?

  • 普通对象的属性名只能是"字符串"(普通对象的属性名可以是基本数据类型)
  • 但是普通对象的属性名不能是对象,如果是对象,需要转化为字符串储存
    • 普通对象toString 是调取Object.prototype.toString 是用来检测数据类型的

做题

!(!"Number(undefined)");
/*  true
        1. Number() 只要有非数字元素都是NaN
        2. 只有 0  null  undefind   ""  NaN 转化为false,其余全为 true
*/
isNaN(parseInt(new Date())) + Number([1]) + typeof undefined;
/* "2undefined"
    
        1. new Date() 开头非数字
        2. parseInt() 从左到右转化,如果开头非数字则为 NaN
        3. 

*/

Boolean(Number("")) + !isNaN(Number(null)) + Boolean("parseInt([])") + typeof !(null);
/*  "2boolean"
    1. parseInt/parseFloat 单纯转化数字,所以将  "" [] null {} 是 NaN
    2. Number 会将  "" [] null 转换为 0, undefined {} 转化为 NaN
    3. 只有 0  null  undefind   ""  NaN 转化为false,其余全为 true
    4.  + 两边如果没有字符串,都转化为Number(),直到出现字符串
    5. typeof 得到的是字符串格式

*/

parseFloat("1.6px") + parseInt("1.2px") + typeof parseInt(null);
// "2.6number"


isNaN(Number(!!Number(parseInt("0.8"))));
//false


!typeof parseFloat("0");
/* false
        只要不是空字符串,都是true
*/

typeof "parseInt(null)" + 12 + !!Number(NaN);
// "string12false"

!typeof (isNaN("")) + parseInt(NaN);
/*  NaN
        NaN + 任何做任何数字运算都是 NaN
*/

typeof !parseInt(null) + !isNaN(null);
/*  "booleantrue"
        isNaN() 调用的是 Number()检测方式
*/