JavaScript のすべてがオブジェクトであるわけではない_基本
多くの言語は「すべてはオブジェクトである」と主張していますが、JavaScript ではすべての値がオブジェクトであるわけではありません。
プリミティブ値 vs オブジェクト
JavaScript の値は、プリミティブ値 (プリミティブ) とオブジェクト (オブジェクト) の 2 つの主要なカテゴリに分類できます。
定義
JavaScript での 2 つの値の定義:
以下の値は元の値です。
1. 文字列
2. 数値: JavaScript のすべての数値は浮動小数点数
3. ブール値
4.null
5.未定義
その他の値はすべてオブジェクトです。 オブジェクトはさらに分割できます:
1. 元の値のラッパー: ブール値、数値、文字列。直接使用されることはほとんどありません。
2. リテラルで作成されたオブジェクト。 次のリテラルはオブジェクトを生成します。オブジェクトはコンストラクターを通じて作成することもできます。リテラルを使用してオブジェクトを作成できます。
•[] は新しい Array()
•{} は新しい Object()
•function() {} は新しい Function()
•/s*/ は新しい RegExp("\ s*")
3. 日付: new Date("2011-12-24")
相違点
列挙されたプリミティブと非プリミティブを介してプリミティブとオブジェクトを定義できます。 ただし、プリミティブとオブジェクトが何であるかを説明することもできます。 オブジェクトから始めましょう。
1. オブジェクトは変更可能です:
> var obj = {};
> ; obj.foo = 123; // 属性と値を追加
123
> // 属性を読み取り、属性値を返します
123
2. 各オブジェクトには独自の一意の識別子があるため、リテラルまたはコンストラクターを通じて作成されたオブジェクトは他のオブジェクトと等価ではなく、=== を通じて比較できます。
>
false
オブジェクトは参照によって比較され、同じ識別子を持つ 2 つのオブジェクトのみが等しいとみなされます。
> var obj = {};
> ; obj === obj
true
3. 変数はオブジェクトへの参照を保存するため、2 つの変数が同じオブジェクトに適用される場合、変数の 1 つを変更すると、両方の変数も変更されます。
> var var1 = {};
> ; var var2 = var1;
> var1.foo = 123; // 変数 val1 のプロパティを変更します
123
> var2.foo // val2 も変更します
123
1. プリミティブ値は不変です。属性を追加することはできません。
> str.foo = 123; // 属性を追加します (この操作は無視されます)
123
> str.foo // 属性の値を読み取り、未定義
を返します🎜>
」
这意味着,一个原始值的标识就是它的值,javascript 引擎没有为原始值分配唯一标识。
最后两个事实结合起来的意思是:我们无法区分一个变量到底是对象的引用,还是原始值的副本。
陷阱:原始值和它们的包装类型
规则:忽略尽可能多的包装类型。 在其他编程语言如Java,你很少会注意到他们。
原始值类型 boolean, number 以及 string 都有自己对应的包装类型 Boolean, Number 和 String。 包装类型的实例都是对象值,两种类型之间的转换也很简单:
•转换为包装类型:new String("abc")
•转换为原始类型:new String("abc").valueOf()
原始值类型以及它们相应的包装器类型有很多不同点,例如:
> typeof "abc"
'string'
> typeof new String("abc")
'object'
> "abc" instanceof String
false
> new String("abc") instanceof String
true
> "abc" === new String("abc")
false
包装类型的实例是一个对象,因此和 JavaScript 和对象一样,包装类型也无法进行值的比较(只能比较引用)。
> var a = new String("abc");
> var b = new String("abc");
> a == b
false // 虽然 a 和 b 有相同的内容,但是依然返回 false
> a == a
true
原始值没有自己的方法
包装对象类型很少被直接使用,但它们的原型对象定义了许多其对应的原始值也可以调用的方法。 例如,String.prototype 是包装类型 String 的原型对象。 它的所有方法都可以使用在字符串原始值上。 包装类型的方法 String.prototype.indexOf 在 字符串原始值上也有,它们并不是两个拥有相同名称的方法,而的的确确就是同一个方法:
> "abc".charAt === String.prototype.charAt
true
在数字的包装类型 Number 的原型对象有 toFixed 方法,即 Number.prototype.toFixed,但是当我们写如下代码时却发生错误:
> 5.toFixed(3)
SyntaxError: Unexpected token ILLEGAL
此错误是解析错误(SyntaxError),5 后面跟着一个点号(.),这个点被当作了小数点,而小数点后面应该是一个数,以下代码可以正常运行:
> (5).toFixed(3)
"5.000"
> 5..toFixed(3)
"5.000"
值的分类:typeof 和 instanceof
如果你想要对值进行分类,你需要注意原始值和对象之间的区别。 typeof 运算可以用来区分原始值和对象。instanceof 可以用来区分对象,而且,instanceof 对于所有的原始值都返回 false。
typeof
typeof 可以用来判断原始值的类型,以及区分对象值和原始值:
> typeof "abc"
'string'
> typeof 123
'number'
> typeof {}
'object'
> typeof []
'object'
typeof 返回以下字符串:
参数 | 结果 |
---|---|
undefined | "undefined" |
null | "object" |
布尔值 | "boolean" |
数字 | "number" |
字符串 | "string" |
函数 | "function" |
其他 | "object" |
注:
•typeof は null を操作すると「object」を返しますが、これは JavaScript 言語自体のバグです。残念ながら、既存のコードの多くがすでにこの動作に依存しているため、このバグは修正されることはありません。これは、null が実際にオブジェクトであることを意味するものではありません[4]。
•typeof を使用すると、例外をスローせずに変数が宣言されているかどうかを確認することもできます。 宣言されていない変数を関数のパラメーターに渡すことはできないため、これを行う関数はありません。
> typeof undeclaredVariable
' '
> undeclaredVariable
参照エラー: undeclaredVariable が定義されていません
• 関数もオブジェクト型です。これは多くの人には理解されないかもしれませんが、場合によっては非常に便利です。
•配列はオブジェクトです。
typeof [5] および [6] の詳細。
instanceof
instanceof は、値がコンストラクターのインスタンスであるかどうかを検出できます:
コンストラクターの値インスタンス
上記の式が true を返す場合、値が Constructor のインスタンスであることを意味します。これは以下と同等です:
Constructor.prototype.isPrototypeOf(value)
プロトタイプチェーンの最後は Object.prototype であるため、ほとんどのオブジェクトは Object のインスタンスです。 プリミティブ値はオブジェクトのインスタンスではありません:
> >false
> "abc" 文字列のインスタンス
false

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

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