今天翻公众号的时候发现了一个有意思的文章: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
奇怪的知识又增加了🙈