JS的数据类型

92 阅读5分钟

文章内容摘抄于:01 代码基本功测试(上):JS 的数据类型你了解多少?_哔哩哔哩_bilibili 仅供个人学习

javascript类型有八种:Number,String,Boolean,Null,undefined,Symbol,BigInt,object。      
前七种为基础数据类型,object为引用数据类型
BigInt数据类型是为了让JavaScript程序能表示超出Number 类型支持的数值范围。BigInt可以表示任意大的整数

数据类型大致可以分为两类来进行存储      
1.基础类型存储在栈内存。被引用或者拷贝时,会创建一个完全相等的变量。    
2.引用类型存储在堆内存。存储的是地址,多个引用指向同一个地址。(涉及“共享”概念)

  let a = {  
      name:'gaga',  
    }  
    let b = a  
    console.log(a.name); // 输出:gaga  
    b.name = 'GAGA'  
    console.log(a.name); // 输出:GAGA  
    console.log(b.name); // 输出:GAGA  

这里就体现出了引用类型的共享特征,即这两个值都存在同一块内存中共享,一个发生了改变,另一个也随之改变。

    let a = {  
      name:'gaga',  
      age:20  
    }

    function change(obj){  
      obj.age = 24  
      obj = {  
        name:'GAGA',  
        age:30  
      }  
      return obj  
    }  
    let b = change(a)  
    console.log(a); // {name: 'gaga', age: 24}  
    console.log(b); // {name: 'GAGA', age: 30}  

这里function和return带来了不一样的东西。
原因:函数传参传进来的obj传递的是对象在堆中的内存地址。通过调用 obj.age = 24 改变了a对象的age属性,但是return obj 又把obj变成了另一个内存地址,将name:'GAGA', age:30 这个对象存入其中

数据类型检测

比如如何判断是否为数组

第一种:typeof

    typeof 1// number
    typeof'1' // string
    typeof undefined // undefined
    typeof true // boolean
    typeof Symbol() // 'symbol'
    typeof null // object
    typeof [] // object
    typeof {} // object
    typeof console // 'object'
    typeof console.log // function

其中须注意的是 typeof null 虽然他是object,但不表示他是引用类型,这是js的一个历史bug。因此,null在typeof返回的结果是有误的,不能作为判断null的方法。

第二种:instanceof

  let Car = function(){}
  let benz = new Car()
  benz instanceof Car // true
  let car = new String ('Mercedes Benz')
  car instanceof String // true
  let str ='Covid-19'
  str instanceof String // false

instanceof 运算符用于检查一个对象是否是指定构造函数(或其原型链上的任何构造函数)的实例。它通过检查对象的原型链来确定对象的类型。如果对象是指定构造函数的实例,那么 instanceof 返回 true,否则返回 false

两种方法的总结:
两种判断数据类型的差异:  
instanceof可以准确地判断复杂引用数据类型但是不能正确判断基础数据类型  
typeof也存在弊端,它虽然可以判断基础数据类型 (null 除外) 但是引用数据类型中,除了 function 类型以外,其他的也无法判断

第三种:Object.prototype.toString Object.prototype.toString.call()方法可以很好的判断引用类型

    Object.prototype.toString(f) //"[object Object]"
    Object.prototype.toString.call(0)//同上结果,加上call也ok
    Object.prototype.toString.call(1) // "[object Number]"
    Object.prototype.toString.call('1') // "[object String]"
    Object.prototype.toString.call(true) // "[object Boolean]"
    Object.prototype.toString.call(function(){}) // "[object Function]"
    Object.prototype.toString.call(null) //"[object Null]"
    Object.prototype.toString.call(undefined) //"[object Undefined]"
    Object.prototype.toString.call(/123/g) //"[object RegExp]"
    Object.prototype.toString.call(new Date())//"[object Date]"
    Object.prototype.toString.call([])//"[object Array]"
    Object.prototypetoString.call(document) //"[object HTMLDocument]"
    Object.prototype.toString.call(window) //"[object Window]"

需注意的是,使用这个方法最后返回的字符串格式为:[object Xxx] 这里面的Xxx第一个手写字母需要大写,使用typeof返回的是小写

数据类型转换

第一种:强制类型转换  
例如:Number()、parselnt()、parseFloat()、toString()、String()、Boolean()方法
Number()方法的强制转换规则:  
对于Boolean值:true和false分别被转换为1和0;数字返回自身;null返回0;undefined返回NaN;  
对于字符串:如果字符串只包含数字,则将其转换为十进制;如果字符串包含有效浮点格式,将其转换为浮点数值;如果是空字符串,将其转换为0;如果不是以上格式的字符串,均返回NaN。
Boolean()方法的强制转换规则:    
除了undefined、null、false、"、0(包括+0,-0)、NaN转换出来是false,其他都是true

第二种:隐式类型转换  
凡是通过逻辑运算符( && 、|| 、! )、运算符( + 、- 、* 、/ ,是)、关系操作符(>、<、>=、<=)、相等运算符(==)、if/while条件的操作。如果遇到两个数据类型不一样的情况,都会出现隐式转换。
'=='的隐式类型转换规则
如果类型相同,则无须进行类型转换;
如果其中一个操作值是 null 或者 undefined那么另一个操作符必须为 null 或者undefined才会返回 true,否则都返回 false

    null == undefined // true
    null == 0 // false
    ''==null // false
    ''==0 // true
    '123'==123 // true
    0== false // true
    1 == true // true
    
    var a = {
      value:0,
      valueOf:function(){
        this.value++
        return this.value
      }
    }
    console.log(a==1&&a==2&&a==3); // true  a == 1:JavaScript 尝试调用 a.valueOf(),返回 1,比较为 true。 同理 a==2,a==3 所以最终为true

'+'的隐式类型转换规则:
'+'号操作符,不仅可以用作数字相加,还可以用作字符串拼接  
如果其中有一个是字符串,另外一个是undefined、 null或布尔型,则调用toString()方法进行字符串拼接  
如果是纯对象、数组、正则等,则默认调用对象的转换方法会存在优先级,然后再进行拼接  
如果其中有一个是数字,另外一个是 undefined. null、布尔型或数字则会将其转换成数字进行加法运算,对象的情况还是参考上一条规则  
如果其中一个是字符串、一个是数字则按照字符串规则进行拼接

    '1'+undefined // '1undefined'
    '1'+ null // '1null'
    '1' + true // '1true'
    '1'+ 1n // 11  BigInt 是一种可以表示任意精度整数的数据类型,它通常使用后缀 "n" 来标识。

    1 +undefined // NaN
    1 +null // 1
    1 + true // 2
    1+1n // 错误 不能把BigInt和Number类型直接相加

    '1'+3 // '13' // 拼接