JavaScript の重要な知識ポイントのまとめ 2
この記事では主にオブジェクト指向 JavaScript の本質を紹介します。必要な方は参考にしてください。
データ型
JavaScript では、データ型は 2 つのカテゴリに分類されます:
プリミティブ型
true、5 などの単純なデータ。 JavaScript には 5 つのプリミティブ型があります:
boolean: ブール値、値は true または false
number: 数値、値は任意の整数または浮動小数点値です
string: 文字列、値は単一引用符で囲まれた単一の値です。二重引用符 文字または連続した文字 (JavaScript は文字の種類を区別しません)
null: 値が 1 つだけある空の型: nullll
未定義: 値が 1 つだけある未定義: unknown
var name = "Pomy"; var blog = "http://www.ido321.com"; var age = 22; alert(typeof blog); //"string" alert(typeof age); //"number"
の値元の型は変数に直接保存され、typeof を使用して検出できます。ただし、typeof による null の検出では、null ではなくオブジェクトが返されます:
//弹出Not null if(typeof null){ alert("Not null"); }else{ alert("null"); }
したがって、null を検出するときは、すべて等しい (===) を使用するのが最善です。これにより、強制的な型変換も回避できます:
console.log("21" === 21); //false console.log("21" == 21); //true console.log(undefined == null); //true console.log(undefined === null); //false
文字列、数値、またはブール値の場合、対応する元のカプセル化タイプ (文字列、数値、およびブール値) に由来する対応するメソッドがあります。元のカプセル化タイプは自動的に作成されます。
var name = "Pomy"; var char = name.charAt(0); console.log(char); //"P"
JavaScript エンジンで起こること:
var name = "Pomy"; var temp = new String(name); var char = temp.charAt(0); temp = null; console.log(char); //"P"
文字列オブジェクトへの参照は使用後すぐに破棄されるため、文字列に属性を追加できず、対応する型を検出すると、instanceof は false を返します。 :
var name = "Pomy"; name.age = 21; console.log(name.age); //undefined console.log(name instanceof String); //false
参照型
はオブジェクトとして保存されますが、これは本質的にメモリ位置への参照であるため、オブジェクトは変数には保存されません。カスタム オブジェクトに加えて、JavaScript は 6 つの組み込み型を提供します:
Array: 配列型、数値でインデックス付けされた一連の値の順序付きリスト
Date: 日付と時刻の型
Error: 実行時エラーの型
Function :関数型
Object: 一般オブジェクト型
RegExp: 正規表現型
new を使用して各オブジェクトをインスタンス化することも、リテラル形式を使用してオブジェクトを作成することもできます:
var obj = new Object; var own = { name:"Pomy", blog:"http://www.ido321.com", "my age":22 }; console.log(own.blog); //访问属性 console.log(own["my age"]); obj = null; //解除引用
obj にはオブジェクト インスタンスが含まれておらず、ポインター (または参照)、メモリ内の実際のオブジェクトの場所への参照。 typeof は関数以外のすべての参照型に対してオブジェクトを返すため、参照型を検出するには instanceof を使用する必要があります。
関数
JavaScript では、関数はオブジェクトです。関数を他のオブジェクトと区別する決定的なプロパティは、[[Call]] と呼ばれる内部プロパティの存在です。内部プロパティにはコードからアクセスできませんが、コード実行時の動作を定義します。
フォームを作成する
1. 関数の宣言: function キーワードを使用すると、コンテキストに昇格されます
2. 関数の式: 昇格できません
3. 関数の組み込み型をインスタンス化します
JavaScript 関数のもう 1 つのユニークな特徴は、任意の数のパラメーターを関数に渡すことができることです。関数のパラメーターは、関数内に自動的に存在する引数クラスの配列オブジェクトに格納されます。パラメーターは数値インデックスによって参照できますが、配列インスタンスではありません。 alert(Array.isArray(arguments));
配列クラスオブジェクトの引数には関数の実パラメータが格納されますが、仮パラメータは無視されません。したがって、arguments.length は実際のパラメータ リストの長さを返し、arguments.callee.length は仮パラメータ リストの長さを返します。
sayHi(); //函数提升 function sayHi(){ console.log("Hello"); } //其他等效等效方式 /* var sayHi = function(){ console.log("Hello"); } var sayHi = new Function(" console.log(\"Hello\");"); */
関数内のthis
これに関する質問については、この記事を参照してください: this in JavaScript.JavaScript には、このポインターを変更するための 3 つのメソッド (call、apply、bind) が用意されています。 3 つの関数の最初のパラメーターはすべて this の値を指定し、他のパラメーターはパラメーターとして関数に渡されます。
オブジェクト
オブジェクトは参照型です。オブジェクトを作成するには、オブジェクト コンストラクターとオブジェクト リテラル形式の 2 つの方法があります。function ref(value){ return value; } console.log(ref("Hi")); console.log(ref("Hi",22)); console.log(ref.length); //1
プロパティ操作
JavaScript では、どの方法でも実行できます。 time オブジェクトに属性を追加します:var per1 = { name:"Pomy", blog:"http://www.ido321.com" }; var per2 = new Object; per2.name = "不写代码的码农";
per1.age = 0; per1.sayName = function(){ alert(this.name); //"Pomy" }
//结果是false if(per1.age){ alert(true) }else{ alert(false); }
console.log("age" in per1); //true console.log(per1.hasOwnProperty("age")); //true console.log("toString" in per1); //true console.log(per1.hasOwnProperty("toString")); //false
per1.toString = function(){ console.log("per1对象"); }; console.log(per1.hasOwnProperty("toString")); //true per1.toString(); //"per1对象" delete per1.toString; console.log(per1.hasOwnProperty("toString")); //false console.log(per1.toString()); //[object Object]
有时需要枚举对象的可枚举属性,也有两种方式:for-in循环和Object.keys(),前者依旧会遍历出原型属性,后者只返回自有属性。所有可枚举属性的内部属性[[Enumerable]]的值均为true。
var per3 = { name:"Pomy", blog:"http://www.ido321.com", age:22, getAge:function(){ return this.age; } };
实际上,大部分原生属性的[[Enumerable]]的值均为false,即该属性不能枚举。可以通过propertyIsEnumerable()检测属性是否可以枚举:
console.log(per3.propertyIsEnumerable("name")); //true var pros = Object.keys(per3); //返回可枚举属性的名字数组 console.log("length" in pros); //true console.log(pros.propertyIsEnumerable("length")); //false
属性name是自定义的,可枚举;属性length是Array.prototype的内建属性,不可枚举。
属性类型
属性有两种类型:数据属性和访问器属性。二者均具有四个属性特征:
数据属性:[[Enumerable]]、[[Configurable]]、[[Value]]和[[Writable]]
访问器属性:[[Enumerable]]、[[Configurable]]、[[Get]]和[[Set]]
**[[Enumerable]] :**布尔值,属性是否可枚举,自定义属性默认是true。
**[[Configurable]] :**布尔值,属性是否可配置(可修改或可删除),自定义属性默认是true。它是不可逆的,即设置成false后,再设置成true会报错。
**[[Value]]:**保存属性的值。
**[[Writable]]:**布尔值,属性是否可写,所有属性默认可写。
**[[Get]]:**获取属性值。
**[[Set]]:**设置属性值。
ES 5提供了两个方法用于设置这些内部属性:
Object.defineProperty(obj,pro,desc_map) 和 Object.defineProperties(obj,pro_map)。利用这两个方法为per3添加一个属性和创建一个新对象per4:
Object.defineProperty(per3,"sex",{ value:"male", enumerable:false, configurable:false, //属性不能删除和修改,该值也不能被设置成true }); console.log(per3.sex); //'male' console.log(per3.propertyIsEnumerable("sex")); //false delete per3.sex; //不能删除 per3.sex = "female"; //不能修改 console.log(per3.sex); //'male' Object.defineProperty(per3,"sex",{ configurable:true, //报错 }); per4 = {}; Object.defineProperties(per4,{ name:{ value:"dwqs", writable:true }, blog:{ value:"http://blog.92fenxiang.com" }, Name:{ get:function(){ return this.name; }, set:function(value){ this.name = value; }, enumerable:true, configurable:true } }); console.log(per4.name); //dwqs per4.Name = "Pomy"; console.log(per4.Name); //Pomy
需要注意的是,通过这两种方式来定义新属性时,如果不指定特征值,则默认是false,也不能创建同时具有数据特征和访问器特征的属性。可以通过Object.getOwnPropertyDescriptor()方法来获取属性特征的描述,接受两个参数:对象和属性名。若属性存在,则返回属性描述对象。
var desc = Object.getOwnPropertyDescriptor(per4,"name"); console.log(desc.enumerable); //false console.log(desc.configurable); //false console.log(desc.writable); //true
根据属性的属性类型,返回的属性描述对象包含其对应的四个属性特征。
禁止修改对象
对象和属性一样具有指导其行为的内部特征。其中,[[Extensible]]是一个布尔值,指明改对象本身是否可以被修改([[Extensible]]值为true)。创建的对象默认都是可以扩展的,可以随时添加新的属性。
ES5提供了三种方式:
Object.preventExtensions(obj):创建不可扩展的obj对象,可以利用Object.isExtensible(obj)来检测obj是否可以扩展。严格模式下给不扩展对象添加属性会报错,非严格模式下则添加失败。
Object.seal(obj):封印对象,此时obj的属性变成只读,不能添加、改变或删除属性(所有属性都不可配置),其[[Extensible]]值为false,[[Configurable]]值为false。可以利用Object.isSealed(obj)来检测obj是否被封印。
Object.freeze(obj):冻结对象,不能在冻结对象上添加或删除属性,不能改变属性类型,也不能写入任何数据类型。可以利用Object.isFrozen(obj)来检测obj是否被冻结。
注意:冻结对象和封印对象均要在严格模式下使用。
"use strict"; var per5 = { name:"Pomy" }; console.log(Object.isExtensible(per5)); //true console.log(Object.isSealed(per5)); //false console.log(Object.isFrozen(per5)); //false Object.freeze(per5); console.log(Object.isExtensible(per5)); //false console.log(Object.isSealed(per5)); //true console.log(Object.isFrozen(per5)); //true per5.name="dwqs"; console.log(per5.name); //"Pomy" per5.Hi = function(){ console.log("Hi"); }; console.log("Hi" in per5); //false delete per5.name; console.log(per5.name); //"Pomy" var desc = Object.getOwnPropertyDescriptor(per5,"name"); console.log(desc.configurable); //false console.log(desc.writable); //false
注意,禁止修改对象的三个方法只对对象的自有属性有效,对原型对象的属性无效,仍然可以在原型上添加或修改属性。
function Person(name){ this.name = name; } var person1 = new Person("Pomy"); var person2 = new Person("dwqs"); Object.freeze(person1); Person.prototype.Hi = function(){ console.log("Hi"); }; person1.Hi(); //"Hi"; person2.Hi(); //"Hi";
补充:
Object.seal(obj):封印对象,此时obj的属性变成只读,不能添加、改变或删除属性(所有属性都不可配置),其[[Extensible]]值为false,[[Configurable]]值为false。可以利用Object.isSealed(obj)来检测obj是否被封印。
这容易让人歧义,一般说属性,我们都很容易理解为其值。
Object.freeze 冻结对象,不能进行任何属性和属性值的增删改。
Object.seal 封闭对象,和Object.freeze相比,可以修改已存在属性的值。
以上がJavaScript の重要な知識ポイントのまとめ 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホット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 を使用してオンライン音声認識システムを実装する方法を紹介します。

顔の検出および認識テクノロジーは、すでに比較的成熟しており、広く使用されているテクノロジーです。現在、最も広く使用されているインターネット アプリケーション言語は JS ですが、Web フロントエンドでの顔検出と認識の実装には、バックエンドの顔認識と比較して利点と欠点があります。利点としては、ネットワーク インタラクションの削減とリアルタイム認識により、ユーザーの待ち時間が大幅に短縮され、ユーザー エクスペリエンスが向上することが挙げられます。欠点としては、モデル サイズによって制限されるため、精度も制限されることが挙げられます。 js を使用して Web 上に顔検出を実装するにはどうすればよいですか? Web 上で顔認識を実装するには、JavaScript、HTML、CSS、WebRTC など、関連するプログラミング言語とテクノロジに精通している必要があります。同時に、関連するコンピューター ビジョンと人工知能テクノロジーを習得する必要もあります。 Web 側の設計により、次の点に注意してください。

株式分析に必須のツール: PHP および JS でローソク足チャートを描画する手順を学びます。特定のコード例が必要です。インターネットとテクノロジーの急速な発展に伴い、株式取引は多くの投資家にとって重要な方法の 1 つになりました。株価分析は投資家の意思決定の重要な部分であり、ローソク足チャートはテクニカル分析で広く使用されています。 PHP と JS を使用してローソク足チャートを描画する方法を学ぶと、投資家がより適切な意思決定を行うのに役立つ、より直感的な情報が得られます。ローソク足チャートとは、株価をローソク足の形で表示するテクニカルチャートです。株価を示しています

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

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

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

インターネット金融の急速な発展に伴い、株式投資を選択する人がますます増えています。株式取引では、ローソク足チャートは一般的に使用されるテクニカル分析手法であり、株価の変化傾向を示し、投資家がより正確な意思決定を行うのに役立ちます。この記事では、PHP と JS の開発スキルを紹介し、株価ローソク足チャートの描画方法を読者に理解してもらい、具体的なコード例を示します。 1. 株のローソク足チャートを理解する 株のローソク足チャートの描き方を紹介する前に、まずローソク足チャートとは何かを理解する必要があります。ローソク足チャートは日本人が開発した

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