Who said javascript was easy ?

Who said javascript was easy ?

谁说JavaScript容易?
扩展链接
扩展链接

Here’s a few tricks and traps that javascript beginners should probably know of. If you’re already an expert, feel free to read this with a knowing look.
这里有一些JavaScript初学者应该知道的技巧和陷阱。 如果你已经是一个专家,那就随意阅读.

1. Did you ever try to sort an array of numbers ?

1.你尝试过给一组数字排序吗?

Javascript sort()uses alphanumeric sort per default.
Javascript的sort()方法默认用来给数字排序

So[1,2,5,10].sort()will output[1, 10, 2, 5].
所以[1,2,5,10].sort()将会输出[1, 10, 2, 5].

To properly sort an array, you can use[1,2,5,10].sort((a, b) => a — b)
要正确的对数组进行排序的话,你可以使用[1,2,5,10].sort((a, b) => a — b)

Easy solution, provided you knew there was a problem in the first place :)
只要你一开始就知道这个坑的话,解决起来就很容易.

2. new Date() is just wonderful

2. new Date()很奇妙

new Date()can accept:
new Date()可以接受:

  • no argument: returns now

  • one argument x: returns 1st of january 1970, + x milliseconds. Unix people know why.

  • new Date(1, 1, 1) returns 1901, february , 1. Because you know, the first one means 1 year after 1900, the second one is the second month of the year (hence february) — who in his right mind would start indexing a table at indice 1  — , and the third one obviously is thefirstday of the month, so 1 — because sometimes the indices do start at 1 — .

  • Oh, and also new Date(2016, 1, 1) will not add 2016 years to 1900. It will simply represent the year 2016.

  • 没有参数就返回当前时间

  • 一个参数x就返回当前时间1970年1月1日,+ x毫秒,Unix的人知道为什么.

  • new Date(1,1,1)返回1901年,2月1日.因为你知道,第一个1意思是1900年后的1年,第二个1是这一年的第二个月(因此二月) - 二月的正确索引在索引表中为1 ,第三个1显然是这个月的第一天,所以是1 - 因为有时索引确实从1开始。

  • 哦,还有new Date(2016年,1,1)不会从2016年追加到1900年。它仅仅表示2016年。

3. Replace does not replace

3.Replace不替代

I find it to be a good thing, as I don’t like functions that mutate their input. You also should know that replace will only replace the first match:

我觉得这是件好事,因为我不喜欢函数去改变他输入的值,你应该也知道replace只会替换他第一个匹配:

let s = "bob"
const replaced = s.replace('b', 'l')
replaced === "lob" // first match only
s === "bob" // original string is remained unchanged

If you wish to replace all occurences, you can use a regex with/g:
如果你想替换所有,你可以使用带有/ g的正则表达式:

"bob".replace(/b/g, 'l') === 'lol' // replace all occurences

4.Careful with comparisons

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

Reason: [1,2,3] and [1,2,3] are two separate arrays. They just happen to contain the same values. They have distinct references and cannot be compared with===
理由:[1,2,3]和[1,2,3]是两个单独的数组.它们恰好包含相同的值,但是它们有不同的引用,不能用全等===比较

5. Array is no primitive type

5.数组不是原始数据类型

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

To know if your var is an array, you can still use Array.isArray(myVar)
想知道你的是不是数组, 你仍然可以使用Array.isArray(myVar)来判断

6. Closures

6.闭包

This one makes a well known javascript interview question:
这是一道有名的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

Did you expect it to output 0, 1, 2… ? Do you know why it does not ? How would you fix it ?
你是不是期望它输出0,1,2 ...? 你知道为什么它却没有输出吗? 你会如何修改它?

Let’s mention two of the possible solutions to this problem:
我们提出两个可能的解决方案:

Use let instead of var. Boom. solved.
使用let 来替换var. 立马解决.

“The difference [between let and var] is scoping. var is scoped to the nearest function block and let is scoped to the nearestenclosingblock (both are global if outside any block), which can be smaller than a function block.” (source)

"在let和var之间的差异是作用域,vari的作用域是最近的函数块,而let的作用域是最近的封闭块,封闭块可以小于函数块。(如果在任何块之外使用的话,let和var它们都是全局的) (source)

Alternative: usebind:
其他方法:使用 bind:
Greeters.push(console.log.bind(null, i))
There are plenty of other ways to do this. These are only my top-2 choices :)
其实有很多种方法去解决,这是我推荐的2种方法.

7. Speaking about bind

7.聊聊绑定

What do you think this will output ?
你认为这个将会输出什么?

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()

One point for you if you think this will crash withCannot read property 'name' of undefined
Reason:greet is not run with proper context. Again, there are many ways to solve this.
理由:greet没有在正确的上下文运行,同样,是有很多方法可以解决.

I personally like
我个人比较喜欢


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

This way you ensure that greet is called with your class instance as context.
这样做可以确保 greet可以被作为上下文的实例调用。

  • If you feel like greet should never be run out of context, you can also bind it in your class constructor:
  • 如果你不希望greet在实例上下文外运行,你还可以在类的constructor函数中绑定它.
class Foo {
  constructor (name) {
    this.name = name
    this.greet = this.greet.bind(this)
  }
}

You should also know that fat arrows (=>) can be used to preserve the context. This will also work:
你还应该知道箭头函数(=>)可以被用于保留上下文.它也可以这样使用:

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

翻译:bibi
原文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容