美文网首页
怎么让x !== x 为true?, x === x + 1怎么

怎么让x !== x 为true?, x === x + 1怎么

作者: 踏莎行 | 来源:发表于2022-05-18 17:47 被阅读0次

今天翻公众号的时候发现了一个有意思的文章:x !== x 可以为 true
自己想了一下,确实不知道,难道还有什么不等于他自己吗?
原来我一直忽略了一个"数": NaN
他不等于任何值甚至不等于他自己

NaN === NaN  // false
NaN == NaN // false
NaN !== NaN // true

好家伙,x = NaN
那除了NaN还有啥办法吗?
还可以通过Object.defineProperty,每次读取这个值的时候给他赋值一个新的值

// window上定义一个新的值a,让他成为window的属性
var a = 0
Object.defineProperty(window, 'a', {
  get () {
    // 每次获取a的时候就给他赋值一个随机数
    return (Math.random() * Math.random())
  }
})

a === a // false
a !== a // true

哈哈,有点意思

那 x === x + 1 怎么为true呢?

一般也不容易想,这要用到一个不常用的js中最大安全整数

Number.MAX_SAFE_INTEGER = 9007199254740991

他表示2^53 - 1
那么

Number.MAX_SAFE_INTEGER + 1 = 9007199254740992
// 再加一
Number.MAX_SAFE_INTEGER + 1 = 9007199254740992

加两次一之后Number.MAX_SAFE_INTEGER就不再累加了,那不就解了?表示比这还大的数那就得用Bigint

x = Number.MAX_SAFE_INTEGER + 1
x === Number.MAX_SAFE_INTEGER + 1 // true

同理我们也可以使用Number.MIN_SAFE_INTEGER最小安全整数
妙啊!!!!

x > x 为true ?😂

这个就麻烦了,要用到Symbol的toPrimitive方法了,它的作用就是

Symbol.toPrimitive 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
mdn传送门

var a = {
    value: 12,
    [Symbol.toPrimitive](){
        console.log("return之前的值", this.value)
        return --this.value
    }
}
console.log(a > a)
// return之前的值 12
// return之前的值 11
// true

目瞪狗呆🐶

最后一个,什么的类型是undefined并且还要他的length大于零

typeof x === 'undefined' && x.length > 0

首先undefined的类型是不是undefined呢??

typeof undefined === 'undefined' // true
// 但是他又没有length

那一般等于undefined的都是未定义的或者手动给个undefined的,而且还得有length属性
死也没想到是document.all

typeof document.all === 'undefined' &&document.all.length > 0 // true

奇怪的知识又增加了🙈

相关文章

网友评论

      本文标题:怎么让x !== x 为true?, x === x + 1怎么

      本文链接:https://www.haomeiwen.com/subject/zqapurtx.html