JS 数据类型

数据类型

  • 基本数据类型(在栈中)
    • Boolean、String、Number、Null、Undefined、Symbol(ES6)、[BigInt](ES2020)
  • 引用数据类型(栈中地址、堆中数据)
    • Object
      • Function、Array等都属于特殊的对象
      • Function、Array、Date、RegExp、基本数据类型的包装、内置对象(Math、Global)

注:NAN属于Number类型,它仅仅标识当前值不是一个数据 ,但是是数值类型(NAN != NAN)

检测数据类型

  • typeof
    • console.log(typof 2) //number
    • typeof可以精准的判断(string、number、boolean、symbol、undefined原始类型,也可以判断function)
    • 判断引用类型就不行了,统一都是object
    • 另外,typeof null 是 object 
  • instanceof
    • let arr = ['a',1,2,15,'zhangsan']
      let obj = {name:'ZhangSan', age:25}
      let now = new Date();
      function fun() {}
      let str ='hello world'
      let num =123456
       
      console.log(arr instanceof Array );    //true
      console.log(obj instanceof Object );   //true
      console.log(now instanceof Date ); //true
      console.log(fun instanceof Function );      //true
      console.log(num instanceof Number);//无法判断基本数据类型,会返回false
      console.log(str instanceof String);//无法判断基本数据类型,会返回false
    • A instanceof B:A的原型链上有没有B.prototype
    • 用来判断引用类型具体是什么对象
    • 可以用来检测数据类型,但不准确,而且也不能检测基本数据类型,所以不是最佳选择
      • {} instanceof Object //true
  • constructor
    • console.log((123).constructor == Number) //true
    • 某个实例是不是这个构造函数构造出来的,实例和构造函数的关系null、undefined判断不出来
  • Object.prototype.toString.call()
    • console.log(Object.prototype.toString.call('')); // [object String]
    • 最全面最详细

类型转换

显示转换

Number()

有时候会很严格,有一个字符就无法转为数值就为NaN

  • Undefined: NaN
  • Null: 0
  • true: 1、false: 0
  • String: 字符串如果不能被解析成数值就直接NaN,''这个是0
  • Symbol: 抛出异常
  • Object:先toPrimitive,在调用toNumber(通常都是NaN,除了只包含单个数值的数组 )
    • Number([1]) //1
      Number([]) //0
      Number({}) // NaN

parseInt()

  • 一个一个解析,遇到不能解的就停下来
    • parseInt('231a') //231

Boolean

  • String:非空: true、空:false
  • Number: 非零数值:true、0或NaN : false
  • Object: null是false,其他都是true
  • Undefined: false

String()

  • Undefined: 'undefined'
  • Boolean: 'true', 'false'
  • Number: 对应的字符串类型
  • String: String
  • Null: 'null'
  • 对象: toPrimitive
    • String({a: 1}) // '[object, Obect]'
      String([1,2,3]) //'1,2,3'
  • Symbol: 抛出异常 TypeError

隐式转换

隐式转换:

  • 比较运算符(==、!= 、> 、 < )
  • if、while
  • 算术运算符(+、-、*、/、%)
  • 运算符两边的操作数不是同一类别的时候

转为布尔

  • 需要boolean值得地方自动转
    • 以下情况都是false, 其余为true
      • undefined
      • null
      • NaN
      • ''
      • false
      • 0
        • +0 -0

转为字符串

  • +运算符 字符串拼接
    • 如果其中一个是字符串,另一个也会被转换为字符串,否则两个运算数都被转换为数字。
      • 先将复合类型转为原始类型(ToPrimitive规则),再将原始类型转为字符串
    • 对象
      • '1'+{} == '1[object, object]'
        '1' + [] == '1'

转为数值

  • -、/、*
    • null 是0 、Undefined是NaN
    • 非数字会转换数字

总结数据转换

String、Number、Boolean

String

  • 显式转换
    • toString()
    • String()
  • 隐式转换
    • a + ''

Number

  • 显式转换
    • parseInt() 
    • parseFloat()
    • Number()
  • 隐式转换
    • a+0 a*1等(-*+)

Boolean

  • 显式转换Boolean()
    • console.log(Boolean(''));//false
      console.log(Boolean(0));//false
      console.log(Boolean(NaN));//false
      console.log(Boolean(null));//false
      console.log(Boolean(undefined));//false
      console.log(Boolean(1));//true
      console.log(Boolean('张三'));//true
  • 隐式转换
    • !!a
    • if、while
    • 运算符

'=='和‘===’

介绍

等于操作符

  • 两个等于号表示,操作数相等就是true
    • 会有隐式的类型转换
  • 规则
    • 两个都为简单类型的,都要转换为数值比较
    • 简单类型与引用类型,,引用类型要ToPrimitive规则转换为初始值
      • ToPrimitive规则
        • 将值转为基本类型
          • 对象=> 数字:.valueof() .toString()(这是这儿用到的)
          • 对象=> 字符串:.toString().valueOf()
    • 两个都为引用类型就判断他们是否指向同一指针
    • 存在NaN 返回false
    • Null == Undefined
      • null、undefined和任何值== 都为false

全等操作符

  • ===
  • 两个操作数不转换情况下相等,,才返回true
  • null跟undefined与自身严格相等

区别

  • 相等运算符会做类型转换,全等运算符不会做
  • Null、Undefined在全等运算符下是严格等于本身的,在相等运算符中,这俩相等

使用

  • null、undefined的位置上
    • 可以用== 代替 ===
  • 其余最好用===
    • == 会造成直觉错误​​​​​​​
      • ''!='0'
        0 == ''
        0 == '0'
        false!='false'
        false == '0'
        ' \t\r\n' == 0

参考链接

JS篇之数据类型那些事儿 (qq.com)

typeof、instanceof、constructor、toString四种检测数据类型的方法;优缺和区别分析_constructor检测数据类型检测不了object类型-CSDN博客

js检测数据类型得四种方式 - 爱喝酸奶的吃货 - 博客园 (cnblogs.com)

JS面试题(一)_面试 string.parsefloat-CSDN博客

【JS 进阶】你真的掌握变量和类型了吗 - 掘金

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值