アプリ版:「スタンプのみでお礼する」機能のリリースについて

var product,
slice = [].slice;

product = function() {
var i, len, num, nums, total;
nums = 1 <= arguments.length ? slice.call(arguments, 0) : [];
total = 1;
for (i = 0, len = nums.length; i < len; i++) {
num = nums[i];
totgal *= num;
}
return total;
};

alert(product(1, 2, 3));

このプログラムは結果的に3!を返すように思うのですが、
(1)slice = [].slice;

(2)slice.call(arguments, 0)
の意味がわからないでおります。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
をみてみたものの、
(1)のように空の配列で、引数がないslice関数の呼び出しの意味がわからないんです。
(2)の第2引数の「0」の意味もわからないでおります。
結果的にはproduct(1,2,3)の引数「1,2,3」を配列に変換してnumsに代入しているように思えるのですが。。。

質問者からの補足コメント

  • slice.call(arguments, 0)
    この「0」の意味がわからないんです。
    そちらではおわかりでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/03/05 08:43
  • 0番目からすべてをコピーする
    →あ、そういう意味でしたか!理解できました。

    slice = [].slice;
    こちらがまだしっくりこなくて・・・
    slice=[];
    ではだめなものなのでしょうか・・・

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/03/05 13:17

A 回答 (3件)

たぶん,


slice = [].slice;
で Array.prototype.slice というメソッドを slice という名前の変数に入れて,
slice.call(arguments, 0)
でそのメソッドを呼び出してるんだと思う.

この場合 slice は 1回しか使っていないから slice を使って
slice.call(arguments, 0)
とする代わりに
[].slice.call(arguments, 0)
でもいいはず. 一瞬 [] に対して slice を実行しているように見えるけど call を使って this を差し替えているところがポイント.

実際問題としてこの程度のことでわざわざ配列にする必要があるんだろうかというところはあるけど.
    • good
    • 0
この回答へのお礼

ありがとうございます!理解できました

coffeescriptからjavascriptに変換されたコードなのでこういうまわりくどいコードになっているようです

お礼日時:2018/03/05 16:26

配列をコピーしたいときによく使います


(0番目から全てをコピーする)
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました
こちらの回答なしにはNO3様のご回答のお話にもうつれなかったので感謝です

以前教えてgooでは次点つけられたような記憶があったのですが。。
先にNO3様をベストアンサーにしてしまいました
すみません、ありがとうございました

お礼日時:2018/03/05 16:34

slice = [].slice;


var slice = Array.prototype.slice;


var int = Math.floor;
var n = int (4.5); // n = 4


slice.call(arguments, 0)
Array.prototype.slice.call (arguments, 0)
[1,2,3].slice (0)

arguments はオブジェクトなので配列化するために。

本来なら配列にしか使えない slice 関数だけど、
Array.prototype.slice.call として使うとオブジェクト型に使える
説明不足でごめん
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!