a==1a==2a==3 与 a===1a===2a===3如何实现?

news/2024/11/7 12:37:54/

前言

首先,我们来看个demo

let a = {value: 1,toString() {// console.log("toString")return this.value++;}
}

看一下输出结果:

console.log(a === 1 && a === 2 && a === 3) // falseconsole.log(a == 1 && a == 2 && a == 3) // true

结论:通过Object的toString()可以实现 a1 && a2 && a3 而并不能实现 a=1 && a=2 && a=3

然后,加上万能的console

let a = {value: 1,toString() {console.log("toString")return this.value++;}
}
console.log(a === 1 && a === 2 && a === 3) // false
console.log("--------------------------------------")
console.log(a == 1 && a == 2 && a == 3) // true

输出结果:
在这里插入图片描述

也就是说使用 == 隐式转换使得Object调用了toString()

举例

使a == 1&&a == 2&&a == 3为true的方法

// 方法一:通过toString()实现
let i1 = {i: 1,toString() {return this.i++;}
}
console.log("toString() => ", i1 == 1 && i1 == 2 && i1 == 3) // true// 方法二:通过valueOf()实现
let i2 = {i: 1,valueOf() {return this.i++;}
}
console.log("valueOf() => ", i2 == 1 && i2 == 2 && i2 == 3) // true// 方法三:Object.defineProperty() 实现
let value = 1;
Object.defineProperty(window, "c", {get: function() {return value++;}
})
console.log("Object.defineProperty() => ", c == 1 && c == 2 && c == 3)// 方法四:通过Proxy实现
let d = new Proxy({}, {value: 1,get(target, key) {return () => this.value++;}
})
console.log("new Proxy() => ", d == 1 && d == 2 && d == 3)// 方法五:Symbol.toPrimitive实现
let e = {value: 1,[Symbol.toPrimitive]: () => {return e.value++;}
}
console.log("Symbol.toPrimitive => ", e == 1 && e == 2 && e == 3)// 方法六:数组的shift()方法
let f = [1, 2, 3]
f.join = f.shift;
console.log("shift() => ", f == 1 && f == 2 && f == 3)// 方法七:数组的pop()方法
let g = [3, 2, 1]
f.join = f.pop;
console.log("pop() => ", g == 1 && g == 2 && g == 3)

使a === 1&&a === 2&&a === 3为true的方法

 // 方法1:Object.defineProperty实现let value = 1;Object.defineProperty(window, "a", {get:function() {return value++;}});console.log(a === 1 && a === 2 && a === 3) // true// 方法2:Proxy实现let b = {number: 1};b = new Proxy(b, {get(target, key) {return target[key]++;}});console.log(b.number === 1 && b.number ===2 && b.number ===3) // true

http://www.ppmy.cn/news/654923.html

相关文章

程序员定制的中州韵(rime)windows版(小狼毫)微软双拼输入法

小狼毫所有的配置都是在用户文件夹下完成的 用户文件夹在win7的开始菜单的小狼毫文件夹中可以找到 所有设置希望生效须用小狼毫开始菜单中的重新部署来更新配置 -> weasel.custom.yaml : 小狼嚎的个人配置文件 patch: #注意:patch下的项必须空两个格,设置项冒号之后需要空一…

程序员必备 Windows 快捷操作大全

首先认识一下 Windows 键,一会能用到 与 Windows 键相关,一般我们叫做 Winkey 或 Win键 ,位置大概在计算机键盘左下角 Ctrl 和 Alt 键之间,上面有一个微软的窗口 LOGO,并且键盘上只有 一个。 Win 键单独按下&#xff0…

GitHub日收12000星,微软新命令行工具引爆程序员圈!

作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 继上次微软开源计算器刷爆GitHub后,今天凌晨在微软Build大会登场的Windows Terminal,如旋风般目前已登顶GitHub,截至发稿,收获超12000个Star&#xff0…

中国第一代程序员简介与现状

转载地址:https://www.cnbeta.com/articles/tech/151480.htm 2011年7月,仅仅47岁的“中国第一程序员”求伯君彻底退隐江湖。这代表着一个时代的过去,在求伯君风光的年代,程序员身上充满着个人英雄主义 的浪漫情怀。而随着时间的不…

程序员入门基础

程序员入门基础 关于程序员学习方法的思考 相信很多人都有自己的学习经历和方法,但是很少有人去思考如何去学习,接下来我来谈谈自己关于学习的一些看法。 首先我们要明白,学习的过程一定是从易到难的过程,从不知到认识&#xf…

深蓝词库转换2.2发布,支持手心输入法和Win10微软拼音

距离上一次大版本的发布已经很久很久了,中间是不是会收到一些用户的来信,提出新的需求,于是只是做小版本的更新,终于积累了一些更新后,打算做个大版本的发布了。 深蓝词库转换是一个输入法的词库互转和生成软件&#x…

程序员常用的笔记工具

1、visual studio git github/gitlab visual studio code官网:https://code.visualstudio.com/ visual studio code (简称 vscode)是一款集大成者,上天入地无所不能!比如我想让编辑器支持思维导图,只需安…

后端小白程序员的Vue学习笔记

文章目录 写在前面Vue一、什么是 Vue二、相关技术栈前端后端关于前后端分离 三、入门使用3.1、Hello,Vue3.2、Mustache 语法3.3、插值操作3.4、属性绑定 v-bind3.5、条件插值3.5.1、v-if、v-else、v-else-if3.5.2、v-show3.5.3、使用 key 来管理复用元素 3.6、列表渲染 v-for3.…