怎么讓x !== x 為true?, x === x + 1怎么為true?,x > x 怎么為true ?, typeof x === 'undefined' && x.length > 0怎...

今天翻公眾號(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í)又增加了??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Javascript 中有6種基本類(lèi)型(包括 symbol),以及對(duì)象類(lèi)型,他們?cè)诓煌倪\(yùn)算中會(huì)被系統(tǒng)轉(zhuǎn)化為不同是...
    faremax閱讀 927評(píng)論 0 3
  • 1. undefined和undeclared 訪問(wèn)未被聲明的變量,會(huì)報(bào)ReferenceError, 但是typ...
    何幻閱讀 1,055評(píng)論 0 0
  • 最近在整理 JavaScript 的時(shí)候發(fā)現(xiàn)遇到了很多面試中常見(jiàn)的面試題,本部分主要是作者在 Github 等各大...
    Java圈子閱讀 337評(píng)論 0 0
  • 001.優(yōu)雅降級(jí)和漸進(jìn)增強(qiáng) 漸進(jìn)增強(qiáng)(Progressive Enhancement):一開(kāi)始就針對(duì)低版本瀏覽器進(jìn)...
    造了個(gè)輪子閱讀 434評(píng)論 1 1
  • [TOC] 參考阮一峰的ECMAScript 6 入門(mén)參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,915評(píng)論 0 1

友情鏈接更多精彩內(nèi)容