私は JavaScript が好きです。JavaScript は強力かつ柔軟な言語です。もちろん、JavaScript を実際にマスターしたら、それを使ってほとんどすべてのことを行うことができます。
JavaScript が単純すぎる、または低レベルすぎると思うなら、あなたは罠に陥っていることに気づくでしょう。これらのいわゆる JavaScript 開発者の中には、そう言う人もいるかもしれません。他の言語 "X" の方が優れています
言語を変換できるシステムがあれば素晴らしいとさえ言われるかもしれません。JavaScript を習得するには多大な努力と献身が必要です。私は以来 JavaScript を学習しています。 1997.
私は公式の標準ドキュメントを勉強することで JavaScript の高度な知識をすべてマスターしました。この言語の完全な知識を得る方法です。あなたの役職に「JavaScript 開発者」が含まれている場合は、これがそれです。
このブログでは、短い JavaScript コード スニペットを示し、その後、JavaScript 開発者であれば、この種の質問は非常に簡単であることがわかるでしょう。この言語を学習するプロセスでは、いくつかの困難に遭遇するかもしれませんが、コードの下の説明セクションをよく見てください。
次の JavaScript コードでは、ポップアップ ボックスに何が表示されますか? 5;
five.three = 3;
alert(five + Five.three);
正解を確認するには、この記事の最後までスキップしてください。 次に、なぜそのような結果になるのかについて説明します。
JavaScript では、 6 つのデータ型: オブジェクト、数値、文字列、ブール値、Null、および未定義。オブジェクト型には、配列、関数、その他の一般的なオブジェクトが含まれます (数値型には、特殊な値だけでなく整数型や浮動小数点型も使用できます)。 NaN と Infinity。String 型には空の文字列 "" が含まれます。Boolean 型には true と false の 2 つの値しかありません。Null 型には値が 1 つだけあります。オブジェクトを除くすべての型は「プリミティブ値 (プリミティブ)」と呼ばれます。型は定義時に明示的に指定されませんが、スクリプトの実行時に自動的に推測されます。上記のコードでは、数字リテラル 5 が割り当てられているため、five という名前の変数は Number 型です。
他のコンピューター プログラミング言語と同様に、JavaScript も特定の値の型を、特定の値の型を、その値に適した演算子の型に暗黙的に変換します。他の言語とは異なり、JavaScript はこれらの変換を非常に積極的に実行します。たとえば、マイナス演算子は両側のすべてのオペランドを に変換するため、式 "5" - "3" の演算結果は数値 2 になります。オペランドを数値に変換できない場合、たとえば、式 "5" - "Fred" は暗黙的に 5 - NaN に変換されます。演算も NaN になります。
暗黙的な変換ルールの完全なセットはそれほど複雑ではありません。必要なのは、各演算子が必要とするオペランドのタイプを知ることだけです。
任意の値をプリミティブ値に変換する場合は、「任意の値を a に変換する」というルールに従います。オブジェクトのプリミティブ値への変換はより複雑です。オペランドの型が Number 型である必要がある場合、JavaScript エンジンはオブジェクトの valueOf() メソッドを呼び出します。返された結果がまだプリミティブ値の場合、オブジェクトの toString() メソッドを呼び出して、それを String 型の値に変換します。オペランドの型が String 型である必要がある場合、返された結果が String 型でない場合は、オブジェクトの toString() メソッドが最初に呼び出されます。プリミティブ値の場合、オブジェクトの valueOf() メソッドが呼び出されます。その状況に関係なく、最終的な変換結果がプリミティブ値でない場合は、例外がスローされます。
オペランドの型が数値である必要がある場合は、ただし、オペランドの実際の型は次のとおりです。
オブジェクト:
値は最初にプリミティブ値に変換され、変換の結果が数値でない場合は、以下の変換分岐に入ります。
String:
文字列型。値は通常の JavaScript ルールに従って数値型に変換されます
ブール型:
値が true の場合は 1 に変換され、それ以外の場合は 0 に変換されます
Null :
0
Unknown:
NaN
オペランドの型は文字列である必要があるが、オペランドの実際の型が次の場合:
オブジェクト:
値は最初に元の値に変換され、変換の結果が文字列でない場合は、次の変換ブランチ
Number:
数値は「123」や「12.34」などの文字列に直接変換されます
Boolean:
「true」または「false」に変換されます
Null:
「null」
未定義:
「未定義」
オペランドの型はブール値である必要があるが、オペランドの実際の型が次の場合:
オブジェクト:
true
数値:
値が 0 の場合、値が空の文字列 "" の場合は false に変換され、それ以外の場合は true に変換されます
Null:
false
Unknown:
false
オペランドの型がオブジェクト値である必要があるが、実際の型である場合オペランドの値は次のとおりです:
Number:
ラッピング オブジェクト タイプ Number を使用して、元の値 new Number(value) をラップします
String:
ラッピング オブジェクト タイプ String を使用して、元の値 new String(value) をラップします
Boolean:
ラッピング オブジェクト タイプ Boolean を使用して、元の値 new Boolean(value) をラップします
Null:
例外をスローします
未定義:
例外をスローします
すべての変換ルールが明確になったので、次に進みます元の例に戻ります。
var four = 5;
five.three = 3;
alert(five + four.three);
前に述べたように、コードの最初の行は Number 型の four という名前の変数を作成します。
プロパティ アクセサーが変数 Five で使用されると、その値は Object 型に変換されます。この操作は「ラッピング」と呼ばれ、コードの 2 行目は実際にはプリミティブ値ではなくオブジェクトを生成します。次のコードと同等です:
(new Number(five)).three=3;
ご覧のとおり、式が実行された後、新しく生成された Number オブジェクトへの参照を変数に保存していません。追加された 3 つの属性は破棄されます。five 変数の値は変更されません。
コードの 3 行目の式 Five.three は Number オブジェクトを再度作成します。このため、新しいオブジェクトには 3 つの属性がありません。結果は次と同等です:
alert(5+unknown); この場合、加算演算子は両側のすべてのオペランドを NaN に変換し、次のようになります。 (5+NaN);
これは、最後のポップアップ ボックスに NaN が 1 つだけ表示される理由も説明しています。
(翻訳者注: 暗黙的な変換の最後のステップがまだあります。NaN は、alert() のときに自動的に「NaN」に変換されます。
コメント:
jerone:
あなたの記事の内容は JavaScript の一部にすぎません。正確には、ECMAScript のみが含まれています。これに加えて、JavaScript には DOM も含まれています。つまり、より多くのデータ型があります。 Node、Element、HTMLElement など。
著者の返信:
Node、Element、HTMLElement は、Array、Date、RegExp と同じように、データ型ではありません。それらはすべてオブジェクト型に属します。
Marcus Pope:
私はそう思います。次のコードが正常に実行できるように、正しい書き方を指摘する必要があります
var four = new Number(5);
alert(five); // 5
five.three = 3;
alert(five + four. three); //8
また、読者の混乱を避けるために、数値の元の値を参照するには「number」を使用し、数値型のラップ オブジェクトを参照するには「Number」を使用する方がよいと思います。 JavaScript で typeof 演算子を使用してこれらの値の内部クラスのプロパティを表示するときに表示される文字列 (翻訳者注: これは typeof 5 === "number" を指します)
ACRESTAN:
はい、この記事は著者が使用しているため非常に混乱しています。プリミティブ値を記述するには、大文字で始まる文字列を入力します...
たとえば、この文は、「最初の行は、型が Number である Five という変数を作成します。」という文は、これが間違っていることを証明しています。
メタディング:
7 番目のデータ型でもあり、JavaScript で最も重要な型である関数です。JavaScript では、関数を使用して新しいオブジェクトを作成できるため、プリミティブ値型と関数型の間にはまだ違いがあります。
var Project = function () { } ;
// プロジェクトのinstanceof Function === true
// プロジェクトのinstanceof Object === true
// (typeof Project === 'function') === true
var o = new Project();
/ / o インスタンスオブプロジェクト === true
// o インスタンスオブオブジェクト === true
// (タイプオブプロジェクト === 'オブジェクト') === true
このリンクをお読みください http://metadea.de/V/実際の JavaScript クラス関数をどのように作成するかを注意深く確認してください (翻訳者注: 別の文があります。翻訳がありません。理解できません。この人はナンセンスなことを言っていると思います。)
作者の返信:
明らかに関数は非常に複雑です。 JavaScript ではこれは重要であり、別の記事で説明する価値がありますが、関数は別のデータ型ではありません。特殊ではありますが、すべてさまざまなコンストラクターによって作成されるオブジェクトです。同じ型: オブジェクトを継承します。これは簡単に検出できます: Object(a) === a の場合、a は他のプリミティブ値型ではなくオブジェクト型です。
ulu:
この記事は、JavaScript がそうではないことをさらに証明します。最も強力な言語であるだけでなく、最も混乱を招く言語でもあります。これは絶対に使用しないでください。いつか、よりユーザーフレンドリーな言語がすべての主要なブラウザに統合されることを願っています。
作者の返信:
手にハンマーを持っていると、すべてが釘のように見えます。
Dave Chapman:
このタイプのコーディング エラーは、これは、コーディング中にコードを実行する前に構文チェックを実行する IDE が原因です。たとえば、クロージャ コンパイラで例のコードを実行すると、次の警告メッセージが生成されます。 JSC_INEXISTENT_PROPERTY: プロパティ 3 は、Number の行 4 文字 13 で定義されていません:
alert(five + four.three);”
(翻訳者注: クロージャ コンパイラは、Google のコード コンプレッサーまたはコンパイラです。 https://developers.google.com/closure /compiler/)
simonleung:
数値のタイプは、「オブジェクト」または「数値」です。
条件ステートメントまたはブール値に変換する必要があるその他の場所で使用される場合、これら 2 つのタイプの数値は異なるものを生成します。 Number(0) はオブジェクトであり、0 は明らかに false になるため、
Number(0) は true になります。
(翻訳者注: ここでの彼の言い方は間違っています。関数としての Number は単なる型です。変換関数では、返される値は元の値のままです。 new Number(0) が使用される場合にのみ、Number はコンストラクターとみなされ、返されるのはオブジェクトです)
もう 1 つは、null に対して typeof 操作を実行し、「object」を返しますが、実際のオブジェクトではありません。null は false 値であり、false に変換されます。