双等运算符的比较逻辑

双等运算符的比较逻辑

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

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

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

什么是原始类型?

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

  1. Number - 包括整数和浮点数。JavaScript 中的所有数字都是浮点数,即使它们看起来像是整数。
  2. String - 由字符序列组成的文本。字符串可以使用单引号、双引号或者模板字符串(反引号)创建。
  3. Boolean - 只有两个值,true 和 false。
  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')
 }
 ​
相关推荐
星栈10 小时前
pnpm 12 升级实测
前端·javascript
Ai-_Man10 小时前
您您这可以把Microsofat Copilot的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑·copilot
Bruce_Liuxiaowei14 小时前
网页版 DeepSeek “harness desktop“ WebGL 上下文创建失败排查实录
开发语言·javascript·webgl
小凯在掘金14 小时前
为什么箭头函数不能作为构造函数?
前端·javascript
可乐鸡翅yeah_15 小时前
网页端 M3U8 播放器性能监控,怎么看播放卡顿指标
javascript·ffmpeg·音视频·safari·m3u8
可乐鸡翅yeah_15 小时前
M3U8 防盗链 URL‑Token 签名,新手开发实操避坑
开发语言·javascript·ios·音视频·safari
2603_9658966215 小时前
JS原型与原型链|对象继承与实例底层原理
开发语言·javascript·原型模式
JustHappy15 小时前
「vConsole MCP🛠️」我让 AI 直接看见任何 H5 的日志和请求帮你 debug
前端·javascript·程序员
xieter17 小时前
【技术精选】Node.js 核心事件循环机制与异步 I/O 深度剖析 (2026-10-02)
前端·javascript
想吃火锅100517 小时前
【leetcode】238.除了自身以外数组的乘积js
javascript·算法·leetcode