Airbnb JavaScript Style Guide
「Airbnb JavaScript Style Guide」では引数へ再代入しない規約になっています。
- 7.13 パラメータを再割り当てしない。eslint: no-param-reassign
Why? Reassigning parameters can lead to unexpected behavior, especially when accessing the arguments object. It can also cause optimization issues, especially in V8.
なぜ? 特に argumentsオブジェクトにアクセスするとき、パラメータを再割り当てすると予期しない動作をする可能性があります。
argumentsオブジェクトが破壊される (Sloppy Mode限定)
特に argumentsオブジェクトにアクセスするとき、パラメータを再割り当てすると予期しない動作をする可能性があります。
これはおそらく、Sloppy Modeで arguments
オブジェクトの要素値を書き換えてしまう動作を表していると想像します。
JavaScript
1// Sloppy Mode 2function sloppy (a) { 3 a += 2; 4 console.log(a); // 3 5 console.log(arguments[0]); // 3 (書き換えられてしまう) 6} 7 8// Strict Mode 9function strict (a) { 10 'use strict'; 11 a += 2; 12 console.log(a); // 3 13 console.log(arguments[0]); // 1 (書き換わらない) 14} 15 16sloppy(1); 17strict(1);
(2019/02/09 16:34追記)
@maisumakun さんより、Strict Modeではarguments破壊されないという指摘を頂きましたので、コードを追記しました。
事象発生の条件は3つあります。
- Sloppy Mode である (Strict Modeではない)
- 引数
a
を再代入する arguments[0]
を参照する
argumentsを破壊させるコードを書くメリット
そもそも、arguments破壊の条件を満たしたコードを書くメリットはあるのでしょうか。
私のコーディングスタイルでは、「引数名による参照」と「arguments[i]による参照」は二者択一であり、それぞれの引数に対してどちらで参照するかを予め決めておきます(参照法を一つにする事でシンプルに書ける為)。
- 第一引数 … 引数 a で参照する
- 第二引数以降 … arguments[i] で参照する
従って、条件2と条件3が同時に成立する事はなく、この事象が発生する可能性は0になります。
質問
Q1. argumentsの破壊条件を成立したコードを書くメリットはありますか。あるとしたら、どんなコードが考えられますか。
特にV8では最適化の問題も発生する可能性があります。
Q2. V8最適化問題の詳細をご存知の方は教えて下さい。
Q3. V8最適化問題は現行の最新版である「Google Chrome v72.0.3626.96」でも残存しているのでしょうか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/09 07:00
2019/02/09 07:41 編集