双等运算符的比较逻辑
- 两端存在
NaN
返回false
undefined
和null
只有与自身比较、或者两者比较才会为true
,其余为false
- 两端类型相同就比较值
- 两端都是原始类型,转换为数值再比较
- 一端是原始数据类型,一端是对象类型,把对象类型转换为原始类型,再重新比较
对象类型如何转成原始类型?
- 如何对象拥有
[Symbol.toPrimitive]
方法,调用该方法获取原始类型,如果获取不到,就抛出异常 - 调用对象的
valueOf
方法获取原始类型,如果获取不到,则使用toString
方法,如果toString
还是获取不到,则抛出异常
什么是原始类型?
在 JavaScript 中,原始数据类型(也称为基本数据类型或简单数据类型)是指不可再分割的数据类型。这些类型的数据值是基本内存位置的值,而不是对象的引用。例如主要原始数据类型:
- Number - 包括整数和浮点数。JavaScript 中的所有数字都是浮点数,即使它们看起来像是整数。
- String - 由字符序列组成的文本。字符串可以使用单引号、双引号或者模板字符串(反引号)创建。
- Boolean - 只有两个值,
true
和false
。 - Undefined - 未定义的值,通常表示一个值还未被赋值。
- Null - 一个特殊的值,用来表示没有对象,即"无"的概念。
null
类型只包含一个值null
。 - Symbol - ES6 引入的一种新的原始类型,用于创建唯一的键名,主要用来作为对象的属性标识符。
此外,从 ES6 开始,还有一个特殊的原始类型:
- 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')
}