ホームページ ウェブフロントエンド jsチュートリアル JavaScriptの基本型と参照型を簡単に分析_基礎知識

JavaScriptの基本型と参照型を簡単に分析_基礎知識

May 16, 2016 pm 04:46 PM
javascript 基本タイプ 参照型

JavaScript の型については、次のように簡単に要約できます。強く型付けされた言語と比較すると、弱い (緩やかな) 型付け言語であり、基本型と参照型があり、それらの違いは固定スペースがあることです。スタック メモリでは、不定の領域がヒープ メモリに保存され、実装場所へのポインタがスタック メモリに保存されます。

市販されている多くの本には、それについて語るスペースがたくさんあります。この記事では、JavaScript、特に JavaScript の種類についての基本的な理解を必要とするいくつかの側面について説明します。それでも理解できない場合は、この記事を読む前に JavaScript に関する本を手に取って読んでください。

1. 基本型と参照型

1. 基本型: Unknown/Null/Boolean/Number/String
2. 参照型: Object/Array/Function/Date/RegExp/Error/Map/Set…

なぜ参照型が列挙されていないのでしょうか?少なくともこの記事については、これだけ知っていれば十分だからです。その他はめったに使用されない可能性があり、Map や Set などもすべてのブラウザでサポートされているわけではありません。

2.JavaScriptの種類の判定

JavaScript には型を決定するために使用できる演算子が 2 つあります。これらは typeof と instanceof ですが、その範囲は非常に小さく、うまく混合できず、信頼性が低いことで有名です。正しい場合もありますが、多くの場合は信頼できません。ちょっと見てみると、次のことがわかります:

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

// 信頼できる場合:
typeof ' sofish' // string
new String('sofish')instanceof String // true

// 信頼できない場合:
typeof [] // object
typeof null // object
'sofish'instanceof String // false


うーん、おそらく多くの初心者 JavaScript プログラマーはこれのせいで悪口を言うでしょう。 JS を使用する必要がある場合、ほとんどの人はすでに jQuery などのライブラリを持っており、それらは型を簡単に検出できるようにカプセル化されています。もちろん、実際には、「JavaScript ではすべてがオブジェクトである」ということわざがあるため、検出するのはそれほど面倒ではありません。もちろん、多くのドキュメントで言及されているように、未定義は実際には NaN や Infinity のような単なるグローバル プロパティです。おそらくそれはご存知でしょう。しかし、「オブジェクト」が役に立ちます:

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

/ * 検出オブジェクトの型
* @param: obj {JavaScript Object}
* @param: type {String} 大文字で始まる JS 型名
* @return: {Boolean}
*/
関数 is(obj, type) {
return Object.prototype.toString.call(obj).slice(8, -1) === type;
}

この場合、is 関数を使用して型を決定できます。この単純な関数は互換性が高く、プロジェクトで使用できます。例:

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

is('sofish', 'String' ) // true
is(null, 'Null') // true
is(new Set(), 'Set') // true

3. JavaScript の型変換

JavaScriptでは変数(プロパティ)の型を変更できます。最も一般的なのは、文字列と数値の間の変換です。 1「2」を12に変えるにはどうすればよいですか? JavaScript では算術演算子と文字列ハイフンである演算子を理解する必要があります。したがって、初心者は記号を使用すると、計算が意図したものにならないことがありますが、- 記号を使用すると常に「正しい」答えが得られることがあります。

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

1 '2' // '12'
1 ( '2') // 3
1 - '2' // -1

これは実際には の二重の役割によって引き起こされます。上記のコードでは、2 番目の式で String の前に数値が使用されており、そのクラスが強制的に Number に変換されていることがわかります。 JavaScript の型変換を理解するには、ほとんどの場合、これには 2 つの役割があることを理解すれば十分です。他の理解可能なクラスは、エラー: であっても、代入/オーバーロードを使用して変更できます。

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

var err = new Error();
コンソール .log(err エラーのインスタンス) // true;

err = 'sofish';
console.log(err) // 'sofish'



4. JavaScript 参照型

これがこの記事の難点です。基本型と比較して、参照はプロパティとメソッドを追加できます。参照に似た値は参照であり、参照型の値は変数に割り当てられ、ヒープ メモリに格納されている同じ値を指します。変数 (プロパティ) はオーバーロードできますが、コピーは非常に興味深いものになる可能性があります。これについては後ほど詳しく説明します。

1. プロパティとメソッドを追加します

次のコードでは、基本的に同様の値を割り当てた場合、エラーは報告されませんが、取得時には無効になることがわかります:

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

var arr = [1,2,3];
arr.hello = 'world';
コンソール .log(arr.hello); // '世界'

var str = 'sofish';
str.hello = 'world';
console.log(str.hello); // 未定義

2. 参照型の値に対する操作

参照型は参照としてスタック メモリに格納されるため、同じ元の値を指す場合、値に対する操作はすべての参照に影響します。ここでは再割り当ての例を示します (値の操作ではありません)。直接操作) は、元の値を変更せずにオブジェクトを再作成します。例:

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

var arr = [1, 2,3] , sofish = arr;
sofish.push('hello world');
console.log(arr) // [1, 2, 3, 'hello world']

// 非同一型
sofish = ['not a Fish']; // sofish も同様に変更すると、元の値は変更されません
console.log(arr); // [ 1、2、3、「ハローワールド」]

3. 参照型の値をコピーする

元の値に対する操作はすべての参照に影響しますが、操作中に他の参照に影響を与えずに新しいオブジェクトをコピーする必要がある場合があります。一般に、Date/Function/RegExp... などの特定の操作はほとんどなく、主に項目やプロパティを配列やオブジェクトに追加するような操作です。したがって、理解する必要がある主なことは、Array オブジェクトと Object オブジェクトをコピーする方法です。


3.1 配列のコピー

Array オブジェクトには、インターセプトされた配列を返すスライスメソッドがあり、ES5 ではフィルターなども新しい配列を返すので、このメソッドを使用してコピーできます。

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

var arr = [1, 2, 3 ];
var sofish = arr.slice();

// 新しい配列の操作は元の配列には影響しません
sofish.push('hello world');
console.log(arr) // [1, 2, 3]


3.2 オブジェクトのコピー 配列をコピーするにはスライスメソッドを使用します。実際、配列とオブジェクトの両方で、for ... in ループを使用して、コピーする値を走査して割り当てることができます。


コードをコピー コードは次のとおりです:
var obj = { name: 'sofish' }, sofish = {}, p;
for (p in obj) sofish[p] = obj[p];
//新しいオブジェクトに対する操作は元の値には影響しません

sofish.say = function() {};
console.log(obj); // { name: 'sofish' }

3.3 シャドウ/ディープコピー

上記のような操作は、私たちがよくシャロー コピー (シャドウ コピー) と呼ぶものです。ただし、Array と Object は両方とも複数のレイヤー (ディメンション) を持つことができます。このようなコピーでは、可能な値のうち最上位のレイヤーの値のみが考慮されますが、Array と Object は依然として元のオブジェクトを指します。例:


コードをコピー コードは次のとおりです:
var arr = [1, { bio: '魚ではありません' } ], sofish = [], p;
for(p in arr) {
sofish[p] = arr[p];
}
// `sofish` に含まれるオブジェクト `cat` に対する操作は元の値に影響します

sofish[1].bio = 'hackable';
console.log(arr);// [1 、猫: { bio: 'hackable' } ]

それではどうすればよいでしょうか?この問題を解決するには、copy() 関数を使用してみましょう:

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

/* コピーオブジェクト
* @param: obj {JavaScript Object} 元のオブジェクト
* @param: isDeep {Boolean} ディープコピーかどうか
* @return: {JavaScript Object} 新しいオブジェクトを返します
*/
function copy(obj, isDeep) {
var ret = obj.slice ? [] : {}, p, prop;
// is で使用しますfunction
if(!isDeep && is(obj, 'Array')) return obj.slice();
for(p in obj) {
if(!obj.hasOwnProperty(p)) continue;
prop = obj[p];
ret[p] = (is(prop, 'Object') || is(prop, 'Array'))
copy(prop, isDeep) : prop ;
}
return ret;
}

このようにして、copy(obj, isDeep) 関数を通じて配列またはオブジェクトをコピーできます。テストできます:
コードをコピー コードは次のとおりです:

var arr = [ 1, {bio : '魚ではありません'}];
var sofish = copy(arr);

// 最初のレイヤーの浅いコピー操作は元の値に影響しませんが、2 番目のレイヤーに影響します
sofish.push('cat'); // [ 1, {bio: 'not a Fish'}]
sofish[1].bio = 'hello world';
console.log(arr) // [1, {bio: 'hello world'}]

// ディープコピーは元の値に影響しません

sofish = copy(arr, 1);
sofish[1].bio = 'foo or bar';
console.log(arr) ; // [1, {bio: 'hello world'}]

それだけです。基本的に、理解する必要がある型に関する難しい点はすべて理解する必要があります。もちろん、コピーが最も面倒な点です。操作が必要なことが多い配列やオブジェクトの他に、Date/Function/RegExp のコピーもあります。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

Golang では、ジェネリック関数はポインターと参照型をどのように処理しますか? Golang では、ジェネリック関数はポインターと参照型をどのように処理しますか? Apr 16, 2024 pm 04:06 PM

ジェネリック関数が Go でポインター型を処理する場合、元の変数への参照を受け取り、変数値を変更できるようになります。参照型は渡されるときにコピーされるため、関数は元の変数値を変更できなくなります。実際の例には、汎用関数を使用して文字列または数値のスライスを比較することが含まれます。

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

See all articles