今天翻公眾號(hào)的時(shí)候發(fā)現(xiàn)了一個(gè)有意思的文章:x !== x 可以為 true
自己想了一下,確實(shí)不知道,難道還有什么不等于他自己?jiǎn)幔?br>
原來(lái)我一直忽略了一個(gè)"數(shù)": NaN
他不等于任何值甚至不等于他自己
NaN === NaN // false
NaN == NaN // false
NaN !== NaN // true
好家伙,x = NaN
那除了NaN還有啥辦法嗎?
還可以通過(guò)Object.defineProperty,每次讀取這個(gè)值的時(shí)候給他賦值一個(gè)新的值
// window上定義一個(gè)新的值a,讓他成為window的屬性
var a = 0
Object.defineProperty(window, 'a', {
get () {
// 每次獲取a的時(shí)候就給他賦值一個(gè)隨機(jī)數(shù)
return (Math.random() * Math.random())
}
})
a === a // false
a !== a // true
哈哈,有點(diǎn)意思
那 x === x + 1 怎么為true呢?
一般也不容易想,這要用到一個(gè)不常用的js中最大安全整數(shù)
Number.MAX_SAFE_INTEGER = 9007199254740991
他表示2^53 - 1
那么
Number.MAX_SAFE_INTEGER + 1 = 9007199254740992
// 再加一
Number.MAX_SAFE_INTEGER + 1 = 9007199254740992
加兩次一之后Number.MAX_SAFE_INTEGER就不再累加了,那不就解了?表示比這還大的數(shù)那就得用Bigint了
x = Number.MAX_SAFE_INTEGER + 1
x === Number.MAX_SAFE_INTEGER + 1 // true
同理我們也可以使用Number.MIN_SAFE_INTEGER最小安全整數(shù)
妙啊?。。。?/p>
x > x 為true ???
這個(gè)就麻煩了,要用到Symbol的toPrimitive方法了,它的作用就是
Symbol.toPrimitive 是一個(gè)內(nèi)置的 Symbol 值,它是作為對(duì)象的函數(shù)值屬性存在的,當(dāng)一個(gè)對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的原始值時(shí),會(huì)調(diào)用此函數(shù)。
mdn傳送門(mén)
var a = {
value: 12,
[Symbol.toPrimitive](){
console.log("return之前的值", this.value)
return --this.value
}
}
console.log(a > a)
// return之前的值 12
// return之前的值 11
// true
目瞪狗呆??
最后一個(gè),什么的類(lèi)型是undefined并且還要他的length大于零
typeof x === 'undefined' && x.length > 0
首先undefined的類(lèi)型是不是undefined呢??
typeof undefined === 'undefined' // true
// 但是他又沒(méi)有l(wèi)ength
那一般等于undefined的都是未定義的或者手動(dòng)給個(gè)undefined的,而且還得有l(wèi)ength屬性
死也沒(méi)想到是document.all
typeof document.all === 'undefined' &&document.all.length > 0 // true
奇怪的知識(shí)又增加了??