You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
var aᅠ = 1;
var a = 2;
var ᅠa = 3;
console.log(aᅠ==1 && a== 2 &&ᅠa==3)
zwq357smile, kaiking01, huangsiyuan2015, wolfBi, shiran565 and 32 moremsdog, zhujunwei, wwyx778, xujintai123, jindameias and 6 morezhenghaiyang, hixfang and fanxiaowei11SoftwareEngineerPalace and xiaoyaoting
Activity
toyxz commentedon May 23, 2019
shenanheng commentedon May 23, 2019
{[Symbol.toPrimitive]: ((i) => () => ++i) (0)}
dashengzi66 commentedon May 23, 2019
var aᅠ = 1;
var a = 2;
var ᅠa = 3;
console.log(aᅠ==1 && a== 2 &&ᅠa==3)
jizx commentedon May 23, 2019
var a = { value : 0 };
a.valueOf = function() {
return this.value += 1;
};
console.log(a==1 && a==2 && a==3);
tpxiang commentedon May 23, 2019
const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
chang229 commentedon May 23, 2019
var value = 0;
Object.defineProperty(window,'a',{
get:function(){
return this.value += 1;
}
})
console.log(a== 1 && a==2 && a==3);//true
bytebit8 commentedon May 23, 2019
Web3TomCat commentedon May 23, 2019
let a = {
num:0,
valueOf:function(){
return this.num += 1
}
}
let aa = (a == 1 && a == 2 && a == 3)
console.log(aa)
taoyaoyaoa commentedon May 23, 2019
1.const a = {
i: 1,
toString: function () {
return a.i++;
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('Hello World!');
}
2.var aᅠ = 1;
var a = 2;
var ᅠa = 3;
if(aᅠ==1 && a== 2 &&ᅠa==3) {
console.log("Why hello there!")
}
3.var val = 0;
Object.defineProperty(window, 'a', {
get: function() {
return ++val;
}
});
if (a == 1 && a == 2 && a == 3) {
console.log('yay');
}
参考了http://web.jobbole.com/93874/
AILINGANGEL commentedon May 23, 2019
== 最大的特点在于允许进行类型转换,对于对象的转换会进行toPrimitive操作,也就是先调用valueOf方法如果不能返回基本类型的值就调用toString方法
tianyuandsb commentedon May 23, 2019
var a = {
i: 0,
valueOf: function() {
return this.i += 1;
}
}
if(a==1 && a==2 && a==3){
console.log('nice, 马飞~~~')
}
yelin1994 commentedon May 23, 2019
var a = [1, 2, 3]
a.join = a.shift
console.log(a==1 && a==2 && a==3)
利用数组转化为字符串都会调用,Array.join
或者
var a = {
value: 1,
toString: function () {
return this.value ++ }
wanglinyj commentedon May 23, 2019
let a = {
value: 0,
valueOf: function() {
return this.value += 1;
}
}
console.log(aᅠ==1 && a== 2 &&ᅠa==3)
JS对象有toString() 和valueOf()两个方法,toString()将该对象的原始值以字符串的形式返回,valueOf()返回最适合该对象的原始值,这两个方法一般是交由JS去隐式调用,以满足不同的运算情况。
在数值运算里,会优先调用valueOf(),在字符串运算里,会优先调用toString()。
1.用运算符对对象进行转换的时候valueOf()的优先级高于toString()
2.对对象进行强字符串转换时会优先调用toString()
3.toString()方法不能对null和undefined进行字符串转换,可以用String()方法代替
darlingyz commentedon May 23, 2019
不太会,所以百度了下,
有几种方法实现
1、重写Object的toString或者valueOf
2、定义"a"属性,并重写它的getter方法
3、字符编码
4、数组toString隐含调用join()方法
参考了 https://majing.io/posts/10000006051204
https://www.codercto.com/a/41494.html
--感谢作者,感谢小姐姐
lqzo commentedon May 23, 2019
== 运算符会进行隐式转换。
==操作符会尝试通过方法valueOf和toString将对象转换为其原始值(一个字符串或数字类型的值)。
对于数组对象,toString 方法返回一个字符串,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成。
Symbol对象被转为原始类型的值时,会调用 toPrimitive 方法,返回该对象对应的原始类型值。
emmm... with关键字好像很少用到
参考:
33 remaining items
MissWXiang commentedon May 24, 2019
!(a == 1 && a == 2 && a == 3) 取反
(微信名:RUN)
Timoeser commentedon May 24, 2019
let a = {
value: 0,
valueOf: function() {
return this.value += 1;
}
}
YvetteLau commentedon May 24, 2019
O(∩_∩)O哈哈
一起每天进步一点点YvetteLau commentedon May 24, 2019
偷懒啦~~~被我发现了~
DazhiFe commentedon May 24, 2019
首先要解答这道题,要先搞懂
==
的工作机制。==
运算符的工作机制对于
==
来说,如果对比双方类型不一样的话,就会先进行类型转换。假设我们需要对比
x
和y
是否相同,就会进行如下判断流程:1.首先会判断两者类型是否相同,相同的话就比较大小了
2.类型不相同的话,那么就进行类型转换
3.判断两者类型是否为
string
和number
,是的话就将字符串转换为number
4.判断其中一方是否为
boolean
,是的话就会把boolean
转换为number
再进行判断5.判断其中一方是否为
object
,另一方为string
、number
、或symbol
,是的话就会把object
转换为原始类型再进行判断6.会先判断是否在对比
null
和undefined
,是的话就返回true
7.要比较相等性之前,不能将
null
和undefined
转换成其他任何值8.如果有其中一方是
NaN
,则相等操作符返回false
,而不相等操作符返回true
。重要提示:即使两个操作数都是
NaN
,相等操作符也返回false
了;因为按照规则,NaN
不等于NaN
弄懂了
==
的工作机制,我们再回到题目:(a == 1 && a == 2 && a == 3) == true
根据题目,我们可以推断
a
不可能是一个基本数据类型,因为a
如果是null
、undefined
或者boolean
,这个等式根本不会成立。所以a
肯定是一个复杂数据类型:object
,有可能是一个对象{}
或者是数组[]
。当一个对象
object
和数值做==
比较的时候,会先把object
转换为原始类型再进行比较。所以,我们还需明白
object
到原始类型转换的一个过程:[Symbol.toPrimitive]
接口,那么调用此接口,若返回的不是基本数据类型,抛出错误。[Symbol.toPrimitive]
接口,那么调用valueOf
接口,若返回的不是基本数据类型,那么调用toString
接口,若返回的还不是基本数据类型,那么抛出异常。上面代码说明,它们之间的一个的优先调用顺序是:
[Symbol.toPrimitive]
>valueOf
>toString
。当
a
是一个{}
时如果没有部署
[Symbol.toPrimitive]
接口,则会调用valueOf
接口,所以下面的代码也是可以的:当
a
是一个[]
数组时不得不说,此方法真的是很巧妙。
数组也是一个对象,所以也遵循对象到原始类型的转化过程,然后又利用数组的
Array.prototype.toString()
内部调用的是Array.prototype.join()
,所以把join
重写为shift
,这样当比较a == 1
时,相当于执行了由于
shift()
方法会改变原数组,并删除数组的第一个元素,然后把该元素返回回去。所以第一次比较删除的就是1
,并把1
返回回去,a == 1
就为true
了,然后原数组a
就变成了[2,3]
,以此类推。根据这个原理,下面的代码也是等价的:
利用数据劫持
数据劫持
还是第一次听到,过后需要好好补下这块相关的知识。重写
a
属性的getter
方法使用
Object.defineProperty
定义的属性,在获取属性时,会调用get
方法。利用这个特性,我们在window
对象上定义a
属性,如下:Proxy形式实现
这个也是盲点,过后也需要好好学习下。
利用ES6新增的
Proxy
来实现:最后
感谢各位小伙伴,学到很多知识点。希望大家能一直坚持下去,向前端专家进阶,加油!
KRISACHAN commentedon May 24, 2019
此题目的答案可以分为三大类:
1. 类型转换时的劫持
首先我们要知道,在 JS 中类型转换只有三种情况,分别是:
转换为原始类型
对象在转换类型的时候,会执行原生方法ToPrimitive。
其算法如下:
toSting
方法,如果此时是 原始类型 则直接返回,否则再调用valueOf
方法并返回结果;valueOf
方法,如果此时是 原始类型 则直接返回,否则再调用toString
方法并返回结果;当然,我们可以通过重写
Symbol.toPrimitive
来制定转换规则,此方法在转原始类型时调用优先级最高。所以以此定义我们可以有以下四种答案:
鱼头注:事实上,这四种可以算是同一种。关于最后一种,我们可以来看看ECMA中的
Array.prototype.toString ( )
定义:array
为ToObject(this value)
(原生方法,将当前数组转换成对象);func
为Get(array, 'join')
(原生方法,在这一步调用join
方法);IsCallble(func)
(原生方法,判断是否有内部可调用的函数)为false
,则 设置func
原生函数%ObjProto_toString%
(原生函数,toString
的具体实现);Call(func, array)
。2. 对
getter
的劫持所谓的
getter
就是对象属性在进行查询时会被调用的方法get
,利用此函数也可以实现题目功能。代码如下:
3. 正则表达式
JS
中的RegExp.prototype.exec()
作用是在一个指定字符串中执行一个搜索匹配,返回一个结果数组或 null。当正则表达式使用 "
g
" 标志时,可以多次执行exec
方法来查找同一个字符串中的成功匹配。当你这样做时,查找将从正则表达式的lastIndex
属性指定的位置开始。(test()
也会更新lastIndex
属性)。lastIndex
是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。只有正则表达式使用了表示全局检索的 "g
" 标志时,该属性才会起作用。鱼头注:只有正则表达式使用了表示全局检索的 "
g
" 标志时,该属性才会起作用。综上所述,我们可以有方案如下:
鱼头注:上述方法其实也利用了类型转换的特点。
ivan0525 commentedon May 24, 2019
ivan0525 commentedon May 24, 2019
qinmeishuying commentedon May 24, 2019
const a = { value: 0 }
a.valueOf = function () {
return this.value += 1
}
console.log(a==1 && a==2 && a==3)
== 在js 中 会发生类型转换 ===全等择不会发生强转
== 会把左右两边的值 转化为相同的原始数据类型然后在去比较他们是否相当
如果输入的是个基本类型就直接返回这个类型值
如果输入是Object类型 那就先调用输入对象的valueOf()如果是基本类型的话就直接返回 如果不是在调用toSting() 是基本类型 就返回他
js 在解析a==1 时 1 是基本数据类型 所以会把a 转换为Nubmer
a.valueof 覆盖的原来的valueof 被调用时 会返回1 自增+1返回自身
=== 全等下不会执行 valueof 此时就可以 用到Object.defineProperty 因为get 和 set是可以通过"."操作符调用的方法
var v = 1;
Object.defineProperty(window,'a',{
get(){
return v++;
}
})
a == 1 && a == 2 && a==3
ZhangWeiC commentedon May 24, 2019
var aᅠ = 1;
var a = 2;
var ᅠa = 3;
console.log(aᅠ==1 && a== 2 &&ᅠa==3)
954545647 commentedon May 26, 2019
let a = {
[Symbol.toPrimitive]: (function() {
let i = 1;
return function() {
return i++;
}
})()
}
EcSunshine commentedon Jun 9, 2019
let a = {
valueOf : (fnction(){
let i = 1;
return function(){
return i++
}
})()
}
riluocanyang commentedon Jun 13, 2019
如何让a === 1 && a === 2 && a === 3的值为true
toString
valueOf
[Symbol.toPrimitive]
Object.defineProperty
修改数组join方法
index-swf commentedon Jan 11, 2021
这个答案用了不可见字符 \uffa0 作为变量名,过于取巧了