1) 次のコードがあります。
var callIt = function(fn) { return fn.apply(this, Array.prototype.slice.apply(arguments, 1)); };
nodejsでcallItが呼び出されると、次のように文句を言います:
return fn.apply(this, Array.prototype.slice.apply(arguments, 1));
^
TypeError: Function.prototype.apply: Arguments list has wrong type
2) callIt を次のように変更した場合:
var callIt = function(fn) { return fn.apply(this, Array.prototype.slice.apply(arguments)); };
Nodejs は文句を言いませんが、余分な最初の引数が渡されたため、結果は期待したものではありません。
3) callIt を次のように変更した場合:
var callIt = function(fn) { var args = Array.prototype.slice.apply(arguments); return Function.prototype.apply(fn, args.slice(1)); //return fn.apply(this, args.slice(1)); //same as above };
期待どおりに動作します。
4) Chrome 開発者ツール コンソールで次のようにテストを実行すると:
> var o={0:"a", 1:"asdf"} undefined > o Object 0: "a" 1: "asdf" __proto__: Object > Array.prototype.slice.call(o,1) [] > Array.prototype.slice.call(o) []
現在、スライスは配列のようなオブジェクトでは機能しません。
私はこれらに困惑しています。説明してください。
以下を参照しました: Array_generic_methods