双等运算符的比较逻辑

双等运算符的比较逻辑

  • 两端存在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')
 }
 ​
相关推荐
iccb101320 分钟前
我是如何实现在线客服系统的极致稳定性与安全性的
前端·javascript·后端
宇宙全栈Link25 分钟前
当 React 组件调用自定义 hooks,hooks 又调用其他 hooks 时,状态变化如何传播?
前端·javascript·react.js
南方kenny26 分钟前
从0到1理解JS事件委托:让你的代码性能提升一个level
前端·javascript
西瓜树枝26 分钟前
用 iframe 实现前端批量下载的优雅方案 —— 从原理到实战
前端·javascript
归于尽27 分钟前
原生JS与React的事件差异
前端·javascript·react.js
独立开阀者_FwtCoder1 小时前
面试官:为什么在 Vue3 中 ref 变量要用 .value?
前端·javascript·vue.js
独立开阀者_FwtCoder1 小时前
手握两大前端框架,Vercel 再出手拿下 Nuxt.js,对前端有什么影响?
前端·javascript·vue.js
独立开阀者_FwtCoder1 小时前
弃用 html2canvas!快 93 倍的截图神器!
前端·javascript·vue.js
伍哥的传说1 小时前
H3初识——入门介绍之常用中间件
前端·javascript·react.js·中间件·前端框架·node.js·ecmascript
AA-代码批发V哥1 小时前
JavaScript之数组方法详解
javascript