双等运算符的比较逻辑

双等运算符的比较逻辑

  • 两端存在NaN返回false
  • undefinednull只有与自身比较、或者两者比较才会为true,其余为false
  • 两端类型相同就比较值
  • 两端都是原始类型,转换为数值再比较
  • 一端是原始数据类型,一端是对象类型,把对象类型转换为原始类型,再重新比较

对象类型如何转成原始类型?

  • 如何对象拥有[Symbol.toPrimitive]方法,调用该方法获取原始类型,如果获取不到,就抛出异常
  • 调用对象的valueOf方法获取原始类型,如果获取不到,则使用toString方法,如果toString还是获取不到,则抛出异常

什么是原始类型?

在 JavaScript 中,原始数据类型(也称为基本数据类型或简单数据类型)是指不可再分割的数据类型。这些类型的数据值是基本内存位置的值,而不是对象的引用。例如主要原始数据类型:

  1. Number - 包括整数和浮点数。JavaScript 中的所有数字都是浮点数,即使它们看起来像是整数。
  2. String - 由字符序列组成的文本。字符串可以使用单引号、双引号或者模板字符串(反引号)创建。
  3. Boolean - 只有两个值,truefalse
  4. Undefined - 未定义的值,通常表示一个值还未被赋值。
  5. Null - 一个特殊的值,用来表示没有对象,即"无"的概念。null 类型只包含一个值 null
  6. Symbol - ES6 引入的一种新的原始类型,用于创建唯一的键名,主要用来作为对象的属性标识符。

此外,从 ES6 开始,还有一个特殊的原始类型:

  1. BigInt - 用于表示具有任意精度的整数。BigInt类型可以用来存储比 Number 类型所能表示的最大安全整数还要大的整数。

示例

如何使a==1 && a=2 && a=3等式成立

css 复制代码
 if (a==1 && a=2 && a=3){
     console.log('ok')
 }

解法1:使用Symbol.toPrimitive

  • 创建a为一个具有[Symbol.toPrimitive]方法的对象
  • 每次比较时,使n进行自增操作,并返回
javascript 复制代码
 // let n=1
 const  a = {
     n:1,
    [Symbol.toPrimitive](){
        // return n++ // 或者定义全局变量也可
        return this.n++
    }
 }
 if (a==1&&a==2&&a==3){
     console.log('ok')
 }
 ​

解法2:使用toString

  • 创建a为一个具有toString方法的对象
  • 每次比较时,使n进行自增操作,并返回
javascript 复制代码
 const  a = {
     n:1,
    toString(){
        // return n++ // 或者定义全局变量也可
        return this.n++
    }
 }
 if (a==1&&a==2&&a==3){
     console.log('ok')
 }

解法3:使用valueOf

  • 创建a为一个具有valueOf方法的对象
  • 每次比较时,使n进行自增操作,并返回
javascript 复制代码
 const  a = {
     n:1,
    valueOf(){
        // return n++ // 或者定义全局变量也可
        return this.n++
    }
 }
 if (a==1&&a==2&&a==3){
     console.log('ok')
 }

解法4:使用使用数组

  • 创建a为一个[1,2,3]的数组
  • 因为对象类型比较时,会使用toString或者valueOf进行尝试获取原始类型,所以将toString或者valueOf方法重写为shift的方法,每次比较取出一个值
css 复制代码
 const a = [1,2,3]
 a.toString = a.shift
 // a.valueOf = a.shift 也可以
 if (a==1&&a==2&&a==3){
     console.log('ok')
 }

**解法5:利用对象Object的defineProperty**属性

  • 通过利用对象的defineProperty进行数据劫持方式,将全局window作为一个劫持对象,然后对其属性a进行操作
  • 没有读取时,会调用get方法,如果没有值,则默认赋值为1,此后进行累加,并返回

注意:该方法使用window的话,需要在浏览器环境中使用

kotlin 复制代码
 Object.defineProperty(window, "a", {
     get: function() {
         this.value ? this.value++ : this.value = 1;
         return this.value;
     }
 })
 if (a==1&&a==2&&a==3){
     console.log('ok')
 }
 ​
相关推荐
xiaopengbc3 分钟前
火狐(Mozilla Firefox)浏览器离线安装包下载
前端·javascript·firefox
小高00724 分钟前
🔥🔥🔥前端性能优化实战手册:从网络到运行时,一套可复制落地的清单
前端·javascript·面试
古夕26 分钟前
my-first-ai-web_问题记录01:Next.js的App Router架构下的布局(Layout)使用
前端·javascript·react.js
Solon阿杰29 分钟前
solon-flow基于bpmnJs的流程设计器
javascript·bpmn-js
Solon阿杰30 分钟前
前端(react/vue)实现全景图片(360°)查看器
javascript·vue.js
郝学胜-神的一滴33 分钟前
Three.js 材质系统深度解析
javascript·3d·游戏引擎·webgl·材质
Hilaku43 分钟前
深入WeakMap和WeakSet:管理数据和防止内存泄漏
前端·javascript·性能优化
前端程序猿i1 小时前
用本地代理 + ZIP 打包 + Excel 命名,优雅批量下载跨域 PDF
前端·javascript·vue.js·html
Danny_FD1 小时前
Vue2 中使用vue-markdown实现编辑器
前端·javascript·vue.js
用户47949283569151 小时前
字节面试官:forEach 为什么不能被中断?
前端·javascript