资讯专栏INFORMATION COLUMN

js双等号探索(二): a==3&&a==4 为true ?

cheng10 / 2382人阅读

摘要:前言为是可以实现的。在中,非对象参数将被视为一个冻结的普通对象,因此会返回。注意所以一定要是对象,如果是非对象的其他基本类型如,,被视为冻结对象,不能重写,则不起效果。第四步为这时已经为,运行返回值也为。最后为如上所示为,为,则为其他链接

前言

a==3 && a==4True是可以实现的。
具体代码如下所示:

let a=[];
var x=3;
a.valueOf=()=>{
   return x++
};
a==3 && a==4 ? console.log("succeed") : console.log("failed");
//succeed

下面妹子我将一一解析其原理。

第一步 let a=[]

定义一个变量a,并赋值一个对象,方便后面重写它的valueOf方法。
可以通过Object.isFrozen()方法来判断一个对象的属性是否可以重写。

根据 MDN Web 文档-Object.isFrozen():https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen

在 ES5 中,如果参数不是一个对象类型,将抛出一个TypeError异常。在 ES2015 中,非对象参数将被视为一个冻结的普通对象,因此会返回true
Object.isFrozen("");
// true                         (ES2015 code)

Object.isFrozen({});
// false                        (ES2015 code)

注意:所以a一定要是对象,如果a是非对象的其他基本类型如String,,被视为冻结对象,不能重写valueOf,则不起效果。

let a=""; //非对象
var x=3;
a.valueOf=()=>{
   return x++
};
a==3 && a==4 ? console.log("succeed") : console.log("failed");
//failed
第二步 a==3 && a==4

根据 MDN Web 文档-运算符优先级:[https://developer.mozilla.org...
](https://developer.mozilla.org...

==的优先级为10 ,&&的优先级为6==的优先级更高,所以先运行a==3,再运行a==3,最后进行&&判断。

第三步 a==3为True

根据 MDN Web 文档-比较操作符:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

如果一个对象与数字或字符串相比较,JavaScript会尝试返回对象的默认值。操作符会尝试通过方法valueOf和toString将对象转换为其原始值(一个字符串或数字类型的值)。

所以将会运行a.valueOf()x1

let a=[];
var x=3;
a.valueOf=()=>{
   return x++
};
if(a==3){
  console.log(x); 
}
//4
第四步 a==4为True

这时x已经为4,运行a.valueOf返回值也为4

let a=[];
var x=3;
a.valueOf=()=>{
   return x++
};
if(a==3){
  console.log(x); 
}
//4
if(a==4){
  console.log(x); 
}
//5
最后a==3 && a==4 为true

如上所示a==3Truea==4True,则true && trueTrue

let a=[];
var x=3;
a.valueOf=()=>{
   return x++
};
a==3 && a==4 ? console.log("succeed") : console.log("failed");
//succeed
其他链接

https://raoenhui.github.io/js/2018/09/22/compare1/

https://raoenhui.github.io/js/2018/09/23/compare2/

https://raoenhui.github.io/js/2018/09/28/compare3/

Happy coding .. :)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97976.html

相关文章

  • 解析JavaScript判断两个值相等的方法

      本篇文章主要是讲述在JavaScript中判断两个值相等,不要认为很简单,要注意的是在JavaScript中存在4种不同的相等逻辑。  ECMAScript 是 JavaScript 的语言规范,在ECMAScript 规范中存在四种相等算法,如下图所示:  上图中每个依次写下来,很多前端应该熟悉严格相等和非严格相等,但对于同值零和同值却不熟悉,现在就依次下面四种方法。  同值  同值零  非...

    3403771864 评论0 收藏0
  • velocity的基本使用 && 实例讲解

    摘要:的简介是一个基于的模板引擎。使用,也可以写成。所以,应该使用规范的格式书写现在知道变量是而不是。如当页面中包含,如果对象有值,将显示的值,如果不存在对象同,则在页面中将显示字符。 velocity的简介 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象,...

    zhunjiee 评论0 收藏0
  • velocity的基本使用 && 实例讲解

    摘要:的简介是一个基于的模板引擎。使用,也可以写成。所以,应该使用规范的格式书写现在知道变量是而不是。如当页面中包含,如果对象有值,将显示的值,如果不存在对象同,则在页面中将显示字符。 velocity的简介 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象,...

    scq000 评论0 收藏0
  • 解析ES6变量赋值和基本数据类型

      let和const  let和const两者并不存在变量提升  这里要说明的是变量一定要在声明后使用,否则报错。  vara=[];   for(vari=0;i<10;i++){   a[i]=function(){   console.log(i);   };   }   a[6]();//10  变量i是var声明的,我们要知道这里在全局范围内都有效。我们要知道在每一次循环中,新的...

    3403771864 评论0 收藏0
  • js等号探索(三): [] == falseTrue,而!![] == falseFalse

    摘要:所以为为第二步转成根据文档比较操作符如果一个对象与数字或字符串相比较,会尝试返回对象的默认值。尝试将数字字面量转换为数字类型的值。 [] == false; //为True !![] == false; //为False 一、[] == false为True 第一步 转成[] == 0 根据 MDN Web 文档-比较操作符:https://developer.mozilla.org...

    DrizzleX 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<