ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 解析における理解しにくい 11 の問題_javascript のヒント

JavaScript 解析における理解しにくい 11 の問題_javascript のヒント

WBOY
WBOYオリジナル
2016-05-16 17:10:161246ブラウズ

1. 元の値と基準値

元の値はスタックに保存され、参照値はヒープに保存されます。たとえば、次のプログラム:

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

function Person(id,name,age){
this.id = id;
this.name = name;
this.age = 年齢;
}

var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b ','c'];
var person = new person(100,"バカの座右の銘",25);

2.未定義および null

未定義: 変数は未定義です。

の排他的な値です。

null: 参照は割り当てられていません。これは Null 型の排他的な値です。

typeof(未定義)== 未定義;
typeof(null) == オブジェクト;
未定義==null;
未定義!==null;
null オブジェクトのインスタンス == false;
未定義のオブジェクトのインスタンス == false;

未定義型と Null 型がありますが、次の例は、これら 2 つの型が非表示であること、つまりそれらの値のみを使用できることを示しています。

alert(未定義の未定義インスタンス);

alert(Null の null インスタンス);

3. 擬似配列

特徴:

1) 長さ属性があります。
2) 配列のようにインデックス順にデータにアクセスします。

3) プッシュ、ポップ、スライスなどの配列固有のデータ操作メソッドはありません。

擬似配列は Array.prototype.slice:

を通じて実際の配列に変換できます。

var faceArray = {0: 'a', 1: 'b', length: 2}//標準の疑似配列;

var realArray = Array.prototype.slice.call(fakeArray);

JS の疑似配列: argument、node.childNodes、document.getElementsByTagName()...

IEの問題: IEのnode.childNodesをスライスで変換できません。

Jquery の擬似配列: Jquery 自体は擬似配列です:

alert($('.class1').length); alert($('.class1').[0].tagName);

4. 単純型リテラルについて

var a = 1; b = true、c = "ccc"; リテラルには型があるようです

alert(typeof a);//number

alert(typeof b);//boolean

alert(typeof c);//string

ただし、instanceof
では測定できません
alert(数値のインスタンス)//false

アラート(オブジェクトのインスタンス)//false

アラート(ブール値のインスタンス)//false

アラート(オブジェクトのインスタンス)//false

alert(c インスタンスオブ String)//false
alert(c オブジェクト インスタンス)//false


5. 関数のプロトタイプ属性とオブジェクト インスタンスの内部プロトタイプ属性

各関数 (コンストラクター) にはプロトタイプ属性があり、各オブジェクト インスタンスには、コンストラクターのプロトタイプ属性を指す、目に見えない (mozilla が公開し、__proto__ を通じて取得できる) 内部プロトタイプ属性があります。プロトタイプ チェーンを構成する独自のプロトタイプ属性。オブジェクトが最上位のオブジェクトであるため、すべてのプロトタイプ チェーンは最終的に Object.prototype をポイントします。アクセスできない場合は、オブジェクト インスタンス自体から検索を開始します。見つかった場合は、Object.prototype.prototype == null になるまでプロトタイプ チェーンに沿って上向きに検索します。

6. コンストラクターのちょっとした秘密


コードをコピーします

コードは次のとおりです。 var s = new function(){return "sss"};alert(s);//[object Object]
s = new function(){return new String ("sss" )};
alert(s);//sss


このコードの説明:

new 式の後のコンストラクターが参照オブジェクト (配列、オブジェクト、関数など) を返す (return) 限り、new によって作成された匿名オブジェクトが上書きされます (プリミティブ型を返す) (戻り値がない場合、実際には元の型が定義されていません)、new によって作成された匿名オブジェクトが返されます。

7. オブジェクト作成のプロセス



コードをコピー

コードは次のとおりです。 :function person(name){ this.name = name; }
person.prototype = {
getName: function(){return this.name }
};

var p = 新しい人('zhangsan');


p の作成プロセスを復号化します:

◦組み込みオブジェクト object obj を作成し、初期化します。

◦ p の内部 [[Prototype]] を Person.prototype;

にポイントします。

◦ p をこのように使用し、引数パラメーターを使用して Person の内部 [[Call]] メソッドを呼び出します。つまり、 Person 関数本体を実行して戻り値が返されない場合は、未定義が返されます。 🎜>

◦前のステップでオブジェクト型が返された場合は、この値を p に返し、そうでない場合は、obj を返します。

8. オブジェクトの所有プロパティと継承プロパティ


コードをコピーします コードは次のとおりです。 🎜 >function person(name){
this.name = name;
}
person.prototype = {
type: 'human',
getName: function ( ){return this.name}
};
var p = new Person('zhangsan');
alert(p.hasOwnProperty('type'));//false
p. type = 'ren';
alert(p.hasOwnProperty('type'));//true


実行結果は非常に明確で、オブジェクトのプロパティはオブジェクトのプロパティを変更できません。プロトタイプ内で同じ名前を使用すると、同じ名前のプロパティ自体が作成され、それに値が割り当てられるだけです。

9. 関数オブジェクトの作成処理

組み込みオブジェクト fn を作成します;

fn の内部 [[Prototype]] を Function.prototype に設定します;

内部 [[Call]] 属性を設定します。これは、関数呼び出しのロジックを処理する内部実装メソッドです。 (関数本体を指すと単純に理解されます);

関数にパラメータがない場合は、fn.length を funArgs.length に設定します。

fn.prototype のコンストラクターは fn 自体を指します。

fn に戻ります

10.instanceof

の原則 a が B のインスタンスであるかどうかを確認するには、B のプロトタイプ (コンストラクターの prototype 属性) が指すオブジェクトが a のプロトタイプ チェーン上にあるかどうかを確認する必要があります。

11. 関数とオブジェクトについての推測

alert(FunctioninstanceofFunction);//truealert(FunctioninstanceofObject);//true

alert(ObjectinstanceofFunction);//true

alert(ObjectinstanceofObject);/ /true

長い間考えてきたけど、まだよく考えていない...

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