

obj.fn(x)  
で呼び出す前と、呼び出した後で引数xの値が変わる関数って、何か名前ってあるんでしょうか？

rubyだと  
obj.reverse!  
でobjの状態が変わるものを破壊的メソッドて呼ぶ。みたいなやつです。


CC BY-SA 3.0
2017-02-01T06:36:19.057
32299
2017-02-06T02:46:36.047
20479
question
javascript ruby
呼び出し元の状態が変わるものを破壊的メソッドと言うみたいに、引数を破壊するメソッドって名前あるのでしょうか。


参照渡しのことでしょうか。javascriptに限らず殆どの言語であると思います。  
関数というよりは代入されたものが参照であるか否かですが。

[code]

    var ref = ["ABC"];   // 参照が代入される
    
    alert(ref[0]);   // ABCと表示
    bbb(ref);        // 参照渡し
    alert(ref[0]);   // XYZと表示
    
    function bbb (aaa) { // 参照渡し
       aaa[0] = "XYZ";
    }
    
[/code]


CC BY-SA 3.0
2017-02-01T07:14:07.170
32300
2017-02-01T07:14:07.170
19716
32299
answer

[code]

    obj.fn(x)
    
[/code]

この関数の呼び出し方のことであれば`prototype`

[code]

    obj.fn(x)
    fn(obj, x);
    
[/code]

どう呼び出そうが関数に渡した場合に破壊される関数については  
JavaScriptでは特に決まった名称を聞いたことがないので"破壊的メソッド"で良いのではないでしょうか？  
JavaScriptで"破壊的メソッド"と呼ばれていたりしても違和感ないですし、  
呼ばれたり記述されていることもあったりします。  
ただしJavaScriptでは"!"を関数の後に付与できないので、  
そもそもの呼ばれ方以前の問題で使われることが無いのかもしれません。


CC BY-SA 3.0
2017-02-01T07:38:36.430
32301
2017-02-01T07:38:36.430
32299
answer


以下、JavaScript独自の用語ではない気がしますが…。

パーサ。

  * JSON.parse
  * parseInt
  * parseFloat

シリアライザ。

  * JSON.stringify

型変換。

  * Number()
  * String()
  * Boolean()
  * Object()
  * Array.from()

オブジェクトの状態/値を変更する関数(固有名詞なし)。

  * Object.defineProperty
  * Object.defineProperties()
  * Object.seal()
  * Object.assign()
  * Object.setPrototypeOf()


CC BY-SA 3.0
2017-02-05T02:55:37.647
32392
2017-02-06T02:46:36.047
2017-02-06T02:46:36.047
20262
20262
32299
answer


ECMAScriptの仕様書を見る限り、各関数に対してそういった区別をしていないようで、用語としてあるわけではなさそうでした。

もし、名前を付けるのであれば「非純粋関数(non-pure
function)」だと思います。JavaScriptのメソッドは関数の一種ですので、その中に含まれます。

「非純粋関数」は単純に「純粋関数(pure
function)」ではない関数です。プログラミング(特に関数型プログラミング)においては、関数が純粋であるかどうか、つまり、参照透過性(referential
transparency)を持ち、副作用(side effect)がないこと、が重要になってきます。そのため、純粋と非純粋の区別は価値ある物になります。

ただ、「非純粋関数」と言った場合、次のようなことのいずれか、または、複数に該当します。

  1. レシーバの状態が変化する。レシーバが直接/間接的に参照するオブジェクトが変化する場合も含む。
  2. 与えられた引数のオブジェクトの状態が変化する。オブジェクトが直接/間接的に参照するオブジェクトが変化する場合も含む。
  3. 外的環境(グローバル変数やクロージャーされたローカル変数、実行環境、ファイルの中身など)が変化する。
  4. レシーバと引数以外の外的要因(グローバル変数やクロージャーされたローカル変数、実行環境、ファイルの中身など)によって、結果が変わる。

今回聞きたいのは2.のみの場合かと思いますが、それだけを区別しても意味が無いため、2.の時だけを表す用語は存在しないと思います。

Rubyの破壊的メソッド(destructiv
method)はレシーバを破壊するため必ず「非純粋関数」です。しかし、Rubyの用法としてはレシーバを破壊しない非破壊的メソッドと区別するために使う場合が多く、`!`が無いからと言って非破壊的である、純粋であるとは限りません。また`!`は、危険である、通常とは異なる、ことを示すのみで、破壊的メソッドだから付けると言った物でもありません。なお、組み込みクラスの破壊的メソッドと言われるもののほとんどは1.に該当する物になります。

最後に、注意点があります。JavaScriptにおいて本当に「純粋関数」であるかの判断は非常に難しいです。例えば次のコードを見てください。

[code]

    class NumberCalc {
        constructor(val) { this.val = val; }
        add(num) { return num + this.val; }
    }
    const nc = new NumberCalc(42);
    const x = { val: 1 };
    x.valueOf = function() { return this.val++ };
    console.log(x.val);
    console.log(nc.add(x));
    console.log(x.val);
[/code]

`NumberCalc.prototype.add`は引数のオブジェクトに何の変化をもたらさないように見えますが、`nc.add(x)`の呼び出しの前後で`x`の内容が変化しているのがわかると思います。この場合、果たして`nc.add`は「純粋関数」と言っていいのでしょうか？ここまで考えると、JavaScriptでこのような区別をすること自体が徒労に終わるような気がします。

下記の記事も参考にしてください。  
[そのJavaScriptの関数は本当に純粋関数？ | プログラミング | POSTD](http://postd.cc/httpstaltz-comis-
your-javascript-function-actually-pure/)


CC BY-SA 3.0
2017-02-05T06:25:16.107
32393
2017-02-05T06:25:16.107
7347
32299
answer