双等运算符的比较逻辑

双等运算符的比较逻辑

  • 两端存在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')
 }
 ​
相关推荐
Linsk18 分钟前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
当时只道寻常23 分钟前
浏览器文本复制到剪贴板:企业级最佳实践
javascript
Alice-YUE1 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
是上好佳佳佳呀3 小时前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记
莎士比亚的文学花园3 小时前
Linux驱动开发(3)——设备树
开发语言·javascript·ecmascript
01漫游者4 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
threelab5 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
yqcoder7 小时前
JavaScript 柯里化:把“大餐”拆成“小炒”的艺术
开发语言·javascript·ecmascript
每天吃饭的羊7 小时前
JSZip的使用
开发语言·javascript
前端老石人7 小时前
前端开发中的 URL 完全指南
开发语言·前端·javascript·css·html