<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>arguments &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/arguments/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Sat, 30 Nov 2013 01:56:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;arguments&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/11/30/jaac2013-a-arguments.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sat, 30 Nov 2013 01:56:44 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[arguments]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3597</guid>

					<description><![CDATA[&#8220;A&#8221; は arguments の &#8220;A&#8221;。 arguments とは arguments は関数内で自身に渡された引数を取得する為のオブジェクトです。 可変長引数をとる関 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;A&#8221; は arguments の &#8220;A&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-7WLWtCZ1b-c/UqR4fjgwCeI/AAAAAAAACYg/6MSkQaOzvt8/s400/ac2013-a.png" alt="A"/></figure>



<p></p>



<span id="more-3597"></span>



<h2 class="wp-block-heading">arguments とは</h2>



<p>arguments は関数内で自身に渡された引数を取得する為のオブジェクトです。 可変長引数をとる関数を書きたい時や、コールバックに渡された引数を調べる時などに重宝します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">foo</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> i=<span class="hljs-number">0</span>; i&lt;<span class="hljs-built_in">arguments</span>.length; i++){
        <span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">arguments</span>&#91;i]); <span class="hljs-comment">// "a", "b", "c"</span>
    }
}
foo(<span class="hljs-string">"a"</span>, <span class="hljs-string">"b"</span>, <span class="hljs-string">"c"</span>);
</code></span></pre>


<h3 class="wp-block-heading">配列ライクなオブジェクト</h3>



<p>arguments の特徴は、</p>



<ul class="wp-block-list">
<li>length プロパティがある</li>



<li>添字（0-）で値を参照できる</li>
</ul>



<p>となっていて、一見配列に似ているのですが、実際はArrayのようでArrayではないほんのちょっとだけArrayな「Arrayライク」オブジェクトとされています。 Arrayではないので、Arrayに定義されているメソッド群は使うことができません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">arguments</span>.join(<span class="hljs-string">","</span>); <span class="hljs-comment">//  Object #&lt;Object&gt; has no method 'join'</span>
</code></span></pre>


<p>配列のメソッドを使いたい場合は、argumentsをArrayに変えてあげる必要があります。 その為によく使用されるのが Array の slice メソッドです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">foo</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> args = <span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>);
    <span class="hljs-keyword">return</span> args.join(<span class="hljs-string">","</span>);
}
foo(<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>); <span class="hljs-comment">// "1,2,3"</span>
</code></span></pre>


<p>Array の slice メソッドをお借りする事で、arguments を配列に変換した args を定義する例です。 これで args で配列の便利なメソッド群を使うことが出来るようになりました。</p>



<h3 class="wp-block-heading">for-in ループ</h3>



<p>主なブラウザでは arguments をfor-inループで回す事が出来る様ですが、IE8では正常に動きませんでした。 なので、対応したい場合は先述の様に一旦配列に変換する必要がありますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">foo</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> i;
    <span class="hljs-keyword">for</span>(i <span class="hljs-keyword">in</span> <span class="hljs-built_in">arguments</span>){ <span class="hljs-comment">// IE8では動作しない</span>
        <span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">arguments</span>&#91;i]);
    }
}
</code></span></pre>


<h2 class="wp-block-heading">簡単な例</h2>



<p>可変長引数のサンプルとして、文字列をフォーマットする関数を定義してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sprintf</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> args = <span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>);
    <span class="hljs-keyword">return</span> args.shift().replace(<span class="hljs-regexp">/%s/g</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> args.shift() || <span class="hljs-string">""</span>;
    });
}

sprintf(<span class="hljs-string">"Hello, %s !"</span>, <span class="hljs-string">"World"</span>); <span class="hljs-comment">// "Hello, World !"</span>
sprintf(<span class="hljs-string">"Hello %s, I'm %s, %s years old."</span>, <span class="hljs-string">"Tom"</span>, <span class="hljs-string">"John"</span>, <span class="hljs-string">"23"</span>);
<span class="hljs-comment">// "Hello Tom, I'm John, 23 years old. "</span>
</code></span></pre>


<p>他言語にあるような sprintf 関数の &#8220;%s&#8221; だけをエミュレートしてみた簡単なコードです。 引数の数やタイプが可変するような場合は arguments オブジェクトにお世話になる事でしょう。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
