双等运算符的比较逻辑

双等运算符的比较逻辑

  • 两端存在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')
 }
 ​
相关推荐
专业程序开发源7 小时前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
acd120097 小时前
前端随笔:数据明明变了,Vue 页面就是不更新
前端·javascript·vue.js
传人8 小时前
悬停旋转放大和位移效果如何写
前端·javascript·css
羲云9 小时前
给 Vue 页面加个 Markdown 编辑器:ME.js 的接入、图片粘贴与音视频
javascript·vue.js
Highcharts.js9 小时前
可视化商用图表库对比,如何选择?
前端·javascript·学习·信息可视化·highcharts·前端可视化
TheITSea10 小时前
JavaScript Web APIs
开发语言·前端·javascript
开开心心就好10 小时前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
企业数字化笔记11 小时前
视频局部合成怎么做得自然?掩膜修复、边缘羽化、时序稳定与背景替换
java·javascript·音视频
liangshanbo121513 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
默_笙1 天前
🚦 请三个 AI 考官给 RAG 打分:量化评估实战(下)
前端·javascript