前端面试题-类型转换机制

50 阅读3分钟
  1. 如果是非日期类型的对象,先 obj.valueOf() 再调用 obj.toString()
  2. 如果是日期类型的对象,先调用 date.toString() 再调用 data.valueOf(),这是因为 Date 重写了 valueOf 方法,日期对象调用 valueOf 会返回时间戳的形式
  3. 数组和 function 重写了 toString 方法,注意和日期不通,没有重写 valueOf ,所以调用顺序还是 先 valueOf 再 toString

谈谈 Javascript 中的类型转换机制?

javascrip 中的类型转换可以分为显示类型转换和隐式类型转换。

(1)显示类型转换是指我们手动调用原生函数进行类型转换,常见的有 Number()、String()、Boolean()。

还有一个parseInt,相比于Number转换就没有那么严格了,parseInt函数逐个解析字符,遇到不能转换的字符就停下来

(2)隐式类型转换发生在算数运算符和比较运算符中。

【自动转成数值】在算数运算符加减乘除和取余的运算过程中,除了 加,都是将操作数使用 toNumber转成数值类型再进行运算。

【自动转成字符串】加操作有点特殊,在有两个操作数,并且其中一个操作数是字符串或者能够通过 toPrimitive 操作转成字符串的时候,就将两个操作数都转成字符串,然后执行字符串拼接操作。其他情况是转成数值然后进行加操作

【自动转成数值】对于比较运算符,如果两个操作数都是字符串,就更具字母表顺序进行比较,其他情况都是把来个操作数使用 toPrimitive 再执行 toNumber 转成数值再进行比较。

(2)在条件语句中,会有 toBoolean 的隐式类型转换,比如if while,除了7个为false的值其他的值都会转成true。

隐式类型转换是 js 自动的机制。其本质就是对操作数的原始值的比较。

(1)对于基本数据类型使用 typeof

(2)对于所有的数据类型使用 Object.prototype.toString.call 是最准确的

(3)对于数组可以使用 Array.isArray 判断

(4)对于NaN,可以使用isNaN 或者 Number.isNaN 判断,区别在于 isNaN 会进行类型 toNumber 类型转换,如果不能转换成数值的都会返回 true;Number.isNaN 更准确,会先判断是不是数字,如果不是数字类型那就直接返回 false,如果是数字再进行判断是否为NaN,不会进行类型转换,这个方法更准确。

null 和undefined 的区别

null 和undefined 都是基本数据类型之一。

null 代表空值,可以用它给一个变量赋值。

undefined 代表为定义,如果一个变量声明里,但是没有给他赋值,就会返回 undefined 。但是我们一般不会手动给一个变量赋值为undefined,undefined 不是 js 中的保留字,也就是允许我们定义一个名字叫 undefined 的变量,这是不安全的做法。

定义一个 let str = 'test' 为什么可以调用,str.length

因为 js 对字符串进行了自动的默认的包装,使用了new String 构造函数包装,使得字符串有String类的方法。