MST

星途 面试题库

面试题:JavaScript复杂类型显式转换技巧

已知有一个对象`var obj = { valueOf: function() { return '456'; } };`,当执行`Number(obj)`时会发生什么?请详细解释JavaScript内部的类型转换机制,以及如何通过自定义`valueOf`或`toString`方法来控制这种显式类型转换行为。
16.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 执行Number(obj)时发生的情况
    • 当执行Number(obj)时,JavaScript会尝试将对象obj转换为数字类型。它首先会调用对象的valueOf方法。
    • 因为obj定义了valueOf方法且返回'456',这是一个字符串。然后JavaScript会进一步将这个字符串'456'转换为数字,最终Number(obj)的结果为456(数字类型)。
  2. JavaScript内部的类型转换机制
    • 显式类型转换:像Number()String()Boolean()等函数进行的类型转换。
      • Number()转换
        • 如果是数字,直接返回该数字。
        • 如果是字符串,若字符串为纯数字字符,转换为对应的数字;若字符串为空,转换为0;若字符串包含非数字字符,转换为NaN
        • 如果是布尔值,true转换为1false转换为0
        • 如果是null,转换为0
        • 如果是undefined,转换为NaN
        • 如果是对象,先调用valueOf方法,如果返回原始值,则按照原始值的规则进行转换;如果valueOf返回的还是对象,则调用toString方法,如果toString返回原始值,则按照原始值规则转换,否则返回NaN
      • String()转换
        • 如果是字符串,直接返回该字符串。
        • 如果是数字,转换为对应的字符串形式。
        • 如果是布尔值,true转换为'true'false转换为'false'
        • 如果是null,转换为'null'
        • 如果是undefined,转换为'undefined'
        • 如果是对象,先调用toString方法,如果返回原始值,则按照原始值的规则进行转换;如果toString返回的还是对象,则调用valueOf方法,如果valueOf返回原始值,则按照原始值规则转换,否则返回'[object Object]'
      • Boolean()转换
        • 除了false0''nullundefinedNaN转换为false,其他值都转换为true
    • 隐式类型转换:在一些操作符(如+==等)使用过程中自动进行的类型转换。例如'1' + 2'1'会被隐式转换为数字1,然后执行加法操作,结果为3'1' == 1,两边的值会根据一定规则进行类型转换后再比较,这里'1'会转换为数字1,然后比较相等,结果为true
  3. 通过自定义valueOftoString方法来控制显式类型转换行为
    • 自定义valueOf
      • 如上述obj对象,通过自定义valueOf方法返回'456',从而影响了Number(obj)的转换结果。如果希望Number(obj)返回其他值,可以修改valueOf的返回值。例如:
var obj = {
  valueOf: function() {
    return 789;
  }
};
console.log(Number(obj));// 输出789
  • 自定义toString
    • valueOf返回对象或者未定义valueOf时,Number()会调用toString方法。例如:
var obj = {
  toString: function() {
    return '123';
  }
};
console.log(Number(obj));// 输出123
  • 可以同时定义valueOftoString方法,JavaScript会优先调用valueOf,如果valueOf返回对象,再调用toString。例如:
var obj = {
  valueOf: function() {
    return {a: 1};// 返回对象
  },
  toString: function() {
    return '987';
  }
};
console.log(Number(obj));// 输出987