js数据类型

97 阅读3分钟

数据类型

数据类型分为两类

  • 基本数据类型
    • number
    • string
    • boolean
    • null
    • undefined
    • symbol
    • bigInt
  • 对象(引用)数据类型
    • object
      • 普通对象
      • 数组对象
      • 正则对象
      • 日期对象
      • Math对象
      • ...
    • function

number

  1. NaN和谁都不相等(包括自己)

  • isNaN检测这个值是否为有效数字,不是的话就返回true,是的话就返回false
  • isNaN(1) =>false / isNaN("aaa") =>true
  1. infinity

  2. 其他数据类型转为数字的方法

  • 强转换 (基于底层机制转化的)Number()

    • 一些隐式转换都是基于Number
    • isNaN(‘12px’) 先把其他类型转换为数字在进行检测
    • 数学运算 ''12px' - 13
    • 字符串 === 数字
  • 弱转换 (基于一些额外的方法转换的) parseFloat/parseInt

  • Number 转换的一些规则

    • "" 、 null、 []、 false、都是0
    • true 是 1 、undefined是NaN 、 {}也是NaN
    • 字符串中都是有效数字才能进行转化
  • parseInt处理的是字符串,从左侧开始查找,遇到非有效数字则停止查找。(先转化为字符串)

    • 只传入一个值的话 parseFloat多识别一个小数点

    • parseInt可以接受两个参数,支持进制基础,从左到右开始查找 然后 看作radix 最后转化为10进制

      // parseInt(value, radix)radix支持 2-36 其他都为NaN 默认为0。0相当于是10进制
      parseInt('231', 3)
      2*3^0 = 2
      parseInt('234561px', 5)
      4*5^0 + 3*5^1 + 2*5^2 = 69
      
  1. 补充 :双等号比较

//  == 进行比较的时候,如果两边数据类型不一致, 需要先默认转化为一致的数据类型,然后在进行比较
// 规则 
// 对象 == 字符串 对象转化为字符串
// null == undefined => true
// 0 == null => false
// 0 == undefined => false
// NaN 和任何都不相等
// === 两边类型一致 而且值也相等


// [] 先转化为''(toString),在转化为数字(Number)
[] == false // true Number([])=0
// ![] 转化为布尔类型(!把其他类型转化为布尔类型, 只有 0/NaN/null/undefined/ 是false)
// !! 转为布尔类型
![] == false // true

{} 的加法总结

{} + null => 0
{} + [] => 0
{} + false => 0
{} + 1 => 1
{} + true => 1
{} + undefined => NaN
{} + '12px' => NaN
{} + '12' => 12
{} + {} => "[object Object][object Object]"

// 大括号在运算符前面
// 1 在没有使用小括号处理优先级的情况下 不认为是数学运算。加上小括号才算
// 2 出现在运算符的后面 认为是数学运算
{}+0 => 0
({}) + 0 => "[object Object]0"
({}+0) => "[object Object]0"
({} + "xxx") "[object Object]xxx"
{} + 10 + {} "[object Object]10[object Object]"
0+{} => [object Object]

+ 号的总结

在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接。对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串,才能转换为数字,而一旦转换为字符串,就变成字符串拼接了。+ 没有遇到字符串都要转化为数字, 对象要转化为字符串。

对象的属性

let str = 100 + true + 21.2 + null + undefined + 'Tencent' + [] + null + 9 + false;
// "NaNTencentnull9fale"

// 普通对象的属性名可以是 基本数据类型
let a = {}, b = Symbol("1"), c= Symbol("1");
a[b] = "bbb";
a[c] = "ccc";
console.log(a[b])

let a = {}, b = {n: 1}, c={name: 2};
a[b] = "bbb"; a["[object Object]"] = "bbb"
a[c] = "ccc"; a["[object Object]"] = "ccc"
console.log(a[b])

数据类型检测

  • typeof 检测数据类型的逻辑运算符
    • 返回的都是字符串(string) "数据类型"
    • typeof null => "object"
    • 不能细分对象类型
  • instanceof 检测是否为某个类的实例
  • constructor 检测构造函数
  • Object.prototype.toString.call 检测数据类型