NodeJsの基本構文とtypes_node.js

WBOY
WBOYオリジナル
2016-05-16 16:14:181567ブラウズ

の前に書かれています

今日はNodeの種類についての知識をまとめたいと思います。Googolの記事を見ましたが、元の記事のリンクがなくなっています。ご質問がございましたら、ご連絡ください。

この記事はすべて JS の基本に関するものです。専門家は自動的に省略します。私はこれまで js についてあまり書いたことがなく、この分野は比較的苦手なので、node を書くときにトラブルにも遭遇しました。ここで自分自身に知識を追加します。

テキスト

Node.js は JavaScript スクリプト言語に基づいています。ほとんどのスクリプト言語に共通する特徴は「弱い型付け」です。

PHP とは異なり、PHP は新しい変数があっても新しい変数を宣言する必要はありませんが、JavaScript では変数を宣言するために var が必要です。そして、この var は、C の int、string、char などのすべての型、さらには関数の意味をカバーします。

この記事と次の記事のすべての内容は、Linux または Cygwin 上の vim を使用して編集され (そうでない場合は、独自の方法に変換してください)、コマンド ラインで結果を表示します。

基本文法

変数宣言

C/C では、次のように変数を宣言します。

```C

コードをコピーします コードは次のとおりです:

void foo() {}
int a = 0;
char b = 'a';
float c = 1.0f;
void (*d)() = foo; ///
こう書いたか忘れましたが、関数ポインタです。

Node.js では次のようになります:
```javascript

コードをコピーします コードは次のとおりです:

関数 foo() {}
var a = 0;
var b = 'a';
var c = 1.0;
var d = foo;

つまり、変数の型に関係なく、Node.js では var で解決されます。

ループステートメント

私のために

このループ ステートメントは基本的に C/C と同じで、どちらも

```C

コードをコピーします コードは次のとおりです:

for(int i = 0; i {
//...
}

Node.js は弱く型指定されているため、必要なのは次のものだけです。
```javascript

コードをコピーします コードは次のとおりです:

for(var i = 0; i //...
}
のために…

これは、PHP の foreach に似た、後から入力されたループ ステートメントです。

たとえば、次のような JSON オブジェクトがあります:

JavaScript

コードをコピーします コードは次のとおりです:

var foo = {
"こんにちは" : "世界",
"ノード" : "js",
"何とか" : "バー"
};

現時点では、for...in を使用してループスルーできます。

JavaScript

コードをコピーします コードは次のとおりです:

for(foo の var key) {
console.log(key ": " foo[key]);
}

コマンドラインに次のコマンドを入力すると:

コードをコピーします コードは次のとおりです:

$ ノード foo.js

次の内容が画面に表示されます:

コードをコピーします コードは次のとおりです:

こんにちは
: 世界
ノード: js
なんとか: バー

ヒント: 上記からわかるように、for...in ステートメントは JSON オブジェクト、配列、オブジェクトのキー名を走査するために使用されますが、キー値の走査は提供しません。キー値を取得したい場合は、foo[] の形式でのみ取得できます。これは、PHP の foreach とは多少異なります。

ながら…やって、やって…しながら

他の言語とあまり変わりませんが、変数宣言がある場合は var を使う必要があります。

オペレーター

、-、*、/

これらの演算子について注意する必要があるのは以上です。文字列と数値演算の両方を操作できます。弱い型付け言語は型が弱いと言いますが、数値が文字列の形で現れることもあれば、文字列が数値の形で現れることもあります。ただし、必要な場合には、それがどのような型であるかを伝える必要があります。次のコードを使用して結果を確認できます:

コードをコピーします コードは次のとおりです:

var a = "1";
var b = 2;
console.log(a b);
console.log(parseInt(a) b);

ここでの parseInt は Node.js の組み込み関数であり、文字列を int 型の変数に解析するために使用されます。

上記のコードの実行結果は次のとおりです。

コードをコピーします コードは次のとおりです:

12
3

注: 最初の console.log の結果は 12 です。 a は文字列であるため、b もシステムによって文字列として追加され、結果として 2 つの文字列が結合されて 12 になります。最初の a を int 型に変換したため、2 番目の console.log の結果は 3 になります。2 つの int 型変数を加算すると、結果は当然 3 になります。

==、===、!=、!==

ここで説明しておきたいのは、この論理演算子の長さが 2 (==、!=) の場合、外部値が同じかどうかを判断するだけで、型は判断しないということです。

など

コードをコピーします コードは次のとおりです:

var a = 1、b = "1";
console.log(a == b);

出力される結果は true です。ただし、判定の途中に等号を付けると、型と値が同じ場合のみ真となり、そうでない場合は偽となります。つまり

コードをコピーします コードは次のとおりです:

var a = 1、b = "1";
console.log(a === b);

の場合、a は int 型であり、b は文字列であるため、返される結果は false です。

ところで、条件文について話しましょう。実際、ここでは他の言語と何ら変わりはなく、2 つの等号と 3 つの等号が必要です。したがって、あまり詳しくは説明しません。

タイプ

ここでは関数ではなく演算子として扱います。

この演算子の機能は、変数の型を決定することです。次のコードを実行すると、文字列、つまり型名が返されます。

コードをコピーします コードは次のとおりです:
関数 foo() {}
var a = 0;
var b = 'しー、卵ドロップスープは眠っています。 ';
var c = 1.0;
var d = foo;
var e = { "a" : a };
var f = [ 1, 2, 3 ];
var g = null;
var h = 未定義;
console.log(a の種類);
console.log(typeof b);
console.log(typeof c);
console.log(typeof d);
console.log(typeof e);
console.log(typeof f);
console.log(g の種類);
console.log(h の種類);

ここでの実行結果は次のようになります:

コードをコピーします コードは次のとおりです:
番号
文字列
番号
関数
オブジェクト
オブジェクト
オブジェクト
未定義

null、未定義、NaN

タイトルに示されているように、JavaScript には 3 つの特別な値があります。最初のものは C/C にもありますが、本質は

です。

```C

NULL 0 を定義

JavaScript では、これら 3 つの値は異なる意味を持ちます。

### null ###

null は特別な種類のオブジェクトで、大まかに言うと空を意味します。例:

var a = null;
誰でも理解できることなので、あまり説明しません。ただし、C/C とは異なり、この null は 0 に等しくありません。

### 未定義 ###

これは、この変数が宣言されていないことを意味します。 null をより適切に区別するために、サンプルコードは次のとおりです:

```javascript

コードをコピーします コードは次のとおりです:

var a = {
"foo" : null
};
console.log(a["foo"]);
console.log(a["bar"]);

上記のコードでは、a["foo"] の値を空、つまり null にしています。そして、["bar"] の宣言はまったくなく、空ですらありません。誰もが出力結果を推測したはずです:

コードをコピーします コードは次のとおりです:

null
未定義

ナン

これは空の値、特別な数値です。正式名は「Not a Number」です。これは少し奇妙です。デジタル形式ではない、または値が正しくない数値型変数として理解できます。

ほとんどの場合、浮動小数点数値演算エラー (0 による除算など) が発生したときに発生します。この関数演算がエラー値を返すためにユーザー自身が NaN に等しい変数を作成することもあります。間違ってしまいました。

小さなホルモン

その他の残りのステートメントは、break、switch、 continue など、他の既存の言語と似ています。

変数の型

このセクションでは主に JavaScript オブジェクトについて説明し、他の型についてはほとんど説明しません。

ベーシックタイプ

Node.js には、ほぼ次の基本的な型が含まれています:

番号
文字列
ブール値
配列
このうち、最初の 3 種類は直接代入でき、配列の代入は単なる参照代入です。新しい変数の値が変更されると、古い変数の値も変更されます。次のコードを直接試すことができます。 :

JavaScript
var foo = [ 1, 2, 3 ];
var bar = foo;
bar[0] = 3;
console.log(foo);
得られる結果は次のとおりです:

JavaScript
[ 3、2、3 ]
つまり、array が新しい配列をコピーする場合、直接代入は使用できませんが、「ディープ コピー」する必要があります。

配列の 3 つの作成方法について説明する必要があります。

最初のタイプ:

JavaScript

コードをコピーします コードは次のとおりです:

var Dog = new Array();
犬[0] = "しー";
Dog[1] = "エッグドロップスープ";
犬[2] = "寝ています";

2 番目のタイプ:

JavaScript

コードをコピー コードは次のとおりです:

var Dog = new Array( "しー", "卵ドロップスープ", "睡眠" );

4 番目のタイプ:

JavaScript

コードをコピー コードは次のとおりです:

var 犬 = [
「しー」、
「エッグドロップスープ」、
「睡眠」
];

個人的には、より簡潔な 3 番目の書き方を好みます。

JSON オブジェクト

ここでは、JSON オブジェクトを JavaScript オブジェクトとして分類するのではなく分離しています。少し誤解を招くと思われる場合は、このセクションを直接スキップしてください。

JSON オブジェクトと JavaScript オブジェクトの違いは、クラスをインスタンス化するのではなく、データを保存するためだけに使用されるかどうかにあります。実際、JSON の本質は JavaScript オブジェクト表記です。

JSON の詳細については、自分で百科事典を調べてください。

Node.js での JSON オブジェクトの宣言は非常に簡単です。

JavaScript

コードをコピー コードは次のとおりです:

var 犬 = {
"pre" : "しー",
"サブ" : {
"name" : "エッグドロップスープ",
"行為" : "睡眠",
「時間」:12
}、
"suf" : [ "言った"、"寝ている"、"ただ寝ているだけだ" ]
};

JSON オブジェクト内の特定のキー名のキー値を取得するには、2 つの方法があります。1 つ目はドット接続を使用する方法で、2 つ目は角かっこを使用する方法です。

JavaScript

コードをコピーします コードは次のとおりです:

.pre;
犬["前"];

注: 上記のドットを使用する場合、JSON ではキーが直接続きます。キーを変数として扱う場合は、dog[key] でのみ試行できます。これで、自分で試せるようになり、The for を使用できます。 ...フォームでは、上記の JSON オブジェクトを走査します。 typeof を使うのを忘れないでください~

クラス(オブジェクト)の基本

厳密に言えば、Node.js クラスは、いくつかのメンバー変数を持つ単なる関数のコレクションであると見なすことはできません。その本質は実際には関数です。

ただし、簡単にするために、これ以降ではこれを「クラス」と呼び、インスタンス化を「オブジェクト」と呼びます。

クラスには多くの関数特性があるため、またはその本質は関数であるため、ここで誤って関数の基本を説明してしまう可能性があります。

クラスの宣言とインスタンス化

クラスの宣言は非常に簡単です。笑わないでください:

JavaScript

関数 foo() {
//...
}
さて、foo クラスを書きました。

本物か偽物? !本物。

信じられませんか?信じられない場合は、コードを入力して見てください:

JavaScript

var bar = new foo();
関数であろうとなかろうと、この形(new)で書か​​れていれば、このクラスのインスタンス化になります。

そして、このいわゆる foo() は、実際には foo() クラスのコンストラクターです。

メンバー変数

メンバー変数を使用するには 2 つの方法があります。

1 つ目は、クラスのコンストラクターまたは任意のコンストラクターで this. を使用することです。メンバー変数はいつでも宣言でき、宣言前に使用した場合でも、それをサポートするための未定義が存在します。これが最初のメソッドです:

コードをコピーします コードは次のとおりです:
JavaScript
関数 foo() {
This.hello = "世界";
}

注: これが追加された場合のみ、呼び出しクラスのメンバー変数になります。それ以外の場合は、関数内の単なるローカル変数です。 thisがない場合は変数のスコープを区別する必要があります。

2 番目の方法は、コンストラクターまたはメンバー関数の外側で宣言することです。形式は <クラス名>.prototype.<変数名>:

です。

JavaScript

コードをコピーします コードは次のとおりです:
関数 foo() {
//...
}
foo.prototype.hello = "世界";

上記のどのメソッドがメンバー変数の宣言であっても、その効果を確認できます。

JavaScript

コードをコピーします コードは次のとおりです:
var bar = new foo();
console.log(bar.hello);

このクラスを次のように変更することもできます:

JavaScript

コードをコピーします コードは次のとおりです:
関数 foo() {
This.hello = "世界";
}
foo.prototype.hello = "エッグドロップスープ";

次に、上記のコードを使用して出力します。

なぜ出力が卵ドロップスープではなく世界のままなのか考えてみましょう。

コンストラクター

foo() は実際にはコンストラクターであると前に述べました。したがって、明らかにコンストラクターにパラメーターを渡すことができるため、次のコードが得られます:

JavaScript

コードをコピー コードは次のとおりです:

// コード 2.1
function foo(hello) {
If(こんにちは === 未定義) {
This.hello = "世界";
} else {
This.hello = こんにちは;
}
}

if(hello === 未定義) の上に奇妙な判定がありますが、この判定は何に使われるのでしょうか? 1 つ目の可能性は、開発者がわざわざ未定義を渡したことです。この時点では、未定義であることは理解できます。

別の状況もあります。冒頭で JavaScript は型付けが弱い言語であると述べましたが、実際には型付けが弱いだけでなく、パラメータの受け渡しも非常に緩いのです。多かれ少なかれ合格しても構いません (多かれ少なかれ合格してもプログラムでエラーが発生しない、またはロジックでエラーが発生しないことが保証できる限り) 原則として問題ありません。 more で渡されたパラメータは自動的に無視されますが、less で渡されたパラメータは unknown で補完されます。

理解するには次のコードを見てください:

JavaScript

コードをコピーします コードは次のとおりです:

// コード 2.1 からの続き
var bar1 = 新しい foo();
var bar2 = new foo("エッグドロップスープ");

2 つのバーの hello 変数を自分で出力してください。1 つはワールド、もう 1 つはエッグ ドロップ スープであることがわかります。明らかに、最初の bar1 が宣言されると、Node.js は自動的にそれを次のように認識します:

JavaScript

コードをコピーします コードは次のとおりです:

var bar1 = 新しい foo(未定義);

だから、それが世界だという言葉があります。

また、このコンストラクターでは、渡されたパラメーターが hello であり、このクラスには this.hello というメンバー変数があることがわかります。ただし、これがある場合とない場合ではスコープが異なると前述しましたが、パラメータはコンストラクター内でのみ機能し、これがあるものはメンバー変数です。これを使えばすぐに区別できるので、同じ名前でも大丈夫です。

メンバー関数

メンバー関数宣言

メンバー関数の宣言は、メンバー変数の 2 番目の宣言方法、つまり、.prototype. = ;

と似ています。

JavaScript

コードをコピーします コードは次のとおりです:

// コード 2.1 からの続き
function setHello(hello) {
this.hello = こんにちは;
}
foo.prototype.setHello = setHello;
bar1.setHello("エッグパンケーキ");

上記のコードは、foo.hello の値を変更できる foo クラスの setHello 関数を実装していることは明らかです。

でも、こうやって書くのはちょっと面倒じゃないですか?次に、JavaScript 関数の重要な機能について説明します。

★匿名機能★

多くの場合、一部の関数は 1 か所でのみ参照または呼び出されます。そのため、この関数に名前を付けることは価値がなく、不要です。そのため、この関数を一時的に作成して、参照する人に直接名前を付けることができます。人々はそれを引用し、それを呼ぶ人はそれを呼びます。したがって、関数名は次のように省略できます。

JavaScript

コードをコピーします コードは次のとおりです:

function(hello) {
This.hello = こんにちは;
}

見積もりや電話の方法は?上記のクラスを参照する必要がある場合は、次のように記述します:

JavaScript

コードをコピーします コードは次のとおりです:

foo.prototype.setHello = function(hello) {
This.hello = こんにちは;
}

この書き方はメンバー関数宣言と同じ効果があり、コード量を大幅に節約できます。そして実際には、基本的にクラスのメンバー関数の宣言はこの匿名関数の方法で宣言されます。

匿名関数を呼び出すにはどうすればよいですか?これは通常、特定の関数によってのみ呼び出される関数を渡すときに使用されます。

たとえば、プロトタイプが次のような関数があります:

JavaScript

コードをコピー コードは次のとおりです:

/**
* 2 つの変数 a と b、
を渡します。 * a b の値を計算したら、それを func(num)
に渡します。 * 出力に移動
​*/
function sumab(a, b, func) {
var c = a b;
func(a, b, c);
}

たとえば、出力関数には 2 つのバージョンがあり、1 つは中国語出力、もう 1 つは英語出力です。匿名関数が使用されない場合、次のように記述されます。

JavaScript

コードをコピーします コードは次のとおりです:

関数 zh(a, b, sum) {
console.log(a " " b " の値は次のとおりです: " sum);
}
function en(a, b, sum) {
console.log(a " plus " b " is " sum);
}
sumab(1, 2, zh);
sumab(3, 4, en);

このコードを 1 回実行すると、出力結果は次のようになります:

1 2 の値は次のとおりです: 3
3たす4は7です
このようなコードが匿名関数の形式である場合、次のようになります:

JavaScript

コードをコピーします コードは次のとおりです:

sumab(1, 2, function(a, b, sum) {
console.log(a " " b " の値は: " sum);
});
sumab(3, 4, function(a, b, sum) {
console.log(a " plus " b " is " sum);
});

この形式は通常、コールバック関数に使用されます。コールバック メカニズムは Node.js または JavaScript の本質です。それは今後の章で紹介されます。

メンバー関数宣言の無名関数宣言方法

前のセクションでも触れましたが、もう一度お話しましょう。

通常、クラスのメンバー関数を宣言するときは、匿名関数を使用して宣言します。その関数はとにかくこのクラスの単なるメンバー関数であり、他の場所から個別に参照または呼び出されることはないため、次のようになります。コード:

JavaScript

コードをコピーします コードは次のとおりです:

// コード 2.1 からの続き
foo.prototype.setHello = function(hello) {
This.hello = こんにちは;
}

このようにして、fooクラスにsetHello関数を持たせます。

2.3.4. クラスの任意性

これはまた私からのナンセンスです。いわゆるクラスの任意性とは、JavaScript のどこでもクラスを変更できることを意味しており、Ruby と一定の類似点があります。

たとえば、string は実際にはクラスであり、length などのメンバー変数と、indexOf や substr などのメンバー関数を持ちます。ただし、この文字列がいくつかの場所で不完全であると感じ、独自のメソッドを追加したい場合は、必要な場所に次のような関数を追加できます。

JavaScript

コードをコピーします コードは次のとおりです:
String.prototype.sb = function() {
var newsstr = "";
for(var i = 0; i If(i % 2 === 0) newstr = "s";
else newstr = "b";
}
ニュースを返します;
};

この関数の意味は、sb の化身となるように文字列を埋めることです。

テストしてみましょう:

コードをコピーします コードは次のとおりです:
var str = "し、卵ドロップスープが眠っています。";
console.log(str.sb());

次の結果が得られます:

sbsbsbsbs

あなたがコンピュータに「シーッ、エッグドロップスープが眠っているよ。」と言うと、コンピュータはあなたを 4 回半「バカ」と呼ぶでしょう。 (早く潰せ)

3.添付

3.1. ディープコピー

いわゆるディープコピーとは、単に配列やオブジェクトの参照を取得するのではなく、自分で新しい配列やオブジェクトを作成し、ソース配列やオブジェクト内の基本型変数の値を 1 つずつ手動でコピーすることを意味します。ソース配列またはオブジェクト。したがって、これには再帰呼び出しなどが含まれます。

以下は私が実装したディープ コピー関数です。独自に作成して、独自の Node.js ナレッジ ベースに追加できます。

JavaScript

コードをコピー コードは次のとおりです:

function cloneObject(src) {
  var dest = {};
  for(src の var key) {
    if(typeof src === "object") dest[key] = cloneObject(src[key]);
    else dest[キー] = src[キー];
  }
  宛先を返します;
}
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。