-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 38 题:下面代码中 a 在什么情况下会打印 1? #57
Comments
let a = [1,2,3];
a.toString = a.shift;
if( a == 1 && a == 2 && a == 3 ) {
console.log(1);
} |
这题考察的应该是类型的隐式转换,考引用类型在比较运算符时候,隐式转换会调用本类型toString或valueOf方法.
|
这个题目考察==的隐式转换吧
|
let a = {
gn: (function* () {
yield 1;
yield 2;
yield 3;
})(),
valueOf() {
return this.gn.next().value;
}
}; |
要改下,不然报错。你这个挺好,可以做 === Object.defineProperty(window, 'a', {
get: function() {
if (this.value) {
return this.value += 1
} else {
return this.value = 1;
}
}
}); |
精简一下代码: Object.defineProperty(window, 'a', {
get: function() {
return this.value = this.value ? (this.value += 1) : 1;
}
}); |
一开始没转过来,群里老哥提了一声才想到这个方向 var a = Object.create({
count: 0,
valueOf: function() {
return ++this.count;
}
});
if (a == 1 && a == 2 && a == 3) {
console.log(1);
} |
第一反应想到的是a = console.log(1)😂😂 |
@XinJack 感觉你这个才是最优解啊,半天说不出一句话。 |
@XinJack console.log() 的返回值是 undefined |
数组这个 a.join = a.shift; 没看懂啊 |
把 shift 方法的引用 ,放到 a.join 上的。覆盖原来的 join 方法 |
为啥a==1之后会执行join(shift)函数? |
@seujzhang 执行 |
小白求教下,是不是这样的:在执行a==1的时候,会尝试对a进行隐式转换,此时隐式转换会调用Array的join方法,而此时join方法被shift覆盖,所以调用的实际上是shift方法,弹出1,然后相等,再弹出2相等,弹出3相等,最后console执行。 |
这个a.join = a.shift 是什么意思 还能这样子赋值麽。 |
为什么总有一些让人眼前一亮的答案😂 |
对象转原始类型 var a = {
i: 1,
valueOf() {
return a.i++;
},
toString() {
return a.i++;
},
[Symbol.toPrimitive]() {
return a.i++;
}
}
if ( a == 1 && a == 2 && a == 3 ) {
console.log(1);
} |
来一手另类的👋👋 Object.prototype.toString = (function () {
var t = 1;
return function () {
return t++;
}
})()
var a = {}
a == 1 && a == 2 && a == 3 // true |
|
蔡徐坤行为-_-!!! |
这操作属实有点优秀啊 |
var a = true; |
let i = 1; |
解释一下好吗? |
var a = {
i: 1,
toString () {
return this.i++
}
}
if (a == 1 && a == 2 && a == 3) {
console.log('真棒')
} |
为什么a==true不行? |
var a = ?;
if(a == 1 && a == 2 && a == 3){
console.log(1);
} |
看到答案瞬间懵逼... |
数组隐式转换成字符串之前会执行一次join操作-> a.valueOf().join().toString() |
现在都推===和typescript了,还在考这些垃圾特性... |
哈哈哈哈 |
var a = {
num: 1,
valueOf() {
return a.num++
}
}
console.log(a == 1 && a == 2 && a == 3, '1-------')
var b = {
num: 1,
toString() {
return b.num++
}
}
console.log(b == 1 && b == 2 && b == 3, '2-------')
var c = {
num: 1,
[Symbol.toPrimitive](h) {
return c.num++
}
}
console.log(c == 1 && c == 2 && c == 3, '3-------')
var d = new Proxy(
{},
{
i: 1,
get: function() {
return () => this.i++
}
}
)
console.log(d == 1 && d == 2 && d == 3, '4-------')
efun = {
i: 1,
get: function() {
return efun.i++
}
}
Object.defineProperty(global, 'e', efun)
console.log(e == 1 && e == 2 && e == 3, '5-------')
var f = [1, 2, 3]
f.join = f.shift
console.log(f == 1 && f == 2 && f == 3, '6-------')
var g = {
i: 123,
reg: /\d/g,
valueOf() {
return this.reg.exec(this.i)[0]
}
}
console.log(g == 1 && g == 2 && g == 3, '7-------') |
如何a是Array,a==1 会自动数据类型的转换,也就是调用a.join方法,而a.shift是deleteArray的第一元素并返回delete的元素,understand? |
来个骚的
|
|
但也达到了打印 1 的目的啊 |
对,你打印一下a就看到了,实际上是給a添加一个join属性,这个属性就是shift方法,所以a.join是一个方法,隐士转换的时候调用a |
let i = 0
Object.defineProperty('window', 'a', {
get:()=>{
return ++i
}
} |
第一次访问a的值
在 2020-07-22 17:19:26,zengkaiz <notifications@github.com> 写道:
leti=0Object.defineProperty('window','a',{get:()=>{return++i}}
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
var a = [1,2,3];
a.join = a.shift;
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
//
var a = {
i: 0,
toString: function(){
return this.i += 1;
}
};
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
//
var a = {
i: 0,
valueOf: function(){
return this.i += 1;
}
};
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
//
Object.defineProperty(window, 'a', {
get: function(){
return this.value = this.value ? (this.value +=1) : 1;
}
});
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
//
var value = 0;
Object.defineProperty(window, 'a', {
get: function(){
return this.value += 1;
}
});
if(a == 1 && a == 2 && a == 3){
console.log(1);
}; |
覆盖原型还是不太好 |
var a = a ? ++a : 1;
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
// 下面的也能输出
if(a === 1 && a === 2 && a === 3){
console.log(1);
} 这样不香嘛 |
let times = 0;
var a = {
[Symbol.toPrimitive]: function () {
return ++times;
}
};
if (a == 1 && a == 2 && a == 3) {
console.log(1);
} |
最先想到的是get, set, 这样好像就没有var a了, 感觉有点偏题, 不过估计知识点应该是valueOf, toString, 哈哈哈
|
var a = (function b(num){
b.valueOf=function(){return ++num}
return b
})(0) |
Boolean和其他类型比较,先被转换为Number,true被转换成 1 |
@ihoneys 啊?隐式类型转换还会调用 join 方法,我还以为就 toString 和 valueOf 呢,还有就是那个 拆箱时ToPrimitive,还会调用哪些方法? |
这个在那个环境运行的,我咋没打印出来1 啊 |
再精简一下: Object.defineProperty(window, 'a', {
get: function() {
return this.value = (this.value || 0) + 1;
}
}); |
这都没有进 if 语句啊😂 |
var a = {
value: 1,
toString() {
return this.value++
}
};
if(a == 1 && a == 2 && a == 3){
console.log(1); // 1
} var a = {
arr: [1,2,3],
toString: function() {
return this.arr.shift();
}
};
if(a == 1 && a == 2 && a == 3){
console.log(1); // 1
} var a = {
value: [1,2,3],
toString: function() {
return this.value.shift();
},
valueOf() {
return 0
}
};
console.log(a == 0) // true
if(a == 1 && a == 2 && a == 3){
console.log(1);
} var a = {
value: [1,2,3],
toString: function() {
return this.value.shift();
},
valueOf() {
return {}
}
};
if(a == 1 && a == 2 && a == 3){
console.log(1); // 1
} var a = {
value: [1,2,3],
toString: function() {
return {}
},
valueOf() {
return {}
}
};
// TypeError: Cannot convert object to primitive value
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
|
var a = 1
if(a == 1 && ++a == 2 && ++a == 3){
console.log(1);
} |
估计设计语言的时候,也没想到被这群屌人玩的这么花。 |
The text was updated successfully, but these errors were encountered: