今天去面试遇到一个沙雕面试题。不会做,挂的很彻底
当a为多少的时候,可以输出1
a = ?
if( a == 1 && a == 2 && a == 3 ) {
console.log(1);
}
当时看到这题的时候,我草这么简单。不久输出个1吗,这么简单
a = console.log(1)
写完,就让我回来了。 回来之后才发现,考的是隐示类型转换。 心中1万头神兽飞过。咋就不能做个人呢。
....
经过一顿百度。总结如下
隐式类型转换 常规操作
1. toString
var a = {
i: 1,
toString() {
return a.i++;
}
}
if( a == 1 && a == 2 && a == 3 ) {
console.log(1);
}
2. valueOf
var a = {
i: 1,
valueOf() {
return a.i++;
}
}
if( a == 1 && a == 2 && a == 3 ) {
console.log(1);
}
3. [Symbol.toPrimitive]
var a = {
i: 1,
[Symbol.toPrimitive]() {
return a.i++;
}
}
if( a == 1 && a == 2 && a == 3 ) {
console.log(1);
}
隐式类型转换 骚操作
1. defineProperty
Object.defineProperty(window, 'a', {
get: function() {
if (this.value) {
return this.value += 1
} else {
return this.value = 1;
}
}
});
if(a == 1 && a == 2 && a == 3) {
console.log('1');
}
2. Generator
let a = {
gn: (function* () {
yield 1;
yield 2;
yield 3;
})(),
valueOf() {
return this.gn.next().value;
}
};
if(a == 1 && a == 2 && a == 3) {
console.log('1');
}
3. Proxy
var inita =1
var a = new Proxy(
{},
{
i: 1,
get: function() {
return () => inita ++
}
}
)
if(a == 1 && a == 2 && a == 3) {
console.log('1');
}
隐式类型转换 骚操作(骚到用别人家的方法了)
重写数组的jion
数组toString 会调用jion 生成字符串, 将jion方法重写
var a = [1,2,3];
a.join = a.shift;
if(a == 1 && a == 2 && a == 3) {
console.log('1');
}