ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptコアの型、値、変数の読み取り_基礎知識

Javascriptコアの型、値、変数の読み取り_基礎知識

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

コンピューター プログラムの操作には、数値 3.14 やテキスト「hello world」などの値の操作が必要です。プログラミング言語では、表現および操作できる値のタイプをデータ型 ( type) の最も基本的なプログラミング言語。複数のデータ型をホストできるのが特徴です。プログラムは、将来の使用のために値を保存する必要がある場合、その値を変数に割り当てます (値を「保存」します)。変数は値の記号名であり、値への参照は名前によって取得できます。変数がどのように機能するかは、プログラミング言語の基本的な機能です。この章では、この章の内容を理解するために前のセクションを参照し、後でさらに詳しく説明します。

JavaScript データは、プリミティブ型とオブジェクト型の 2 つのカテゴリに分類されます

JavaScript の元のクラスには、数値、文字列、およびブール値が含まれます。この章には、JavaScript の数値、文字列、およびブール値に特化した別の章があります。 JavaScript には、null (空) と Unknown (未定義) という 2 つの特別なプリミティブ値もあります。これらは数値、文字列、またはブール値ではありません。これらはそれぞれ、独自の特別なタイプの一意のメンバーを表します。

JavaScript は、数値、文字列、ブール値、null、および未定義に加えてオブジェクトです。オブジェクトはプロパティのコレクションです。各属性は「名前と値のペア」で構成されます (値は、数値、文字列、オブジェクトなどのプリミティブ値にすることができます)。より特殊なオブジェクトの 1 つ (グローバル オブジェクトはミス 5 で紹介され、セクション 6 で詳しく説明されます)

通常の JavaScript オブジェクトは、「名前付きの値」の不要なコレクションです。 JavaScript は、番号付きの値の順序付けられたコレクションを表す特別なオブジェクト、つまり配列も定義します。 JavaScript は配列の特別な構文を定義します。 Make 配列には、通常のオブジェクトとは異なるいくつかの固有の動作特性があります。

JavaScript は特別なオブジェクト関数も定義します。関数は、実行可能コードが関連付けられたオブジェクトであり、実行可能コードを実行して操作の結果を返すために呼び出されます。配列と同様、関数は他のオブジェクトとは異なる動作をします。 JavaScript は、関数を使用するための特別な構文を定義します。 JavaScript 関数の場合。最も重要なことは、これらはすべて true 値であり、JavaScript はそれらを通常のオブジェクトのように扱うことができるということです。

関数が新しいオブジェクトを (new 演算子を使用して) 初期化する場合、それをコンストラクターと呼びます。各コンストラクターは、オブジェクトのクラス、つまりコンストラクターが初期化するオブジェクトのコレクションを定義します。クラスは、オブジェクト型のサブタイプとして考えることができます。配列クラスと関数クラスに加えて、JavaScript では他の 3 つの便利なクラスも定義されています。 Date は、日付を表すオブジェクトを定義します。 Regular (regExp) オブジェクトは正規表現を定義します。 error クラスは、JavaScript プログラムの実行時エラーと構文エラーを表すオブジェクトを定義します。独自のコンストラクターを定義することで、必要なクラスを定義できます。

JavaScript インタプリタには、メモリ上でガベージ コレクションを自動的に実行できる独自のメモリ管理メカニズムがあります。これは、プログラムがオンデマンドでオブジェクトを作成できるため、プログラマはこれらのオブジェクトの破棄やメモリのリサイクルについて心配する必要がありません。オブジェクトへの参照がなくなると、インタプリタはそのオブジェクトがもう役に立たないことを認識し、オブジェクトが占有しているメモリ リソースを自動的に再利用します。
JavaScript はオブジェクト指向言語です。大まかに言えば、これは、さまざまなタイプの値を操作するための関数をグローバルに定義する必要がないことを意味します。たとえば、配列 a 内の要素をソートするために、データ型自体で値を使用するメソッドを定義できます。 a sort() 関数を入力しますが、メソッド sort()

を呼び出します。

a.sort(); //sort(a) のオブジェクト指向バージョン
技術的には、JavaScript オブジェクトのみがメソッドを持つことができます。ただし、数値、文字列、ブール値にも独自のメソッドがあります。 JavaScriptではメソッドを持てない値はnullとunknownのみです。

JavaScriptの型はプリミティブ型とオブジェクト型に分けられ、さらにメソッドを持つことができる型とメソッドを持つことができない型に分けることができます。また、可変型と不変型に分けることもできます。変数型の値は変更できます。 オブジェクトと配列は変数型です。JavaScript プログラムはオブジェクトの属性値と配列要素の値を変更できます。

数値、ブール値、null、未定義は不変型です。たとえば、配列の内容を変更すること自体は意味がありません。文字列は文字の配列と考えることができ、変更可能であると考えることができます。ただし、JavaScript では文字列は不変です。文字列内の任意の位置のテキストにアクセスできますが、JavaScript には文字列のテキスト内容を変更するメソッドが提供されていません。

JavaScript は自由にデータ型変換を行うことができます。たとえば、プログラムが文字列を想定している場所で数値が使用されている場合、JavaScript は自動的に数値を文字列に変換します。ブール値が予期される場所で非ブール値が使用された場合、JavaScript はそれに応じて変換します。 「等価」のための JavaScript の柔軟な型取得および交換ルール

JavaScript 変数には型がありません。変数を宣言するには、var キーワードを使用して変数を割り当てることができます。 JavaScript は構文スコープを使用します。関数内で宣言されていない変数はグローバル変数と呼ばれ、JavaScript プログラム内のどこでも参照できます。

1. 数字

他のプログラミング言語とは異なり、JavaScript は整数値と浮動小数点値を区別しません。 JavaScriptにおける数値は浮動小数点値で表現されます。 JavaScript プログラム内で数値が直接出現する場合、それを数値リテラルと呼びます。JavaScript は複数の形式の数値リテラルをサポートします。 (注: 数値の直前にマイナス記号 (-) を追加すると、負の値が得られます。) ただし、マイナス記号は単項否定演算子です。 、数値リテラル文法の一部ではありません。 )

i 整数直接量

JavaScript で配列シーケンスを使用して 10 進整数を表現します

JavaScript は、10 進整数リテラルに加えて、16 進数メカニズム (16) を基底とする値も認識します。いわゆる 16 進数には「0X」または「0x」という接頭辞が付けられ、その後に 16 進数文字列の直接の量が続きます。 16 進値は、0 ~ 9 の数字と a(A) ~ f(F) の間の文字で構成されます。文字 a ~ f は 10 ~ 15 の数字を表します。 以下は 16 進整数リテラル

の例です。

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

0xff //15*16 15=255
0xCAFE911

ECMAScript は 8 進数リテラルをサポートしていませんが、JavaScript の一部の実装では整数を 8 進数 (base 8) 形式で表現できます。 8 進リテラルは数値 0 で始まり、0 から 7 までの一連の数字が続きます。

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

0377 // 3*64 7*8 7 =255 (10 進数)

JavaScript 実装には 8 進数のスカラーをサポートするものとサポートしないものがあるため、先頭に 0 を付けた整数のスカラーを使用しないことが最善です。結局のところ、現在の JavaScript 実装が 8 進数の解析をサポートしているかどうかを知る方法はありません。 ECMAScript 6 の厳密モードでは、8 進リテラルは明示的に禁止されています。

ii. 浮動小数点リテラル

浮動小数点リテラルには小数点を含めることができ、実数の従来の記述方法が使用されます。実数は、整数部、小数点、および小数部で構成されます。

さらに、指数表記を使用して浮動小数点リテラルを表すこともできます。つまり、実数の後に文字 E または e が続き、その後に正または負の符号が続き、その後に整数の指数が続きます。この数え方で表される値は、前の実数の指数乗に 10 を乗算したものです。

を表すために、より簡潔な構文を使用できます。

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

[数字][.数字][(E|e)[( |-)]数字]
3.14
2345.455
.33333333333333333
6.02e23 //6.02*10の23乗
1.255454E-23 //1.255454*10 のマイナス 23 乗

iii.javascript の算術演算

JavaScript プログラムは、言語によって提供される算術演算子を使用して数値演算を実行します。これらの演算子には、- * / および剰余 (除算後の剰余) 演算子 %
が含まれます。 JavaScript は、基本的な演算子に加えて、より複雑な算術演算もサポートしており、この複雑な演算は、Math オブジェクトのプロパティとして定義された関数と定数によって実装されます。

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

Math.pow(2, 53) //=>9007199254740992 document.write(Math.pow(2,53) )
Math.round(.6) //=>1.0 丸め
Math.ceil(.6) //=>1.0 切り上げ
Math.floor(.6) //=>0.0 切り捨て
Math.abs(-5) //=>5 絶対値を求めます
Math.max(x, y, z) //最大値を返す
Math.min(x, y, z) //最小値を返す
Math.random() //0 より大きく 1 未満の疑似乱数を生成します
Math.PI //Pi
Math.E //e: 自然対数の底
Math.sqrt(3) //3 の平方根
Math.pow(3, 1 / 3) //3 の立方根
Math.sin(0) //三角関数、Math.cos、Math.atan など
Math.log(10) //=>2.302585092994046 底 10 の自然対数
Math.log(512) / Math.LN2 //底 2 の 512 の対数
Math.log(100) / Math.LN10 //10 を底とする 100 の対数
Math.exp(3) //e の 3 乗

JavaScript の算術演算では、オーバーフロー、アンダーフロー、またはゼロ除算が発生した場合にエラーが報告されません。ただし、数値演算結果はJavaScriptで表現できる数値の上限を超え(オーバーフロー)、JavaScriptではinfintyで表現される特殊な無限値(infinty)の値となります。同様に、負の数値の値が JavaScript で表現できる負の数値の範囲を超える場合、結果は負の無限大となり、JavaScript では -Infinty で表されます。無限値は期待どおりに動作します。それらに基づく加算、減算、乗算、除算は無限大になります (符号は保持されます)

アンダーフローは、演算の結果が限りなくゼロに近く、JavaScript が表現できる最小値より小さい場合に発生する状況です。負の数値がアンダーフローすると、JavaScript は通常のゼロとほぼ同じである特別な値「負のゼロ」を返します。 JavaScript プログラマーが負のゼロを使用することはほとんどありません。

JavaScript では、正の無限大と数値以外の値を表すために使用されるグローバル変数 Infinaty と NaN が事前定義されており、ECMAScipt3 ではこれら 2 つの値を読み書きできます。 ECMAScript5 では、読み取り専用として定義することでこの問題を解決しています。 ECMAScipt3 の Number オブジェクトによって定義されるプロパティ値も読み取り専用です。次にいくつかの例を示します。

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

Infinity //読み取り/書き込み変数を無限に初期化します
Number.POSITIVE_INFINITY //同じ値、読み取り専用
1 / 0 //これも同じ値です
Number.MAX_VALUE 1 //計算結果はまだInfinity
Number.NEGATIVE_INFINITY //負の無限大を表します
-無限大
-1/0
-Number.MAX_VALUE -1
                                                                                                                                                                                                                                                                                                    Number.NaN //同じ値ですが、読み取り専用
//計算結果はまだnan
です Number.MIN_VALUE/2 //アンダーフローが発生しました。計算結果は0
-Number.MIN_VALUE/2 //負のゼロ
-1/無限大 //負のゼロ
-0

JavaScript における数値以外の値は、それ自体を含め、人間や値と同等ではありません。つまり、x==NaN によって x が NaN であるかどうかを判断する方法はありません。代わりに、x を使用してください。 =x は、x が NaN である場合にのみ、式の結果が true であると判断します。パラメーターが NaN または数値以外の値 (文字列やオブジェクトなど) の場合、関数 isNaN() は同様に機能します。 trueを返します。 JavaScript にも同様の関数 isFinite() があり、パラメーターが NaN、Infinty、または -Infinity でない場合に true を返します。

負のゼロの値も若干特殊であり、(JavaScript の厳密な等価性テストを使用して判断されても) 正のゼロと負のゼロに等しくなります。つまり、除数を除いて 2 つの値はほぼ同一です。 🎜>

コードをコピーします コードは次のとおりです: var ゼロ = 0;
var negz = -0;
Zero === negz //=>true 正のゼロ値と負のゼロ値は等しい
1/zero === 1/negz //false 正の無限大と負の無限大は同じではありません



iiii. 2 進浮動小数点および丸め誤差
実数は無数にありますが、JavaScript では浮動小数点数の形で限られた数しか表現できません (正確には 18 437 736 874 454 810 627)。つまり、JavaScript で実数が使用される場合、それらは限られた数になります。多くの場合、これは真の値の近似値にすぎません。

JavaScript は IEEE-754 浮動小数点数表現 (ほとんどすべての最新のプログラミング言語で使用されています) を使用します。これは、1/2 1/8 や 1/1024 などの分数を正確に表現できる 2 進数表現です。残念ながら、特に金融計算でよく使用される分数は、すべて 1/10 や 1/100 などの小数です。 2 進数表現では 0.1 のような単純な数値を表現できません。

JavaScript の数値には十分な精度があります。 0.1 に近い値になることもありますが、この数値を正確に表現できないという事実により、いくつかの問題が生じます。

コードをコピーします コードは次のとおりです: var x = .3 - .2;
var y = .2 - .1;
alert(x == y) //=>false 2 つの値は等しくありません
x == .1 //=>false .3-.2 は .1 と等しくありません
y == .1 //=>true .2-.1 は 1 に等しい

丸め誤差により、0.3 と 0.2 の間のおおよその差は、実際には 0.2 と 0.1 の間のおおよその差と等しくなりません (実際のシミュレーション環境では、0.3-0.2=0.099 999 999 999 999 98) この問題は当てはまりません。これは JavaScript に特有のものですが、2 進浮動小数点数を使用するすべてのプログラミング言語で発生することを理解することが重要です。また、上記のコードの x と y の値は互いに非常に近く、最終的な正しい値であることにも注意してください。この計算結果は、ほとんどのコンピューティング タスクに使用できます。この問題は、2 つの値が等しいかどうかを比較する場合にのみ発生します。

JavaScript の将来のバージョンでは、この問題を回避するために 10 進数タイプがサポートされる可能性がありますが、それまでは、重要な財務計算には大きな整数を使用することをお勧めします。たとえば、通貨単位ベースの操作には、10 進数の「ドル」の代わりに整数の「セント」を使用します。

iiiii.日付と時刻

JavaScript 言語のコアには、日付と時刻のオブジェクトを作成する Date() コンストラクターが含まれており、これらの日付オブジェクトのメソッドは、日付計算用の単純な API を提供します。日付オブジェクトは、数値のような基本的なデータ型にはできません。

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

var zhen = new Date(2011, 0, 1) //2011 年 1 月 1 日
; var Later = new Date(2011, 0, 1, 17, 10, 30) //同日
; var now = new Date() //現在の日付と時刻
var elapsed = now - zhen; //日付の減算。間隔のミリ秒数を計算します
late.getFull Year() //=>2011
; late.getMonth() //=>0 0 から始まる月
Later.getDate() //=>1 1 から始まる日数
later.getDay(); //=>5 曜日を取得します。 0 は日曜日を表し、5 は月曜日を表します 1
late.getHours() //=>現地時間
late.getUTCHours() //タイムゾーンに基づいて、UTC を使用して時間を表します。

2. テキスト

文字列は、通常、Unicode 文字セットに由来する、不変の順序付けられた 16 ビット値のシーケンスです。 JavaScript は文字列型を通じてテキストを表します。文字列の長さは、文字列に含まれる 16 ビット値の数です。 Javascript 文字列 (およびその配列) には 0 から始まるインデックスが付けられます。空の文字列の長さは 0 であり、JavaScript には単一の文字を表す「文字型」はありません。 16 ビット値を表すには、それを文字列変数に代入するだけです。この文字列の長さは 1 です。

文字セット、内部コード、JavaScript 文字列
JavaScript は、UTF-16 でエンコードされた Unicode 文字セットを使用します。JavaScript 文字列は、シリアル化されていない 16 ビット値のセットで構成されます。最も一般的に使用される Unicode 文字は 16 ビットの内部コードで表され、16 ビット文字として表現できない Unicode 文字は、UTF-16 エンコード規則に従います。つまり、2 つの 16 ビット値を使用します。はシーケンス (「サロゲート ペア」とも呼ばれます) として表されます。これは、長さ 2 の JavaScript 文字列 (2 つの 16 ビット値) が Unicode 文字を表す可能性があることを意味します。

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

var p ="π" ; //πは16ビットの内部コード0x03c0
で表されます。 var e = "e" //e は 17 ビットの内部コード 0x1d452
で表されます。 p.length // =>1 p には 16 ビット値が含まれます
e.length // =>2 e には、UTF-16 エンコード後の 2 つの値が含まれます: "ud835udc52"

JavaScript で定義されているさまざまな文字列操作メソッドはすべて、文字ではなく 16 ビット値を操作し、サロゲート ペアは個別に処理されません。同様に、JavaScript は文字列に対して標準化された処理を実行しません。文字列が正当な UTF-16 形式であるという保証はありません

i 文字列リテラル

JavaScript プログラムの文字列リテラルは、一重引用符または二重引用符で囲まれた文字シーケンスです。一重引用符で区切られた文字列には二重引用符を含めることができ、二重引用符で区切られた文字列には一重引用符を含めることもできます。以下に文字列リテラルの例をいくつか示します。

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

"" //空の文字列、0 文字
'テスト'
「3.14」
'name="myform"'
「オライリーの本の方がいいんじゃない?」

ECMAScript3 では、文字列リテラルは 1 行で記述する必要がありますが、ECMAScript5 では、文字列リテラルを複数の行に分割することができ、各行はバックスラッシュ ()、バックスラッシュ、行終端文字で終わる必要があります。文字列リテラルの内容。それらを一緒にしたい場合は、使用できます エスケープ文字。

文字列を区切るために一重引用符を使用する場合は、英語の略語とすべての書式設定に特に注意する必要があることに注意してください。英語のアポストロフィと一重引用符は同じ文字であるため、バックスラッシュ () エスケープを使用する必要があります。

ii エスケープ文字

JavaScript 文字列では、バックスラッシュ () には特別な目的があります。たとえば、n は改行文字を表すエスケープ文字です。

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

o //NUL 文字
b //バックスペース文字
t //水平タブ文字
n //改行文字
v //垂直タブ文字
F // ページ文字 r " //二重引用符
\ バックスラッシュ
xXX Latin-1 文字を 2 桁の 16 進数で指定
xXXXX 4 つの 16 進数 XXXX 文字で指定される Unicode 文字


iii 文字列の使用法

JavaScript の組み込み関数の 1 つは文字列の連結です。文字列で演算子を使用することは、文字列の連結を意味します。たとえば

コードをコピーします コードは次のとおりです:
var msg = "hello" "world" //文字列 hello world
を生成します。

文字列の長さ、つまり文字列に含まれる 16 ビット値の数を決定するには、文字列 の長さなどの長さ属性を使用できます。

s.length

長さ属性に加えて、文字列には呼び出すことができる多くのメソッドも用意されています。


コードをコピーします コードは次のとおりです:
var s = "hello,world";
s.charAt(0) //「h」の最初の文字
; s.charAt(s.length - 1) //"d"最後の文字
s.substring(1, 4) //「エル」 2 ~ 4 文字
s.slice(1, 4) //ell 上記と同じ
s.slice(-3) // 最後の 3 文字
s.indexOf(l ")//2 文字 l が最初に出現する位置
s.lastIndexOf("l") //10 文字 l が最後に出現した位置
s.indexOf("l",3)//位置 3 以降、l 文字が最初に出現する位置
s.split(",") //=> ["hello", "world"] は部分文字列に分割されます
s.replace("h","H")// =>"Hllo,world" 全文文字置換
s.toUpperCase() //=>"HELLO,WORLD"

JavaScript では、replace() や toUpperCase() などのメソッドは新しい文字列を返し、元の文字自体は変更されません。

ECMAScript では、charAt() メソッドを使用するだけでなく、文字を読み取り専用の配列として扱うことができ、角括弧を使用して文字列内の個々の文字にアクセスすることもできます。 (16ビット値)

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

s = "ハロー、ワールド"
s[0] //=>「h」
s[s.length-1] //=>"d"

Foxfire はずっと前からこの方法で文字列インデックス付けをサポートしており、ほとんどの最新のブラウザ (IE を除く) は Mozailla の足跡をたどり、ECMAScript が形になる前にこの機能を完成させました

iiii パターンマッチング

JavaScript は、テキスト パターン マッチングを表すオブジェクトの作成に使用される RegExp() コンストラクターを定義します。これらのパターンは、JavaScript Caiyang Perl の正規表現構文である「正規表現」と呼ばれます。 String オブジェクトと RegExp オブジェクトは両方とも、正規表現を使用したパターン マッチング、検索および置換の関数を定義します。

RegExp オブジェクトは、Date と同様に、この言語の基本的なデータ型ではなく、実用的な API を備えた単なる特殊なオブジェクトです。正規表現の構文は複雑で、API は豊富です。詳しくは第10章で紹介します。 RegExp は強力で一般的に使用されるテキスト処理ツールです。これは概要にすぎません。

RegExp はこの言語の基本的なデータ型ではありませんが、それでも直接記述する方法があり、JavaScript で直接使用できます。 2 つのスラッシュ間のテキストは、正規表現のリテラルを形成します。 2 番目のスラッシュの後に 1 つ以上の文字を続けることもできます。一致するパターンの意味を変更するために使用されます。例:

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

/^HTML/ // HTML
で始まる文字列と一致します /[1-9][0-9]*/ // ゼロ以外の数値の後に任意の数の数値が続くものと一致します
/bjavascriptb/i/ // javascript という単語と一致し、大文字と小文字は区別されません

RegExp オブジェクトは多くの便利なメソッドを定義しており、文字列にも RegExp パラメータを受け入れることができるメソッドがあります。例:

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

var text = "テスト:1,2,3" //テキストの例
; var pattern = /d /g / //1 つ以上の数字を含むすべてのインスタンスに一致します
pattern.test(text) // =>true: 一致成功
text.search(pattern) //=>9: 最初に成功した一致の位置
text.match(pattern) //=> ["1", "2", "3"] すべての一致が配列を形成します
text.repeat(pattern,"#") //=>"テスト:#,#,#"
text.split(/D /); //=>["","1","2","3"]: 文字列
をインターセプトするには数値以外の文字を使用します。

3.ブール値

ブール値は、true または false、on または off を指します。この型には、予約語 true または false の 2 つの値のみがあります。

JavaScript の比較ステートメントの結果は通常、ブール値です。たとえば

a==4
このコードは、変数 a の値が 4 に等しいかどうかを検出するために使用されます。等しい場合、値は true、そうでない場合、値は false

ブール値は通常、JavaScript の if/else ステートメントなどの JavaScript 制御ステートメントで使用されます。ブール値が true の場合はロジックの最初の部分が実行され、false の場合は別のコードが実行されます。

など

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

If (a == 4)
b = b 1;
その他
a = a 1;

任意の JavaScript 値をブール値に変換できます。次の値は false に変換されます。

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

未定義
null
0
-0
NaN
""//空の文字列

すべてのオブジェクト (配列) を含む他のすべての値は true、false に変換され、JavaScript がブール値の使用を想定している場合、false に変換できる上記の 6 つの値は「false 値」と呼ばれることがあります。 false 値は false として扱われ、true 値は true として扱われます

変数 o がオブジェクトまたは null であることを追加して、if ステートメントを使用して o が非 null 値であるかどうかを検出できます。

if(o!==null)...
不等演算子「!==」は o と null を比較し、結果は true または false になります。ここでの比較ステートメントは最初は無視できます。null は false 値で、オブジェクトは true 値です。

もし(o)...
最初のケースでは、o が null でない限り、if の後のコードが実行されます。2 番目のケースの制限はそれほど厳しくありません。この if は、o が false または任意の false 値 (null または unfined など) ではない場合にのみ実行されます。

Boolean には toString() メソッドが含まれているため、このメソッドを使用して文字列を "true" または "false" に変換できますが、この重要ではない API 以外に 3 つの重要なメソッドが含まれていません。 1 つのブール演算子。

&& 演算子、|| 演算子、および単項演算子「!」は、true 値が false を返す場合、false 値は true を返します。

コードをコピーします コードは次のとおりです:
If ((x == 0 && y == 0) || !(z == 0)) {
// x と y が両方とも 0 であるか、z が 0 以外である
}

4.null および未定義

Null は JavaScript 言語のキーワードであり、null の場合は typeof() 演算が実行され、オブジェクトが返されます。これは「非オブジェクト」を意味します。しかし実際には、通常、null はその自由型の唯一のメンバーとみなされます。 「値のない」数値、文字列、オブジェクトを表すことができます。ほとんどのプログラミング言語には JavaScript などの null が含まれており、null または nil についてはよく知られているかもしれません。

JavaScript には、値の空きを示す 2 番目の値もあります。より深い「NULL 値」を表すために使用されます。変数の値です。変数が初期化されていないことを示します。オブジェクトのプロパティまたは配列要素の値をクエリして未定義を返す場合、それはプロパティまたは要素が存在しないことを意味します。 unknown は事前定義されたグローバル変数 (null とは異なり、キーワードではありません) であり、その値は未定義です。 typeof を使用して未定義の型をテストすると、「未定義」が返され、この値がこの型の唯一のメンバーであることを示します。

null と unknown は異なりますが、どちらも「値の欠如」を表し、多くの場合、この 2 つは交換可能です。等価演算子「==」は、2 つが等しいとみなします (これらを区別するには、厳密な等価演算子「===」を使用する必要があります)。値がブール型であると予想される場合、その値は false になります。 false に似ています。 null と unknown にはどちらもプロパティやメソッドが含まれません。実際、「.」と「[]」を使用してこれら 2 つの値のメンバーまたはメソッドにアクセスすると、型エラーが発生します。

これらを変数またはプロパティとしてコピーするか、関数に渡す場合は、未定義はシステム レベルの予期しない値またはエラーのような値の空きを表し、null はプログラム レベルの通常の値または期待される値の空きを表すと考えることができます。パラメータの場合、null が最良の選択です。

5. グローバルオブジェクト

前のセクションでは、JavaScript 要素のタイプとプリミティブ値について説明しました。オブジェクトの種類 - オブジェクト、配列、関数/しかし、ここで明確にしなければならない非常に重要なオブジェクトのクラスがあります: グローバル オブジェクト

グローバル オブジェクトは JavaScript で重要な役割を果たします。グローバル オブジェクトのプロパティは、グローバルに定義されたシンボルです。 JavaScript プログラムを直接使用できます。 JavaScript インタープリターが開始されると、新しいグローバル オブジェクトが作成され、それに定義済みの初期プロパティのセットが与えられます。

未定義の Infinty や NaN などのグローバル プロパティ
isNaN()、parseInt()、eval()などのグローバル関数
Date()、RegExp()、String()、Object()、Array() などのコンストラクター
Math や JSON などのグローバル オブジェクト
グローバル オブジェクトの初期プロパティは予約語ではありませんが、予約語として扱う必要があります。

コードの最上位レベル (関数内にない JavaScript コード) では、javascript キーワードを通じてグローバル オブジェクトを参照できます。

var global = this; //グローバル オブジェクトを参照するグローバル変数を定義します。
クライアント側 JavaScript では、ウィンドウ オブジェクトはグローバル オブジェクトとして機能します。このグローバル ウィンドウ オブジェクトは、グローバル コア プロパティを参照するためにこれを置き換えることができます。ただし、Web ブラウザーと対話型 JavaScript 用の他のグローバル プロパティも定義します。

最初に作成されたとき、グローバル オブジェクトは JavaScript で定義済みのグローバル値をすべて定義します。この特別なオブジェクトには、プログラムに定義されたグローバル値も含まれます。コードでグローバル変数が宣言されている場合。このグローバル変数はグローバル オブジェクトのプロパティです。

6. オブジェクトのパッケージ化

JavaScript オブジェクトは複合値です。プロパティまたは名前付き値のコレクションです。属性値は「.」を通じて参照され、属性値が関数の場合はメソッドとなり、オブジェクト o 内のメソッドは o.m() を通じてディスパッチされます。

文字列にもプロパティとメソッドがあることがわかります。

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

var s="hello world";
var word = s.substring(s.indexOf("") 1,s.length);//文字列の属性を使用します。
document.write(word) //"ello world"

文字列はオブジェクトではないのに、なぜ属性があるのでしょうか? string のプロパティが参照されている限り、JavaScript は new String を呼び出して文字列の値をオブジェクトに変換します。このオブジェクトは string のメソッドを継承します。プロパティ参照を処理するために使用されます。新しい属性が参照されると。参照が終了すると、新しく作成されたオブジェクトは破棄されます。 (この一時オブジェクトは実際には作成または破棄されませんが、プロセスは次のようになります。)

文字列と同様、数値やブール値にも独自のメソッドがあり、Number() および Boolean() コンストラクターを通じて一時オブジェクトを作成します。これらのメソッドの呼び出しはすべて、この一時オブジェクトから行われます。 (null と unknown はラップされたオブジェクトではないため、それらのプロパティにアクセスすると型エラーが発生します)

次のコードを見て、その実行プロセスについて考えてください

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

var s = "テスト";
s.len = 4 // 属性を設定します
; var t = s.len //この属性を検索

このコードを実行すると、t の値は未定義になります。コードの 2 行目では、一時的な文字列オブジェクトが作成され、len の値が 4 に設定され、コードの 3 行目では、元の (変更されていない) オブジェクトが使用されます。 ) ) 新しい文字列オブジェクトを作成し、len プロパティを読み取ろうとします。

この属性は当然存在せず、結果が未定義であることを示します。このコードは、文字列、配列、およびブール値の属性値 (またはメソッド) を読み取るときに、オブジェクトのように動作することを示しています。その属性に値を割り当ててみます。この操作は無視され、変更は一時オブジェクトに対してのみ行われます。この一時オブジェクトは保持されません。

String()、Number()、Boolean() コンストラクターを使用してラッパー オブジェクトを明示的に作成できることに注意してください。

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

var s = "テスト",
n = 1、
b = true;
var S = 新しい文字列;
var N = 新しい数値(n);
var B = new Boolean(b);

Javascript は必要に応じてラッパーをプリミティブ値に変換するため、上記のコードのオブジェクト S N B は、常にではありませんが、多くの場合 s n b と同じように動作します。「==」演算子は元の値とそのラップされた値を変換します。オブジェクトは同等のものとして扱われます。

しかし、「===」演算子はこれらを等しくないものとして扱い、typeof 演算子は元の値とそれがラップするオブジェクトの違いを確認できます。

7. 不変のプリミティブ値と可変のオブジェクト参照。

JavaScript のプリミティブ値 (未定義の null ブール値、数値、文字列) はオブジェクト (配列や関数を含む) とは根本的に異なります。プリミティブ値を変更 (または変更) できるメソッドはありません。これは明らかに数値とブール値に当てはまります。数値自体の値を変更することは意味がありませんが、文字の配列のように見える文字列の場合はそれほど明白ではありません。文字列内の文字は、指定されたインデックスによって変更できることが期待されます。実際、JavaScript ではこれを禁止しています。 string 内のすべてのメソッドは変更された文字列を返すように見えますが、実際には新しい文字列を返します。

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

var s = "hello world";
s.toUpperCase(); //「HELLO WORLD」を返し、s
の値は変更しません。 s //=> "hello world" 元の文字列は変更されていません

元の値の比較は、値が等しい場合にのみ値の比較となります。これは、数値、ブール値、null、未定義の場合には少し難しく思えますが、これらを比較する他に方法はありません。繰り返しますが、文字列の場合はあまり明らかではありません。2 つの別々の文字列を比較する場合、JavaScript は、各インデックスの長さと文字が等しい場合にのみ、それらが等しいとみなします。

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

var o = {x:1} //オブジェクトを定義します
o.x = 2 //プロパティを変更してオブジェクトを変更します
o.y = 3 //このオブジェクトを再度変更し、新しい属性を追加します
var a =[1,2,3] //配列も変更可能
a[0]=0; //配列内の要素を変更します
a[3]=4; 配列
に新しい要素を追加します。

オブジェクトの比較は値の比較ではありません。2 つのオブジェクトに同じ属性と同じ値が含まれている場合でも、それらは等しくなく、完全に等しいインデックス要素を持つ 2 つの配列は等しくありません

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

var o ={x:1}, p={x:1}//同じ属性を持つ 2 つのオブジェクト
o === p ;//=>false 2 つの別々のオブジェクトは決して等しくありません ( o == p ; =>false)
var a =[],b=[] //2 つの別々の空の配列
; a === b; //=>false 2 つの別々の配列が等しくなることはありません

私たちは通常、JavaScript の基本型と区別するためにオブジェクト参照型と呼びます。用語によれば、オブジェクトは参照であり、オブジェクトの比較は参照の比較であり、それらが同じベース オブジェクトを使用する場合にのみ等しくなります。

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

var a = [] //空の配列を参照する変数 a
を定義します。 var b = a //変数 b は同じ配列を参照します
b[0] = 1;
a[0] //=>1 変数 a も変更されます
a === b //=>true a と b は同じ配列を参照するため、それらは等しいです。

上で見たコードと同様に、オブジェクト (または配列) を変数に代入することは、参照値を割り当てるだけです。オブジェクト自体は一度もコピーされません。
オブジェクトまたは配列のコピーを取得したい場合は、オブジェクトのすべてのプロパティまたは配列のすべての要素を明示的にコピーする必要があります。次の例では、ループを通じて配列のコピーを完了します。

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

var a = ['a', 'b', 'c'] //コピーされる配列
; var b = [] //ターゲットの空の配列にコピーします
; for (var i = 0; i 内の各要素を走査します b[i] = a[i] //要素を b にコピーします。
}

同様に、2 つの個体または配列を比較したい場合は、それらの属性または要素を比較する必要があります。次のコードは、配列を比較する関数を定義します。

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

関数equalArrays(a, b) {
If (a.length != b.length) return false; //長さが異なる 2 つの配列は等しくありません
for (var i = 0; i If (a[i] !== b[i]) return false; // 等しくない要素がある場合、配列は等しくありません
// それ以外の場合は等しい
}

8. 型変換

JavaScript の値の型は非常に柔軟です。これはブール値ですでに説明しました。JavaScript がブール値を期待する場合、任意の型の値を指定できます。 JavaScript は必要に応じて型自体を変換します。一部の値(真の値)は true に変換され、他の値(偽の値)は false に変換されます。他の型についても同様です。 JavaScript が文字列を予期している場合、指定された値を文字列に変換します。 JavaScript が配列を期待する場合、指定された値を数値に変換します (変換結果が無意味な場合は NaN を返します)。いくつかの例は次のとおりです:

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

10 "オブジェクト" //=> "10 オブジェクト";
"7" * "4" // =>28 両方の文字列が数値に変換されます
var n = 1 - "x" // =>NaN 文字列 x は数値に変換できません
n「オブジェクト」// =>「ナンオブジェクト」:ナンは弦「ナン」に変換されます

次の表は、JavaScript で型変換を実行する方法を説明しています。太字は、あなたを驚かせる可能性のあるタイプを強調表示しています。空のセルは、不必要で実行されない変換を表します。

をスローします
文字列に変換 番号 ブール値 オブジェクト
未定義
null
「未定義」
「ヌル」
ナン
0

false
TypeError をスローします
TypeError
true
false
"ture"
"false"
1
0
  new Boolean(true)
new Boolean(false)
""(空字符串)
"1.2"(非空,数字)
"one"(非空,非数字)
  0

1.2 
NaN
false
true
本当
新しい文字列("")
new String("1.2")
new String("one")
0
-0
なな
インフィニティ
-インフィニティ
1(無限大、非ゼロ)
"0"
「0」
「NaN」
「インフィニティ」
"-無限大" "1"
false


本当
本当
本当
新しい番号(0);
新しい数値(-0);
新しい数値(NaN)
新しい数字(無限大)
新しい数値(-無限大)
新しい番号(1)
{}(任意のオブジェクト)
[](任意の配列)
[9](1つの数値要素)
['a'](他の配列)
関数(){}(arbitrary function)
Refer to the third section of this section
""
"9"
Use join() method
Please refer to the third section of this section
Refer to the third section of this section
0
9
NaN
NaN
true
true
true
true
true

The conversion from original value to original value mentioned in the above table is relatively simple. We have already discussed the conversion to Boolean value in the third section of this article. The conversion of all primitive values ​​to strings is also clearly defined. The conversion to numbers is more subtle. Strings represented as numbers can be converted directly to numbers, with spaces at the beginning and end allowed. However, any non-null characters at the beginning and end will not be regarded as part of the number, causing the result of the string to be NaN. There are some number conversions that look strange: true is converted to 1, false, and the empty string "" is converted to 0.

The conversion of primitive values ​​to objects is also very simple, primitive values

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