ホームページ >システムチュートリアル >Linux >Javascriptは初心者にとっても簡単ではありません

Javascriptは初心者にとっても簡単ではありません

WBOY
WBOYオリジナル
2024-08-20 07:32:071190ブラウズ

JavaScript 初心者が知っておくべきヒントと落とし穴をいくつか紹介します。すでにエキスパートである場合は、これをブラッシュアップしてください。

对于初学者来说 Javascript 也并不简单

JavaScript は単なるプログラミング言語です。どうしたらうまくいかないでしょうか?

1. 一連の数字を並べ替えてみたことはありますか?

JavaScript の sort() 関数は、デフォルトで英数字 (文字列 Unicode コード ポイント) の並べ替えを使用します。

つまり、[1,2,5,10].sort()[1, 10, 2, 5].

を出力します。

配列を正しく並べ替えるには、[1,2,5,10].sort((a, b) => a — b)を使用できます

非常に簡単な解決策ですが、そのような落とし穴があることを知っていることが前提です

2.新しいDate()は素晴らしいです

新しい日付() 許容可能:

  • パラメータなし: 現在時刻を返します
  • 1 つのパラメーター x: 1970 年 1 月 1 日 + x ミリ秒を返します。 Unix を知っている人ならその理由がわかるでしょう。
  • new Date(1, 1, 1) は 1901 年 2 月 1 日を返します。なぜなら、最初のパラメータは 1900 プラス 1 年を表し、2 番目のパラメータは今年の 2 番目の月 (つまり 2 月) を表します — 正常な脳回路を持つ人は 1 からインデックス付けを開始します — 、そして 3 番目のパラメータは明らかに、月なので 1 — インデックスが 1 — から始まる場合もあります。
  • 新しい日付(2016, 1, 1) は 2016 を 1900 に加算しません。あくまで 2016 年を表しています。

对于初学者来说 Javascript 也并不简单

3. 置換は「置換」ではありません
リーリー

私は関数が入力を変更するのが好きではないので、これは良いことだと思います。 replace は最初に一致する文字列のみを置換することも知っておく必要があります:

一致した文字列をすべて置換したい場合は、/g flag:

を使用して正規表現を使用できます。 リーリー
4. 比較するときは注意してください
リーリー

理由: [1,2,3] と [1,2,3] は 2 つの独立した配列です。たまたま同じ値が含まれているだけです。これらは参照が異なるため、===と比較することはできません。

5. 配列はプリミティブデータ型ではありません
リーリー

変数が配列かどうかを知りたい場合は、Array.isArray(myVar)

を使用できます。
6. 閉会

这是一个很有名的面试题:

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

你是不是认为它会输出 0, 1, 2… ? 你知道它为什么不是这样输出的吗? 你会怎样修改让它输出 0, 1, 2… ?

这里有两种可能的解决方法:

用 let 替代 var. Boom. 解决了.

letvar的不同在于作用域。var的作用域是最近的函数块,let的作用域是最近的封闭块,封闭块可以小于函数块(如果不在任何块中,则letvar都是全局的)。(来源)

替代方法: 用 bind:

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

还有很多其他方法。这只是我的两个首选

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

如果你认为这个程序会崩溃提示 Cannot read property 'name' of undefined,给你一分。

原因: greet 没有在正确的上下文中运行。同样,这个问题依然有很多解决方案。

我个人喜欢

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

这样可以确保类的实例作为上下文调用greet

如果你认为greet 不应该在实例上下文之外运行, 你可以在类的constructor中绑定它:

class Foo {
constructor (name) {
this.name = name
this.greet = this.greet.bind(this)
}
}

你还应该知道箭头函数( => )可以用来保留上下文。这个方法也可以:

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

尽管我认为最后一种方法并不优雅。

对于初学者来说 Javascript 也并不简单

我很高兴我们解决了这个问题。

总结

祝贺你,你现在可以放心地把你的程序放在互联网上了。甚至运行起来可能都不会出岔子(但是通常会)Cheers \o/

以上がJavascriptは初心者にとっても簡単ではありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。