javascript的类型转换规则和判断数据类型

https://wangdoc.com/javascript/features/conversion.html

(一). 类型转换

[1].转字符串

String()

参数类型 结果
Undefined “undefined”
Null “null”
Boolean true,返回“true”;false 返回“false”
Number 普通数字被转换为数字字符串;NaN被转为“NaN”;10n被转为“10”
Symbol “Symbol()”
Object 如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。

[2]. 转布尔值

Boolean()

参数类型 结果
false、undefined、null、+0、-0、NaN、“” false
除了上面的情况 true

如果对一个值连续做两次取反运算,等于将其转为对应的布尔值,与Boolean函数的作用相同。这是一种常用的类型转换的写法。

!!x
// 等同于
Boolean(x)

[3]. 转数字

Number()

  • 纯数字的字符串(包括小数和负数、各进制的数),会被转为相应的数字

  • null转为0

  • Symbol会报错

  • 其它的基本类型,包括非纯数字的字符串、NaNundefined都会被转为NaN

    参数类型 结果
    Undefined NaN
    Null +0
    Boolean true,返回1;false,返回+0
    String 纯数字的字符串转为相应的数字;空字符串转为0;否则为NaN;0x开头的字符串被当成16进制
    Symbol 使用Number()转会报错
    Object Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组

一元数值运算符(+)同样使用加号,数值运算符的作用在于可以将任何值转为数值(与Number函数的作用相同)。

+true // 1
+[] // 0
+{
    
    } // NaN

[4]. ==

  1. 比较双方都为基本数据类型
  • 若是一方为null、undefined,则另一方必须为null或者undefined才为true,也就是null == undefined为true或者null == null为true,因为undefined派生于null。

  • 其中一方为String,是的话则把String转为Number再来比较。

  • 其中一方为Boolean,是的话则将Boolean转为Number再来比较。

  • 一方为String,一方为Boolean时,遵循有布尔先将布尔转换为数字

  1. 比较的一方有引用类型

    • 将引用类型遵循类似toPrimitive(obj, ‘number’)进行转换。(等同于:如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较。
    • 函数其实也是一个对象,所以在进行==比较时也和普通对象一样处理即可。
  2. 两方都为引用类型,则判断它们是不是指向同一个对象。

  3. 当我们使用!的时候,实际上会将!后面的值转换为布尔类型来进行比较。而且这种转换是不会经过ToPrimitive()的,而是直接转换为了布尔值,

  4. NaN !== NaN,只有用Object.is(NaN, NaN)才会被判断为true

[5]. +、-、*、/、%的类型转换

  1. -、*、/、%这四种都会把符号两边转成数字来进行运算

  2. +由于不仅是数字运算符,还是字符串的连接符,所以分为两种情况:

    • 两端都是数字则进行数字计算

    • 有一端是字符串,就会把另一端也转换为字符串进行连接

    • 对象的+号类型转换:

      • 对象在进行+号字符串连接的时候,toPrimitive的参数hintdefault,但是default的执行顺序和number一样都是先判断有没有valueOf,有的话执行valueOf,然后判断valueof后的返回值,若是是引用类型则继续执行toString。(类似题4.54.6)
      • 日期在进行+号字符串连接的时候,优先调用toString()方法。(类似题4.7)
      • 一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为 它不会对数值执行任何多余操作

    https://juejin.im/post/6844904105874472974

    https://juejin.im/post/6844904114099322893

[6]. toString()

  1. 作用: 把对象转换为字符串

  2. 谁可以调用toString()

    除了null、undefined以外的其它数据类型(基本数据类型+引用数据类型),它们构造函数的原型对象上都有toString()方法

    1.toString()相当于(1.)toString()会报错。因为将点归属给了1,1…toString()就不会报错返回“1”,数字要调用toString()需要借用变量或者将数字用括号括起来。

  3. 基本数据类型调用toString(),就是把原始值转换为字符串

    console.log(Symbol(1).toString()) // 'Symbol(1)'
    console.log(10n.toString()) // '10'
    
  4. 引用类型调用toString()

    • 数组的toString方法是将每一项转换为字符串然后再用","连接

    • 普通的对象(比如{name: 'obj'}这种)转为字符串都会变为"[object Object]"

    • 函数class正则会被转为源代码字符串

    • 日期会被转为本地时区的日期字符串

    • 原始值的包装对象调用toString会返回原始值的字符串

    console.log(['', ''].toString()) // ","
    console.log([' ', ' '].toString()) // " , "
    console.log(new Object(true).toString()) // "true" 原始值包装对象
    console.log(new Object(1).toString()) // "1"   原始值包装对象
    

https://juejin.im/post/6844904105874472974#heading-18

[7]. valueOf()

  1. 作用:把对象转换成一个基本数据的值

  2. 基本数据类型调用valueOf(),返回调用者原本的值。

    console.log(Symbol(1).valueOf()) // Symbol(1)
    console.log(10n.valueOf()) // 10n
    
  3. 引用类型调用valueOf()

    • 非日期对象的其他引用类型调用valueOf()默认返回它本身。

    • 日期对象返回一个1970年1月1日以来的毫秒数。

       console.log(['1'].valueOf()) // ['1']
       console.log(function () {
              
              }.valueOf()) // ƒ () {}
       console.log(new Date().valueOf()) // 1585370128307	
      

[8]. toPrimitive 运算符

ToPrimitive(input, PreferredType?)

​ 参数一:input,表示要处理的输入值

​ 参数二:期望转换的类型

在这里插入图片描述

  1. 例子

    String({
          
          }) //等同于 toPrimitive({}, 'string')
    

(二) 判断数据类型

  1. typeof

  2. constructor

  3. Object.prototype.toString.call()

    • Object.prototype.toString返回某个数据的内部属性[[class]],能够帮助我们准确的判断出某个数据类型

    • 它能够帮助我们准确的判断某个数据类型,也就是辨别出是数组还是数字还是函数,还是NaN

    function getclass(obj){
          
          
        let typeString = Object.prototype.toString.call(obj); // "[object Array]"
        return typeString.slice(8, -1);
    }
    console.log(getClass(new Date)) // Date
    console.log(getClass(new Map)) // Map
    console.log(getClass(new Set)) // Set
    console.log(getClass(new String)) // String
    console.log(getClass(new Number)) // Number
    console.log(getClass(true)) // Boolean
    console.log(getClass(NaN)) // Number
    console.log(getClass(null)) // Null
    console.log(getClass(undefined)) // Undefined
    console.log(getClass(Symbol(42))) // Symbol
    console.log(getClass({
          
          })) // Object
    console.log(getClass([])) // Array
    console.log(getClass(function () {
          
          })) // Function
    console.log(getClass(document)); //HTMLDocument
    console.log(getClass(document.getElementsByTagName('p'))) // HTMLCollection
    console.log(getClass(new RegExp())); //RegExp
    console.log(getClass(new Error())); //Error
    console.log(getClass(window)); //Window
    console.log(getClass(arguments)) // Arguments
    

猜你喜欢

转载自blog.csdn.net/kouzuhuai2956/article/details/112007295