免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
誰(shuí)說(shuō) JavaScript 很簡(jiǎn)單了?


本文介紹了 JavaScript 初學(xué)者應(yīng)該知道的一些技巧和陷阱。如果你是老司機(jī),就當(dāng)做回顧了,哪里有寫的不好的地方歡迎指出。

1. 你是否嘗試過(guò)對(duì)一個(gè)數(shù)字?jǐn)?shù)組進(jìn)行排序呢?

JavaScript 中的 sort() 默認(rèn)是按字母排序的。所以比如你這樣 [1,2,5,10].sort(),會(huì)輸出[1,10,2,5]。

正確的排序可以使用 [1,2,5,10].sort((a, b) => a?—?b)。

是不是很簡(jiǎn)單,這個(gè)知識(shí)點(diǎn)是告訴你第一種方式排序是有問(wèn)題的。

2. new Date() 很好用

new Date() 可以接收:

  • 無(wú)參數(shù):返回當(dāng)前時(shí)間;

  • 1 個(gè)參數(shù) x:返回 1970 年 1 月 1 日 + x 毫秒時(shí)間。Unix 的小伙伴知道為什么是這樣;

  • new Date(1,1,1) 返回 1901 年 2 月 1 日:第一個(gè) “1” 代表 1900 年以后的第 1 年;第二個(gè) “1” 代表這一年的第 2 個(gè)月(并不是像你想象的那樣從 1 月開始);第三個(gè) “1” 代表這個(gè)月的第 1 天(這個(gè)確實(shí)是如你想象的那樣從 1 開始)。

  • new Date(2017,1,1) :這并不是表示 1900 + 2017了,它就是表示 2017 年 1 月 1 日。

3. 替換,實(shí)際上并沒(méi)有替換

對(duì)于原始串不被替換掉,我是雙手贊同的,我不喜歡一個(gè)函數(shù)的輸入總是在變化。另外你應(yīng)該知道replace 只會(huì)替換第一個(gè)匹配上的字符。

   let s = 'bob'    const replaced = s.replace('b', 'l')    replaced === 'lob' // 只替換第一個(gè)匹配上的    s === 'bob' // 原始串始終沒(méi)變

如果你想替換所有的,那就是用正則符 /g

   'bob'.replace(/b/g, 'l') === 'lol' // 替換所有串

4. 小心使用比較

   // These are ok    'abc' === 'abc' // true    1 === 1         // true    // These are not    [1,2,3] === [1,2,3] // false    {a: 1} === {a: 1}   // false    {} === {}           // false

原因:[1,2,3] 和 [1,2,3] 是兩個(gè)數(shù)組,它們只是恰巧值相等罷了,他們的引用是不同的,所以不能用簡(jiǎn)單的 === 來(lái)比較。

5. 數(shù)組不是原始類型

   typeof {} === 'object'  // true    typeof 'a' === 'string' // true    typeof 1 === number     // true    // But....    typeof [] === 'object'  // true

想知道你的變量是不是數(shù)組,仍然可以使用 Array.isArray(myVar)。

6. 閉包

這是很出名的一道 JavaScript 面試題:

   const Greeters = []    for (var i = 0 ; i <>10 ; i++) {      Greeters.push(function () { return console.log(i) })    }    Greeters[0]() // 10    Greeters[1]() // 10    Greeters[2]() // 10

你預(yù)期的是輸出:0,1,2...嗎?你知道這是為什么嗎?你知道怎么 fix 嗎?

我來(lái)提兩種可能的解決方案來(lái)解決這個(gè)問(wèn)題:

  • 第一種:使用 let,不用 var。Duang!解決了~

let 和 var 的區(qū)別是作用域。var 的作用域是最近的函數(shù)塊。而 let 的作用域是最近的封閉塊。如果兩個(gè)都是在塊外的,那兩個(gè)都是全局的。最近的封閉塊,要比最近的函數(shù)塊范圍小。這里是源碼。

  • 第二種:使用 bind

   Greeters.push(console.log.bind(null, i))

還有很多方法可以解決這一問(wèn)題,這里列出了我個(gè)人的兩種最優(yōu)選擇。

7. 聊一聊 bind

你覺得下面的代碼會(huì)輸出什么?

   class Foo {      constructor (name) {        this.name = name      }      greet () {        console.log('hello, this is ', this.name)      }      someThingAsync () {        return Promise.resolve()      }      asyncGreet () {        this.someThingAsync()        .then(this.greet)      }    }    new Foo('dog').asyncGreet()

給你點(diǎn)提示,你認(rèn)為是否會(huì)拋出異常呢?Cannot read property 'name' of undefined。

原因:greet 沒(méi)有在恰當(dāng)?shù)纳舷挛闹袌?zhí)行。依舊,有很多種方法解決這個(gè)問(wèn)題。

  • 第一種:我個(gè)人比較喜歡如下解決方法。

   asyncGreet () {      this.someThingAsync()      .then(this.greet.bind(this))    }

這種方式可以保證 greet 是在類已經(jīng)實(shí)例化以后被調(diào)用。

  • 第二種:如果你想確保 greet 始終可以正確調(diào)用,可以綁定到構(gòu)造函數(shù)中。

   class Foo {      constructor (name) {        this.name = name        this.greet = this.greet.bind(this)      }    }
  • 第三種:你還應(yīng)該知道箭頭函數(shù)(=>)可以保護(hù)上下文,也可以解決這個(gè)問(wèn)題。

   asyncGreet () {      this.someThingAsync()      .then(() => {        this.greet()      })    }

雖然我覺得最后一種解決方案這個(gè)例子中很不優(yōu)雅……


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
誰(shuí)說(shuō)Javascript簡(jiǎn)單的?
Javascript中typeof用法總結(jié)
JavaScript:為什么命名參數(shù)比位置參數(shù)更好
帶你聊聊JavaScript中的回調(diào)函數(shù),區(qū)分下同步和異步回調(diào)
25個(gè)最基本的JavaScript面試問(wèn)題及答案
JavaScript中String的屬性和方法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服