javascriptの間違いやすい知識点の実例と結び目
3816 ワード
本論文の実例はjavascriptの間違いやすい知識点をまとめたものである。皆さんに参考にしてあげます。具体的には以下の通りです。
なぜtypeof null=='object'
原理はこのように、異なる対象は下の層ではバイナリと表示されていますが、JavaScriptではバイナリの上位3桁が0であるとobjectタイプと判断されます。nullのバイナリは全0で、自然の上位3桁も0ですので、typeofを実行すると「object」に戻ります。
オブジェクト属性の存在性
myObject.aの属性アクセスの戻り値はundefinedかもしれないが、この値は属性に格納されているundefinedであり、属性が存在しないためundefinedに戻るかもしれない。この二つの状況はどうやって区別しますか?
参考コード:
Object.creat(.)は暇を見つけて新しいオブジェクトを作成し、新しいオブジェクトの内部にある[Prottype]をあなたが指定したオブジェクトに関連付けることができます。
Bar.prototype=Foo.prototypeは、Bar.prototypeに関連する新しいオブジェクトを作成しません。Bar.prototypeに直接Foo.prototypeオブジェクトを参照させるだけです。したがって、Bar.prototype.myLabel=...のような割当文を実行すると、Foo.prototypeオブジェクト自体が直接修正されます。
Bar.prototype=new Fooは確かにBar.prototypeに関連する新しいオブジェクトを作成します。しかし、Foo(..)の「構造関数呼び出し」を使用しており、関数のFooにはいくつかの副作用(例えば、日記を書いたり、状態を修正したり、他のオブジェクトに登録したり、thisにデータ属性を追加したりするなど)があると、Bar()の「後裔」に影響を与え、結果は考えられなくなります。
結論
したがって、適切な関連オブジェクトを作成するには、副作用のあるFoo(.)を使用するのではなくObject.creat(.)を使用しなければなりません。このようにする唯一の欠点は、新しいオブジェクトを作成し、古いオブジェクトを捨てて、既存のデフォルトのオブジェクトを直接に変更することができないことです。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
JavaScriptに関するものについてもっと興味がある読者は、当駅のテーマを調べてもいいです。「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptは値の操作の技巧を伝えて総括します。」、「javascriptコード操作技術のまとめ」、「JavaScriptのJson操作技術のまとめ」、「JavaScript切替特効とテクニックのまとめ」、「JavaScript検索アルゴリズムのテクニックのまとめ」、「JavaScriptアニメーションの特効と技巧のまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」、「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。
なぜtypeof null=='object'
原理はこのように、異なる対象は下の層ではバイナリと表示されていますが、JavaScriptではバイナリの上位3桁が0であるとobjectタイプと判断されます。nullのバイナリは全0で、自然の上位3桁も0ですので、typeofを実行すると「object」に戻ります。
オブジェクト属性の存在性
myObject.aの属性アクセスの戻り値はundefinedかもしれないが、この値は属性に格納されているundefinedであり、属性が存在しないためundefinedに戻るかもしれない。この二つの状況はどうやって区別しますか?
var myObject = {
a:2
};
//
("a" in myObject); // true
("b" in myObject); // false
//
myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false
//
Object.prototype.hasOwnProperty.call(myObject, 'b')
オブジェクト継承の3つの方法参考コード:
function Foo(name) {
this.name = name;
}
Foo.prototype.myName = function() {
console.log(this.name)
}
function Bar(name, label) {
Foo.call(this, name);
this.label = label;
}
// 1
Bar.prototype = Object.create(Foo.prototype)
// 2
Bar.prototype = Foo.prototype;
// 3
Bar.prototype = new Foo();
//Bar.prototype.constructor = Bar;
Bar.prototype.sayName = function() {
console.log(this.name)
}
var b = new Foo('fayin')
b.sayName()
上記の例では、3つの方法はすべてBarにFoo.prototype上の方法を継承させることができますが、それらの間にはまた微妙な違いがあります。Object.creat(.)は暇を見つけて新しいオブジェクトを作成し、新しいオブジェクトの内部にある[Prottype]をあなたが指定したオブジェクトに関連付けることができます。
Bar.prototype=Foo.prototypeは、Bar.prototypeに関連する新しいオブジェクトを作成しません。Bar.prototypeに直接Foo.prototypeオブジェクトを参照させるだけです。したがって、Bar.prototype.myLabel=...のような割当文を実行すると、Foo.prototypeオブジェクト自体が直接修正されます。
Bar.prototype=new Fooは確かにBar.prototypeに関連する新しいオブジェクトを作成します。しかし、Foo(..)の「構造関数呼び出し」を使用しており、関数のFooにはいくつかの副作用(例えば、日記を書いたり、状態を修正したり、他のオブジェクトに登録したり、thisにデータ属性を追加したりするなど)があると、Bar()の「後裔」に影響を与え、結果は考えられなくなります。
結論
したがって、適切な関連オブジェクトを作成するには、副作用のあるFoo(.)を使用するのではなくObject.creat(.)を使用しなければなりません。このようにする唯一の欠点は、新しいオブジェクトを作成し、古いオブジェクトを捨てて、既存のデフォルトのオブジェクトを直接に変更することができないことです。
興味のある友達はオンラインHTML/CSS/JavaScriptコードを使ってツールを実行できます。http://tools.jb51.net/code/HtmlJsRun上記コードの運行効果をテストします。
JavaScriptに関するものについてもっと興味がある読者は、当駅のテーマを調べてもいいです。「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptは値の操作の技巧を伝えて総括します。」、「javascriptコード操作技術のまとめ」、「JavaScriptのJson操作技術のまとめ」、「JavaScript切替特効とテクニックのまとめ」、「JavaScript検索アルゴリズムのテクニックのまとめ」、「JavaScriptアニメーションの特効と技巧のまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」、「JavaScriptはアルゴリズムと技術の総括を遍歴します。」、「JavaScript数学演算の使い方のまとめ」
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。