『メンテナンスできるJavaScriptを書く』読書ノート第8章:「空き比較」を避ける
3674 ワード
変数(またはパラメータ)が配列であるかどうかを判断したいのですが、単にこのように書くべきではないです.
5つの元の値:文字列、数字、ブール値、null、undefined.最適な選択は、typeof演算子を使ってタイプを判断することです. typeof文字列==string typeof数字==number typeofブール値==number typeof undefined==「undefined」 2.参照値の検出
元の値以外の値はすべて参照です.内蔵引用タイプ:Object、Aray、Date、Err.
instance of演算子を使って参照値を検出するタイプ:vaue instance of constructor.
例:
一つのブラウザフレーム(frame A)のオブジェクトが別のフレーム(frame B)に入ってくると仮定し、二つのフレームの中でコンストラクタPersonが定義されている.フレームAからのオブジェクトがフレームAのPersonの例である場合、
2.1検出関数
JavaScriptの関数は参照の種類であり、Functionコンストラクタが同様に存在し、各関数はその例である.
n演算子を使用してDOMを検出する方法:
Duglas Crockfordを用いて推奨された「アヒル形弁別」(duck typing)の検出:
ジュリーZaytsevは、優雅な解決策を提供する.
JSONオブジェクトを内蔵するなど、カスタムオブジェクトには使わないでください.この方法は「Object JSON」に戻ります.
ECMAScript 5はAray.isAray()を正式にJavaScriptに導入するので、多くのJavaScriptクラスのライブラリが同様にこの方法を実現しました.
if (items != null) { //
items.sort();
...
}
1.元の値を検出する5つの元の値:文字列、数字、ブール値、null、undefined.最適な選択は、typeof演算子を使ってタイプを判断することです.
元の値以外の値はすべて参照です.内蔵引用タイプ:Object、Aray、Date、Err.
instance of演算子を使って参照値を検出するタイプ:vaue instance of constructor.
例:
//
if (value instanceof Date) {
console.log(value.getFullYear());
}
//
if (value instanceof RegExp) {
if (value.test(anotherValue)){
console.log("Matches");
}
}
// Error
if (value instanceof Error) {
throw value;
}
instance ofは、構造対象のコンストラクタだけでなく、プロトタイプチェーンも検出します.var now = new Date();
console.log(now instanceof Object); // true
console.log(now instanceof Date); // true
instance ofはカスタムタイプを検出する唯一の方法であるが、フレームをまたぐことができないという深刻な制限がある.一つのブラウザフレーム(frame A)のオブジェクトが別のフレーム(frame B)に入ってくると仮定し、二つのフレームの中でコンストラクタPersonが定義されている.フレームAからのオブジェクトがフレームAのPersonの例である場合、
// true
frameAPersonInstance instanceof frameAPerson
// false
frameAPersonInstance instanceof frameBPerson
この制限は内蔵タイプの関数と配列に対しても同様に有効です.この二つのタイプに対しては、基本的にはinstance ofは使われません.2.1検出関数
JavaScriptの関数は参照の種類であり、Functionコンストラクタが同様に存在し、各関数はその例である.
function myFunc() {}
//
console.log(myFunc instanceof Function); // true
typeofを使うと、「function」に戻ります.function myFunc() {}
//
console.log(typeof myFunc === "function"); // true
IE 8および以前のバージョンのIEブラウザでは、typeofを用いてDOMノードの関数を検出し、「function」ではなく「object」に返信する.n演算子を使用してDOMを検出する方法:
// DOM
if ("querySelectorAll" in document) {
images = document.querySelectorAll("img");
}
2.2検出配列Duglas Crockfordを用いて推奨された「アヒル形弁別」(duck typing)の検出:
//
function isArray(value) {
return typeof value.sort === "function";
}
この検出方法は配列が唯一のsort()手法を持つオブジェクトであると仮定する.着信パラメータがsort()メソッドを含む対象であれば、trueに戻ります.ジュリーZaytsevは、優雅な解決策を提供する.
function isArray(value) {
return Object.prototype.toString.call(value) === "[object Array]";
}
この方法はほとんどのJavaScriptクラスに採用されている.JSONオブジェクトを内蔵するなど、カスタムオブジェクトには使わないでください.この方法は「Object JSON」に戻ります.
ECMAScript 5はAray.isAray()を正式にJavaScriptに導入するので、多くのJavaScriptクラスのライブラリが同様にこの方法を実現しました.
function isArray(value) {
if (typeof Array.isArray === "function") {
return Array.isArray(value);
} else {
return Object.prototype.toString.call(value) === "[object Array]";
}
}
3.検出属性// :
if (object[propertyName]) {
//
}
// : null
if (object[propertyName] != null) {
//
}
// : undefined
if (object[propertyName] != undefined) {
//
}
一番いい方法は、in演算子を使うことです.var object = {
count: 0,
related: null
};
//
if ("count" in object) {
//
}
// :
if (object["count"]) {
//
}
//
if ("related" in object) {
//
}
// : null
if (object["related"] != null) {
//
}
hasOwnProperty()法を用いて属性が存在するかどうかを検出するが、IE 8およびより早いバージョンでは、DOMオブジェクトはObjectから継承されていないので、この方法はない.// DOM ,
if (object.hasOwnProperty("related")) {
//
}
// DOM ,
if ("hasOwnProperty" in object && object.hasOwnProperty("related")) {
//
}