変数を渡したライブラリ関数のユーザーに正しい型ではないことを伝える最良の方法は何ですか
-
08-07-2019 - |
質問
現在、javascript関数ライブラリを作成しています。主に私自身の使用のためですが、プロジェクトで他の誰かがそれを使用しているかどうかはわかりませんが、少なくともそれが起こる可能性があるように作成しています。
ほとんどのメソッドは、渡される変数が正しいデータ型である場合にのみ機能します。ここで私の質問は次のとおりです。変数が正しい型ではないことをユーザーに警告する最良の方法は何ですか?このようなエラーをスローする必要がありますか?
function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
if(typeof(thisShouldBeAString) === 'string') {
throw('foo(var), var should be of type string');
}
#yadayada
}
javascriptが内部型変換を行うことは知っていますが、これは非常に奇妙な結果(つまり、 '234' + 5 = '2345'でも '234' * 1 = 234)になり、私のメソッドが非常に奇妙なことをする可能性があります。
編集
物事を明確にするために、型変換を行いたくないので、渡される変数は正しい型でなければなりません。ライブラリのユーザーに、渡された変数が正しい型ではないことを伝える最良の方法は何ですか?
解決
型チェックに関するいくつかの小さなコメント-実際にはそれほど複雑ではありません:
プリミティブをチェックするには typeof
を使用し、特定のオブジェクトタイプをチェックするには instanceof
を使用します。
例:で文字列を確認する
typeof x === 'string'
または
typeof x === 'string' || x instanceof String
文字列オブジェクトを含める場合。
配列をチェックするには、単に
を使用しますx instanceof Array
これはかなりうまく機能するはずです(いくつかの既知の例外があります。たとえば、Firefox 3.0.5には window.of_ofto__instanceofObject ==の
)。 window instanceof Object === false
というバグがあります。 = true
編集:関数オブジェクトの検出には、さらにいくつかの問題があります:
原則として、 typeof func === 'function'
と func instanceof Function
の両方を使用できます。
キャッチは、大企業の名前のないブラウザでは、これらのチェックがいくつかの定義済み関数に対して誤った結果を返すことです(それらのタイプは 'object'
として与えられます)。これの回避策はありません-チェックはユーザー定義関数でのみ確実に動作します...
edit2:他のウィンドウ/フレームから渡されたオブジェクトは、異なるグローバルオブジェクトから継承するため、問題があります。つまり、 instanceof
は失敗します。組み込みオブジェクトの回避策が存在します:たとえば、 Object.prototype.toString.call(x)=== '[object Array]'
で配列を確認できます。
他のヒント
型チェックの問題は、実際には非常に難しいことです。例:-
var s = new String("Hello World!");
alert(typeof s);
何がアラートになりますか?回答:"オブジェクト"。それは文字列を初期化するための確かな方法ですが、それにもかかわらず、私はそれを非常に頻繁に見ます。必要に応じて変換を試みるか、何もしません。
完全に制御できるJavascript環境で(これは単にライブラリを提供する場合は に当てはまります)、このプロトタイプの調整セットを使用すると言いました:-
String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;
したがって、一般的なタイプのテストは次のように簡単にできます。-
if (x.isString)
null / undefinedに注意する必要がありますが:-
if (x != null && x.isString)
新しいString(" thing")
を回避することに加えて、このアプローチは、特に日付と配列で独自のものになります。
jQueryなどのライブラリはエラーをユーザーに通知しません。
関数が数値を予期しており、ユーザーが文字列を渡すと、関数は何もせずに戻ります。
これにより、ライブWebサイトでJavaScriptエラーがポップアップするのを防ぎます。
PS。 JavaScriptエラーがスローされるのを防ぐために、入力したパラメーターを常にタイプチェックするようにしてください。
throw
はどうですか:
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/投げる
また、のタイプは配列、ヌル、オブジェクトを非常によく区別しません。ここの機能を見てください: http://javascript.crockford.com/remedial.html 、それに加えて、他にもいくつかの方法があります。
個人的には、コードに処理時間を追加するだけのステップなので、型チェックは行いません。パフォーマンスを重視する場合は、可能な限りミリ秒の処理時間を切り捨てたいと思うでしょう。優れたドキュメントは、チェックの必要性を解決します。
関数の起動時に文字列を静かに数値データ型に変換するのはどうですか?
「string」のデータ型はいつでも決定できます。できませんか?
" debug = 1"などの値を確認できます。セット。ある場合-アラートなどのエラーを出力できます。したがって、開発モードではユーザーに表示されますが、実際のサイトではオフにします。同じ方法でブラウザにエラーメッセージが表示されない-JSコンソールを確認する必要があります。
FireBugもあります。それを検出して、FBデバッグメッセージを書き込むこともできます。