国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

誰說 JavaScript 很簡單了?

wapeyang / 1629人閱讀

摘要:是不是很簡單,這個(gè)知識點(diǎn)是告訴你第一種方式排序是有問題的。這并不是表示了,它就是表示年月日。最近的封閉塊,要比最近的函數(shù)塊范圍小。還有很多方法可以解決這一問題,這里列出了我個(gè)人的兩種最優(yōu)選擇。原因沒有在恰當(dāng)?shù)纳舷挛闹袌?zhí)行。

本文作者:Aurélien Hervé
編譯:胡子大哈

翻譯原文:http://huziketang.com/blog/posts/detail?postId=58e06b98a58c240ae35bb8dd
英文連接:Who said javascript was easy ?

轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息

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

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

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

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

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

2. new Date() 很好用

new Date() 可以接收:

無參數(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í)際上并沒有替換

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

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

如果你想替換所有的,那就是用正則符 /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ù)組,它們只是恰巧值相等罷了,他們的引用是不同的,所以不能用簡單的 === 來比較。

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 嗎?

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

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

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

第二種:使用 bind

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

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

7. 聊一聊 bind

你覺得下面的代碼會輸出什么?

    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)為是否會拋出異常呢?Cannot read property "name" of undefined

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

第一種:我個(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è)問題。

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

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

結(jié)束語

恭喜!到現(xiàn)在你知道了 JavaScript 中的一些坑,和一點(diǎn)技巧。JavaScript 中還有很多知識等待著你去學(xué)習(xí),不過起碼在這幾個(gè)問題上,你不會再犯錯(cuò)誤了。Cheers! o/

如果你認(rèn)為文章中還需要注意什么,或者添加什么,請讓我知道。

我最近正在寫一本《React.js 小書》,對 React.js 感興趣的童鞋,歡迎指點(diǎn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/82415.html

相關(guān)文章

  • 誰說“程序員離開電腦就是廢物?我身邊這位大兄弟表示不服!真事

    摘要:三十而立時(shí),無房單身郎。女生也經(jīng)常找他修電腦,只要有他在,所有的電子產(chǎn)品都能很快恢復(fù)原貌。 ??年少太輕狂,獨(dú)闖IT行。愁絲根根落,眼圈黑茫茫。bug數(shù)萬種,技能要...

    happyfish 評論0 收藏0
  • 撕起來誰說數(shù)據(jù)少就不能用深度學(xué)習(xí)?這鍋俺不背!

    摘要:帖子原文標(biāo)題為即數(shù)據(jù)不多時(shí),就別用深度學(xué)習(xí)了,喜歡看熱鬧的,不妨搜一下。我們首先要做的事情就是構(gòu)建一個(gè)使用數(shù)據(jù)集,并且可用的深度學(xué)習(xí)模型。許多人認(rèn)為深度學(xué)習(xí)是一個(gè)巨大的黑箱。 撕逼大戰(zhàn),從某種角度,標(biāo)志著一個(gè)產(chǎn)業(yè)的火熱。最近,大火的深度學(xué)習(xí),也開始撕起來了。前幾日,有一篇帖子在Simply Stats很火,作者Jeff Leek在博文中犀利地將深度學(xué)習(xí)拉下神壇,他談到了深度學(xué)習(xí)現(xiàn)在如何狂熱,...

    mist14 評論0 收藏0
  • Pandas之旅(七) 誰說pandas慢

    摘要:下面讓我們開始提速假設(shè)我們現(xiàn)在的電價(jià)是定值,不根據(jù)用電時(shí)間段來改變,那么中最快的方法那就是采用,這就是一個(gè)簡單的矢量化操作示范。它基本是在中運(yùn)行最快的方式。 Pandas 加速 大家好,今天我們來看有關(guān)pandas加速的小技巧,不知道大家在剛剛接觸pandas的時(shí)候有沒有聽過如下的說法 pandas太慢了,運(yùn)行要等半天 其實(shí)我想說的是,慢不是pandas的錯(cuò),大家要知道pandas本身...

    genedna 評論0 收藏0
  • 【突破次元壁】誰說二次元離我們遙遠(yuǎn)?Python特效火遍全網(wǎng),關(guān)鍵技術(shù)原來是它!!

    摘要:從明星到路人,堪稱全民參與,刷了很多類似的視頻發(fā)現(xiàn)效果竟然這么好看,來看下效果吧登場的是張藝興和戚薇。尤其是眼睛的處理,把張藝興慵懶的眼神戚薇水汪汪的大眼睛,詮釋的淋漓盡致。當(dāng)然發(fā)型也都是滿分轉(zhuǎn)換,分叉造型等細(xì)節(jié)可以說是絲毫不差了。 導(dǎo)語 昨天下班,回家吃完飯就直接躺了,無聊的時(shí)候大家都會干...

    source 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<