乐趣区

关于前端:引用类型隐式转换规则详解

援用类型转换

1、对象类型在隐式转换的时候,在 +==!=运算符等时,对象首先调用 valueOf 办法,如果返回非根本类型,对象将调用 toString 办法。
2、对象类型在隐式转换的时候,如果对象具备 Symbol.toPrimitive 属性时,==!=运算符时,对象将执行默认行为。+ 运算符时,执行 hintnumber行为。字符串模板时,执行 hintstring 行为。
3、对象类型在隐式转换的时候,在 ! 运算符时,对象取反时,返回false

例子

例一、默认

let arr = [];
let obj = {};

arr == ''; // true 
// 即 arr.toString()  ''==''

obj == '[object Object]'; // true 
// 即 obj.toString() '[object Object]' == '[object Object]'

例二、重写 valueOf 办法

let arr = [];
arr.valueOf = function () {retun 1;};

let obj = {};
obj.valueOf = function () {retun 1;};

arr == ''; // false  
// arr.valueOf()返回 1,即  1 == '',字符串与数值相等比拟时,将字符串转换成数值进行比拟,即 1 ==  0 

obj == '[object Object]'; // false
// obj.valueOf()返回 1,即 1 == '[object Object]',字符串与数值相等比拟时,将字符串转换成数值进行比拟,即 1 ==  NaN

例三、重写 toString 办法

let arr = [];
arr.toString = function () {retun "array qdk";};

let obj = {};
obj.toString = function () {retun "object qdk";};

arr == 'array qdk'; // true  
// arr.valueOf()返回非根本类型, 将调用 arr.toString(),即  'array qdk' == 'array qdk'

obj == 'object qdk'; // true
// obj.valueOf()返回非根本类型, 将调用 obj.toString(),即 'object qdk' == 'object qdk'

例四、Symbol.toPrimitive

const obj = {[Symbol.toPrimitive](hint) {if (hint === 'number') {retun 1;}
    if(hint === 'string'){retun 'object';}
    retun 'qdk'; 
  },
};
obj == 'qdk'; // true 
// 在相等运算符时,采纳默认行为。+obj == 1; // true 
// 在 + 加运算符时,采纳 hint 为 number 行为。`${obj}` == 'object'; // true
// 在字符串模板时,采纳 hint 为 string 行为。

大厂高频面试题

面试题一、

如何使 a == 1 && a == 2 && a == 3 成立,请 let a = ?

参考答案

const obj = {
  value: 0,
  [Symbol.toPrimitive](hint) {retun ++this.value;},
};

面试题二、

请写出输入后果 ([] + {})[+!![]]

参考答案

([] + {})[+!![]];
(''+'[object Object]')[+!![]];'[object Object]'[+!![]];'[object Object]'[+true];'[object Object]'[1];'o'

原文链接:https://www.qianduanka.com/web/blog/detail?id=11

微信号:qianduanka

退出移动版