引用类型转换
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。