掌握这几招,JavaScript 数据类型判定转换不再是难题

21 阅读5分钟

JavaScript数据类型判定与转换

mountain-7011121_1280.webp

在 JavaScript 编程中,数据类型的判定与转换是基础且关键的技能。准确识别数据类型并进行合理转换,能够帮助开发者避免因数据类型不匹配引发的错误,同时确保程序按照预期逻辑运行。

一、数据类型检查

  1. typeof操作符

    在**ECMAScript 官方规范中,typeof 被明确列为一元运算符**

    typeof是最基础、最常用的数据类型检查方法,它能快速判断基本数据类。例如:

    typeof 86 === 'number'; // true
    
    typeof "a" ==='string'; // true
    
    typeof true === 'boolean'; // true
    
    typeof undefined === 'undefined'; // true
    
    typeof null === 'object'; // 历史遗留问题,实际null是独立类型
    
    typeof Symbol() ==='symbol'; // true
    
    typeof function() {} === 'function'; // true
    
    • **但typeof在面对普通对象和数组时,都会返回'object',无法进行区分。**使用typeof来判定null与object时由于typeof是根据类型的二进制前三位来判断的,而null与object的前三位是相同的都是000,所以typeof null的结果位object 。

    • typeof在检查未声明的变量时,返回 "undefined" 而不是报错

    • typeof在判定除null之外的基本数据类型以及Function时是准确的(返回唯一

  2. Object.prototype.toString.call()方法

    Object.prototype.toString.call() 是 JavaScript 中最精确的类型检测方法,可以准确识别所有内置类型和自定义类型。

    默认返回 [object Type] 格式的字符串,其中 Type 是对象类型

    • toString() 方法的行为:默认返回 [object Type] 格式的字符串,其中 Type 是对象类型
    • call() 的作用:改变toString()this 指向,使其指向传进来的数据对象,让任意值都能调用这个方法。当对 JavaScript 的基本数据类型使用 Object.prototype.toString.call() 时,nullundefined,其他基本类型值都会发生隐式转换
    Object.prototype.toString.call(null) // [object Null]
    Object.prototype.toString.call(2) // [object Number]
    
    Object.prototype.toString.call(name) // name is not defined  
    
    Object.prototype.toString.call([]) // [object Array]
    Object.prototype.toString.call(new Date()) // [object Date]
    
  3. instanceof操作符

    instanceof 是 JavaScript 中用于检测对象是否属于特定类或构造函数的运算符

    不能用于检测基本数据类型,若左边是基本数据类型则直接返回false,若 Constructor 不是函数或没有 prototype 属性,则抛出 TypeError

    object instanceof constructor  // 对象   instanceof 构造方法
    

    检测机制:检查 右侧构造函数的 prototype 属性 是否出现在 左侧对象的原型链

    具体流程:

    右侧不参与原型链遍历,如下例子中Car 只是提供 Car.prototype 这个固定比对目标

    function Person(name) {
      this.name = name;
    }
    function Car(prise) {
      this.prise = prise;
    }
    const p1 = new Person("zs");
    console.log(p1 instanceof Person); // true
    console.log(p1 instanceof Object); // true
    
    console.log(Car instanceof Object); // true
    console.log(p1 instanceof Car); // false
    
    
  4. 专用检查方法

    对于数组,还可以使用Array.isArray()方法进行检查,返回布尔值表示是否为数组:

    Array.isArray([1]); // true
    
    Array.isArray({}); // false
    

二、数据类型转换

  1. 转换为数字类型

    • Number () 函数:可以将字符串、布尔值等转换为数字。

      Number('123') // 123
      Number('123a') // NaN
      Number(false) // 0
      
    • parseInt ()parseFloat () 函数parseInt()用于将字符串转换为整数,parseFloat()用于将字符串转换为浮点数。如parseInt('12.34')返回12parseFloat('12.34')返回12.34

      parseInt("123a"); // 123
      parseInt("123.45"); // 123
      
      parseFloat("123.45"); // 123.45
      console.log(parseFloat("123.45a")); // 123.45
      
    • 一元加号运算符+-也可用于将其他类型转换为数字,效果与Number()函数类似,如+ '123'返回123

      console.log(+123); // 123
      console.log(+'123') // 123
      console.log(-'123') // -123
      console.log(-'152s') // NaN
      
  2. 转换为字符串类型

    • String () 函数:将其他类型转换为字符串,例如String(42)返回"42"

    • toString () 方法:几乎所有数据类型都有toString()方法,如(42).toString()返回"42"true.toString()返回"true"

    • 模板字面量:通过模板字面量 ${} 也能实现类型转换,如const num = 123; Hello ${num}返回"Hello 123"`。

  3. 转换为布尔类型

    使用Boolean()函数将其他类型转换为布尔值,遵循特定的转换规则:0""nullundefinedNaN转换为false,其他值转换为true。例如:

    Boolean(0); // false
    
    Boolean(1); // true
    
    Boolean(''); // false
    
    Boolean('abc'); // true
    
  4. 复杂类型转换

    • 对象与字符串转换:对象转换为字符串可使用JSON.stringify(),字符串转换为对象使用JSON.parse(),如JSON.parse('{"name":"Bob"}')返回{name: 'Bob'}

      const person = {
          name: 'zs',
          age: 18,
          sex: '男'
      }
      const pToString = JSON.stringify(person)
      console.log(pToString) //{"name":"zs","age":18,"sex":"男"}
      
      const pToObject = JSON.parse(pToString)
      console.log(typeof pToObject)
      
    • 类数组转换为数组:通过Array.from()可以将类数组对象转换为真正的数组;[...similar] 用于可迭代对象(如arguments、NodeList等); Array.prototype.slice.call(similar)

      const similar = {
          0: '123',
          1: '456',
          2: '789',
          length: 3
      }
      
      const arr = Array.from(similar)
      console.log(arr) // ['123', '456', '789']
      
      const strArr = Array.from('12345')
      console.log(strArr) // ['1', '2', '3', '4', '5']
      
      
      // 只能用于可迭代对象(如arguments、NodeList等)
      // const arr1 = [...similar] 
      // console.log(arr1)
      
      const arr2 = Array.prototype.slice.call(similar)
      console.log(arr2) // ['123', '456', '789']
      
  5. 隐式转换

    隐式转换: JavaScript 在执行某些操作时,自动将数据类型进行转换的过程

    • 算术运算中的隐式转换

      当进行加法运算时,如果其中一个操作数是字符串,那么另一个操作数也会被转换为字符串进行拼接。

      let a = '1' + 2
      console.log(typeof a) // string
      console.log(a) // 12
      

      而在减法、乘法、除法等运算中,操作数会被隐式转换为数字类型,如"3" - 1返回2"2" * "3"返回6

      let a = '3' - '3'
      let b = '3' - 2
      console.log(a,b) // 0 1
      console.log(typeof a,typeof b) // number number
      
    • 比较运算中的隐式转换:在使用==进行比较时,会发生隐式转换。

      0 == false返回true,因为false会被转换为0

      console.log(0 == false) // true
      console.log(0 == '0') // true
      console.log(5 == '5') // true
      

      但需要注意的是,null == undefined返回true,且**nullundefined与其他值比较时不会进行类型转换** 。而使用===进行严格比较时,不会发生隐式转换,只有类型和值都相等时才返回true,如"5" === 5返回false

      console.log(null == undefined) // true
      console.log(null == '') // false
      console.log(5 === '5') // false
      
    • 条件语句中的隐式转换:在ifwhile等条件语句中,表达式的值会被隐式转换为布尔类型。

      例如if (1) { // 执行代码 },因为1会被转换为true,所以代码块会执行;而if (0) { // 不执行代码 },因为0会被转换为false,代码块不会执行 。