共计 1516 个字符,预计需要花费 4 分钟才能阅读完成。
援用类型转换
1、对象类型在隐式转换的时候,在 +
、==
、!=
运算符等时,对象首先调用 valueOf
办法,如果返回非根本类型,对象将调用 toString
办法。
2、对象类型在隐式转换的时候,如果对象具备 Symbol.toPrimitive 属性时,==
、!=
运算符时,对象将执行默认行为。+ 运算符时,执行 hint
为 number
行为。字符串模板时,执行 hint
为 string
行为。
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
正文完