JavaScript中的类型判断与类型转换

1,291 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

类型判断

  1. typeof:只能判断原始类型,并且判断null的时候会判断出null为'object';使用typeof判断 引用类型时:只能判断出function

  2. Object.prototype.toString(): 因为区别对象、数组、函数单纯使用 typeof 只能判断为object对象,但是可以通过Object.prototype.toString方法,判断某个对象值属于哪种内置类型。 例:[object String] 1).如果this值是undefined,就会返回 [object Undefined] 2).如果this值是null,就会返回 [object Null] 3).生成变量 o,让 o 成为ToObject(this)的结果 4).让class成为 o 的内部属性[[class]]的值 5).最后返回由"[object 和 class 和 "]" 三个部分组成的字符串

例: console.log(Object.prototype.toString.call(new Date())); //[object Date]

  1. 数组身上的判断方法:Array.isArray()

Array.isArray()方法用来判断某个方法是否是数组并且返回一个布尔值

  1. instanceof:只能判断引用类型,不能判断原始类型,它是顺着原型链找的 ;但是数组也是属于Object 也可以判断出它是Object;instanceof用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

类型转换

对象转原始类型

js的类型转换只有三种类型的转换: to string, to boolean, to number

转number

调用 ToPrimitive (obj,Number)

  1. 如果obj是基本类型,直接返回
  2. 否则,调用ValueOf方法,如果得到一个原始类型.则返回
  3. 否则,调用toString方法,如果得到一个原始类型.则返回
  4. 否则报错 []==![] Number({})//NaN

转string

调用ToPrimitive (obj,String)

  1. 如果obj是基本类型,直接返回
  2. 否则,调用toString方法,如果得到一个原始类型.则返回
  3. 否则,调用ValueOf方法,如果得到一个原始类型.则返回
  4. 否则报错

隐式转换

一元操作符 : +'1'=>Number(1)=1 '+'会触发Number()

当+运算作为一元操作符时,会调用ToString()处理该值

二元操作符

v1+v2

  1. lprim=ToPrimitive(v1)
  2. rprim=ToPrimitive(v2)
  3. 如果lprim或rprim是字符串,那么返回 ToString(lprim)和ToString(rprim)的拼接结果
  4. 否则返回ToNumber(lprim)和否则ToNumber(rprim)的相加结果

==

当执行 x == y 时,

  1. 如果x和y是同一类型,

    1. 如果x是undefined,返回true
    2. 如果x是null,返回true
    3. x是数字 x是NaN,返回false
    4. 如果x和y指向同一个对象,返回true,否则返回fasle
  2. 特例: null == undefined //true

  3. 1 == 'h' 会先ToNumber('h')再判断

  4. false == '1' 会先ToNumber('false') ToNumber('1')

  5. true == {a:1} // ToPrimitive({a:1})

[] == ![]

!运算符优先级更高 先执行![] !为布尔 ![]为false []==false 然后有==将这两个向Number靠近 []为引用类型,调用ToPrimitive() 然后先调用valueOf()没有 再调用toString()转换成'' ''再转换成0 false转换成0 所以[] == ![]