JavaScriptの秘密の花園

6425 ワード

1、対象:
JSのすべての変数は対象です.2つの例外nullとundefinedを除いて.
一つのよくある誤解は数字の額面が対象ではないということです.これはJavaScript解析器のエラーのためで、点演算子を浮動小数点の数字面の一部として解析しようとしています.
ex:2.toStering()   //synaxError なぜならば.浮動小数点の点だと思います.
変換方法:
2..toString(); //            
2 .toString(); //          
(2).toString(); // 2    
オブジェクトの属性にアクセスできる2つの方法があります.
var s={name:「h」}
s.nameとs[name]はいずれもアクセスできます.
ただし、中かっこはダイナミックなアクセスに使えます.属性名にはスペースが含まれています.属性名はJSキーワードなどです.
属性を削除する唯一の方法はdeleteを使用して、属性をNullまたはundefinedに設定することです.本当に属性を削除することはできません.属性と値の関連を削除しただけです.
2、Javascriptプロトタイプチェーン:
function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

//   Bar prototype   Foo     
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

//   Bar.prototype.constructor Bar  
Bar.prototype.constructor = Bar;

var test = new Bar() //   Bar      

//    
test [Bar   ]
    Bar.prototype [Foo   ] 
        { foo: 'Hello World' }
        Foo.prototype
            {method: ...};
            Object.prototype
                {toString: ... /* etc. */};
上記の例では、
test オブジェクト 
Bar.prototype 和 
Foo.prototype 受け継ぐしたがって、アクセスできます. 
Foo の原型方法 
method同時に訪問することもできます.
それは原型に定義されています. 
Foo インスタンスのプロパティ 
value注意したいのは 
new Bar() 
新しいものは作れません. 
Foo 実例ではなく、その原型の例を繰り返し使用する.したがって、すべての 
Bar インスタンスは共有されます
同じです 
value を選択します
オブジェクトの属性を検索すると、JavaScriptは、指定された名前の属性が見つかるまでプロトタイプチェーンを上に巡回します.
プロトタイプチェーンの上端に属性があると、検索時間に悪影響を及ぼす.特に、存在しない属性を取得しようとすると、プロトタイプチェーン全体を巡回します.
そして、使うときは for in オブジェクトの属性を巡回すると、プロトタイプチェーン上のすべての属性がアクセスされます.
だから:
複雑なJavaScriptの応用を書く前に、原型チェーン継承の仕事方式を十分に理解するのはJavaScriptプログラマにとって必須の課題です.プロトタイプチェーンの長さがもたらす性能問題に注意し、プロトタイプチェーンの短縮によって性能が向上する方法を知る.さらに、新たなJavaScriptエンジンとの互換性がない限り、内蔵タイプのプロトタイプを拡張してはいけません.
for inサイクル
和 in 操作子は同じで、for inです. オブジェクトの属性を検索するときも、プロトタイプチェーン上のすべての属性を巡回します.
//    Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
for(var i in foo) {
    console.log(i); //       :bar   moo
}
hasownprotype:
// foo        
for(var i in foo) {
    if (foo.hasOwnProperty(i)) {
        console.log(i);
    }
}
関数の宣言と表現:
関数はJavaScriptの中の1等のオブジェクトです.これは関数を他の値のように伝えることができるという意味です.一般的な使用法は、非同期関数に匿名関数をフィードバック関数として伝達することである.
var s=function(){}
上記の表現の意味は、匿名関数を変数sに割り当てます.
foo; // 'undefined'
foo(); //   :TypeError
var foo = function() {};
によって var 宣言文を定義し、変数に対して foo の解析はコード実行前ですので、foo 変数はコード実行時に定義されています.
ただし、赋値文は実行時にのみ実行されますので、該当コードが実行される前に、 foo の値が不足しています undefined
特別な書き方もあります.ネーミング関数に変数を割り当てます.
デモ:
var foo = function bar() {
    bar(); //     
}
bar(); //   :ReferenceError
Thisの作業原理:
Javascriptには他の言語とは全く違ったthis処理システムがあります.五種類の場合、thisの指向は違っています.
1、グローバルオブジェクト:全体の範囲でthisを使用すると、グローバルオブジェクトを指します.
2、関数呼び出し:thisもグローバルオブジェクトを指します.
3、方法コール:thisは呼び出し先を指します.
デモ:
test.foo(); //this  test
4、コンストラクタを呼び出します.
new f();
         new        ,              。      ,this         。
5、表示の設定this:
function foo(a, b, c) {}

var bar = {};
foo.apply(bar, [1, 2, 3]); //        ,    
foo.call(bar, 1, 2, 3); //    foo    :a = 1, b = 2, c = 3
使用する Funtion.prototype 上の コール または appy メソッドの場合、関数内の thisは 関数呼び出しの最初のパラメータとして明示的に設定します.
したがって、関数呼び出しのルールは上記の例では適用されなくなりました. 関数内 this barに設定されました.
クローズドはJavaScriptの非常に重要な特性であり、これは現在のスコープが常に外部作用領域の変数にアクセスできることを意味する.何故なら 関数 JavaScriptの中で唯一自分の役割領域を持つ構造であり、したがって、クローズドの作成は関数に依存します.
function Counter(start) {
    var count = start;
    return {
        increment: function() {
            count++;
        },

        get: function() {
            return count;
        }
    }
}

var foo = Counter(4);
foo.increment();
foo.get(); // 5
ループ中のクローズド
一般的なエラーはループにおいてクローズドされています.ループ番号を呼び出す必要があると仮定します.
上のコードは数字を出力しません. 0 はい、 9ではなく、数字を出力します. 10 十回です
質に入れる consolie.log 呼び出された場合、匿名関数は外部変数に対して保持されます. i の参照は、この時点でforループが終了しました. i の値が修正されました. 10.
所望の結果を得るためには、ループごとに変数を作成する必要があります. i のコピーです
循環番号を正しく取得するためには、使用したほうがいいです. 匿名の小包器です.
for(var i = 0; i < 10; i++) {
    (function(e) {
        setTimeout(function() {
            console.log(e);  
        }, 1000);
    })(i);
}
JavaScriptの構造関数と他の言語の構造関数は違っています.通過する new キーワード方式で呼び出された関数はすべて構造関数として考えられています.
コンストラクタの内部で-つまり呼び出された関数の中で- this 新規作成のオブジェクトを指します. Objectこの新しく作成したオブジェクトの プロトタイプ コンストラクタに向けられた prototype
名前空間
グローバルスコープのみに起因する共通のエラーは命名衝突である.JavaScriptでは、これが通過できます. 匿名の包装器 気軽に解決する
(function() {
    //           

    window.foo = function() {
        //        ,     
    };

})(); //          
匿名関数は 式;したがって、呼び出し可能性のために、それらは最初に実行される.
( //             
function() {}
) //         
() //          ,       
結論
匿名の包装器を使って名前空間を作ることをオススメします.このように命名の衝突を防止するだけではなく、プログラムのモジュール化にも有利です.
また、グローバル変数を使うのは悪い習慣と考えられています.このようなコードは、エラーが発生し、高いメンテナンスコストをもたらす傾向があります.
JavaScriptでは配列が対象ですが、良い理由がありません. for in ループ 行列を巡回します逆に、いい理由があります.使わないです. for in 行列を巡回します
注意: JavaScriptの配列は関連配列ではありません.JavaScriptの中には対象だけあります. キーの対応関係を管理します.ただし、関連配列は順序を保持し、対象はそうではない.
によって for in プロトタイプチェーン上のすべての属性を列挙します.これらの属性をフィルタリングする唯一の方法は使用です. ハスOwnProperty 関数がありますので、普通の for サイクルが何倍も遅くなります.
巡回する
エルゴード配列の最適な性能を達成するためには、古典的な for ループ
配列のlength属性
length 属性の getter 方式は単純に行列の長さを返します. setter 方式は配列を切断します.
var arr = [1, 2, 3, 4, 5, 6];
arr.length = 3;
console.log(arr);

arr.length = 6;
console.log(arr);
[1, 2, 3, unique: function each: 機能
[1, 2, 3, unique: function each: 機能
アール
[1,2,3,undefined]× 3)
によって Aray のコンストラクタはパラメータをどう扱うかがあいまいなので、配列の字面文法を推奨します. [] - を選択します
[1, 2, 3]; //   : [1, 2, 3]
new Array(1, 2, 3); //   : [1, 2, 3]

[3]; //   : [3]
new Array(3); //   : [] 
new Array('3') //   : ['3']

//    :              
new Array(3, 4, 5); //   : [3, 4, 5] 
new Array(3) //   : [],       3
JSは弱い言語ですので、=比較を行う時には
両方の操作子を比較して、自動的にタイプ変換を行います.
set Timeoutは一回だけ呼び出します.set IntervalはX秒ごとに呼び出します.
clearTimeoutはタイマーをクリアできます.
セットメニューを設定するときは、匿名関数に入ることをお勧めします.
文字列は絶対に使わないでください. set Timeout または set Interval このように書かれたコードは明らかに品質が悪いです.パラメータをコールバック関数に渡す必要がある場合、匿名関数を作成して、関数内で実際のコールバック関数を実行します.
また、使用は避けるべきです. set Intervalは、そのタイミングがJavaScriptによってブロックされないからです.