1. 引数とは何ですか
は MDN で説明されています:
arguments は配列のようなオブジェクトです。関数に渡されるパラメータのリストを表します。
まず、JavaScript の引数がどのようなものかを直感的に理解するために例を使用してみましょう。
function printArgs() { console.log(arguments); } printArgs("A", "a", 0, { foo: "Hello, arguments" });
実行結果は次のとおりです:
["A", "a", 0, Object]
一見、結果は配列ですが、実際の配列ではないため、引数は配列のようなオブジェクトです(実際の配列との違いを知りたい場合)配列のようなオブジェクト、最後までスクロールできます)。
引数で表される内容をもう一度見てください。これは、関数の実行時に関数に渡されるすべてのパラメーターを表します。上の例では、printArgs
関数に渡される 4 つのパラメーターを表しており、それぞれ arguments[0]
、arguments[1] として使用できます。コード >… を使用して単一のパラメータを取得します。 <code>printArgs
函数中的四个参数,可以分别用 arguments[0]
、 arguments[1]
… 来获取单个的参数。
2. arguments 操作
2.1 arguments length
arguments 是个类数组对象,其包含一个 length
属性,可以用 arguments.length
来获得传入函数的参数个数。
function func() { console.log("The number of parameters is " + arguments.length); } func(); func(1, 2); func(1, 2, 3);
执行结果如下:
The number of parameters is 0 The number of parameters is 2 The number of parameters is 3
2.2 arguments 转数组
通常使用下面的方法来将 arguments 转换成数组:
Array.prototype.slice.call(arguments);
还有一个更简短的写法:
[].slice.call(arguments);
在这里,只是简单地调用了空数组的 slice 方法,而没有从 Array 的原型层面调用。
为什么上面两种方法可以转换呢?
首先,slice 方法得到的结果是一个数组,参数便是 arguments。事实上,满足一定条件的对象都能被 slice 方法转换成数组。看个例子:
const obj = { 0: "A", 1: "B", length: 2 }; const result = [].slice.call(obj); console.log(Array.isArray(result), result);
执行结果是:
true ["A", "B"]
从上面例子可以看出,条件就是: 1) 属性为 0,1,2…;2) 具有 length 属性;
另外,有一个需要注意的地方就是,不能将函数的 arguments 泄露或者传递出去。什么意思呢?看下面的几个泄露 arguments 的例子:
// Leaking arguments example1: function getArgs() { return arguments; } // Leaking arguments example2: function getArgs() { const args = [].slice.call(arguments); return args; } // Leaking arguments example3: function getArgs() { const args = arguments; return function() { return args; }; }
上面的做法就直接将函数的 arguments 对象泄露出去了,最终的结果就是 V8 引擎将会跳过优化,导致相当大的性能损失。
你可以这么做:
function getArgs() { const args = new Array(arguments.length); for(let i = 0; i < args.length; ++i) { args[i] = arguments[i]; } return args; }
那就很好奇了,我们每次使用 arguments 时通常第一步都会将其转换为数组,同时 arguments 使用不当还容易导致性能损失,那么为什么不将 arguments 直接设计成数组对象呢?
这需要从这门语言的一开始说起。arguments 在语言的早期就引入了,当时的 Array 对象具有 4 个方法: toString、 join、 reverse 和 sort。arguments 继承于 Object 的很大原因是不需要这四个方法。而现在,Array 添加了很多强大的方法,比如 forEach、map、filter 等等。那为什么现在不在新的版本里让 arguments 重新继承自 Array呢?其实 ES5 的草案中就包含这一点,但为了向前兼容,最终还是被委员会否决了。
2.3 修改 arguments 值
在严格模式与非严格模式下,修改函数参数值表现的结果不一样。看下面的两个例子:
function foo(a) { "use strict"; console.log(a, arguments[0]); a = 10; console.log(a, arguments[0]); arguments[0] = 20; console.log(a, arguments[0]); } foo(1);
输出:
1 1 10 1 10 20
另一个非严格模式的例子:
function foo(a) { console.log(a, arguments[0]); a = 10; console.log(a, arguments[0]); arguments[0] = 20; console.log(a, arguments[0]); } foo(1);
输出结果为:
1 1 10 10 20 20
从上面的两个例子中可以看出,在严格模式下,函数中的参数与 arguments 对象没有联系,修改一个值不会改变另一个值。而在非严格模式下,两个会互相影响。
2.4 将参数从一个函数传递到另一个函数
下面是将参数从一个函数传递到另一个函数的推荐做法。
function foo() { bar.apply(this, arguments); } function bar(a, b, c) { // logic }
2.5 arguments 与重载
很多语言中都有重载,但 JavaScript 中没有。先看个例子:
function add(num1, num2) { console.log("Method one"); return num1 + num2; } function add(num1, num2, num3) { console.log("Method two"); return num1 + num2 + num3; } add(1, 2); add(1, 2, 3);
执行结果为:
Method two Method two
所以,JavaScript 中,函数并没有根据参数的不同而产生不同的调用。
是不是 JavaScript 中就没有重载了呢?并不是,我们可以利用 arguments 模拟重载。还是上面的例子。
function add(num1, num2, num3) { if (arguments.length === 2) { console.log("Result is " + (num1 + num2)); } else if (arguments.length === 3) { console.log("Result is " + (num1 + num2 + num3)); } } add(1, 2); add(1, 2, 3)
执行结果如下:
Result is 3 Result is 6
3. ES6 中的 arguments
3.1 扩展操作符
直接上栗子:
function func() { console.log(...arguments); } func(1, 2, 3);
执行结果是:
1 2 3
简洁地讲,扩展操作符可以将 arguments 展开成独立的参数。
3.2 Rest 参数
还是上栗子:
function func(firstArg, ...restArgs) { console.log(Array.isArray(restArgs)); console.log(firstArg, restArgs); } func(1, 2, 3);
执行结果是:
true 1 [2, 3]
从上面的结果可以看出,Rest 参数表示除了明确指定剩下的参数集合,类型是 Array。
3.3 默认参数
栗子:
function func(firstArg = 0, secondArg = 1) { console.log(arguments[0], arguments[1]); console.log(firstArg, secondArg); } func(99);
执行结果是:
99 undefined 99 1
可见,默认参数对 arguments 没有影响,arguments 还是仅仅表示调用函数时所传入的所有参数。
3.4 arguments 转数组
Array.from()
2.1 引数の長さ
arguments は length
属性を含む配列のようなオブジェクトで、arguments.length 関数に渡されるパラメータの数を取得します。 <p><pre class='brush:php;toolbar:false;'>const obj = { 0: "a", 1: "b" };
const arr = [ "a", "b" ];</pre></p>実行結果は以下の通りです: 🎜<pre class='brush:php;toolbar:false;'>function Foo() {}
Foo.prototype = Object.create(Array.prototype);
const foo = new Foo();
foo.push(&#39;A&#39;);
console.log(foo, foo.length);
console.log("foo is an array? " + Array.isArray(foo));</pre><h3 id="引数を配列に変換">2.2 引数を配列に変換</h3>🎜 引数を配列に変換するには、通常次の方法が使用されます: 🎜<pre class='brush:php;toolbar:false;'>["A"] 1
foo is an array? false</pre>🎜もっと短い書き方もあります: 🎜 <pre class='brush:php;toolbar:false;'>function Bar() {}
Bar.prototype.push = Array.prototype.push;
const bar = new Bar();
bar.push(&#39;A&#39;);
bar.push(&#39;B&#39;);
console.log(bar);</pre>🎜ここでは、Arrayのプロトタイプレベルからは呼び出されず、空配列のsliceメソッドが呼び出されているだけです。 🎜🎜なぜ上記の 2 つの方法を変換できるのでしょうか? 🎜🎜まず、sliceメソッドで得られる結果は配列であり、パラメータは引数です。実際、特定の条件を満たすオブジェクトはすべて、slice メソッドによって配列に変換できます。例を見てみましょう: 🎜<pre class='brush:php;toolbar:false;'>Bar {0: "A", 1: "B", length: 2}</pre>🎜 実行結果は次のとおりです: 🎜rrreee🎜 上記の例からわかるように、条件は次のとおりです: 1) 属性が 0、1、2... 2) length 属性がある。 🎜🎜さらに、注意が必要なことが1つあります。 ポイントは、関数の引数をリークしたり、渡したりできないことです。それはどういう意味ですか?リークされた引数の次の例を見てください: 🎜rrreee🎜 上記のアプローチでは、関数の引数オブジェクトが直接リークされ、最終的には V8 エンジンが最適化をスキップし、パフォーマンスが大幅に低下します。 🎜🎜これを行うことができます: 🎜rrreee🎜 それは非常に興味深いものです。引数を使用するときは、通常、最初のステップで引数を配列に変換します。同時に、引数を不適切に使用するとパフォーマンスの低下につながる可能性があります。引数を直接設計しない場合はどうすればよいでしょうか? 🎜🎜これは、この言語の先頭から始める必要があります。引数は、Array オブジェクトに toString、join、reverse、sort の 4 つのメソッドがあった言語の初期に導入されました。引数が Object から継承される大きな理由は、これら 4 つのメソッドが必要ないことです。現在、Array には、forEach、map、filter などの強力なメソッドが多数追加されています。では、新しいバージョンでは引数を Array から再継承させてみてはいかがでしょうか?実際、これは ES5 ドラフトに含まれていましたが、上位互換性を理由に最終的に委員会によって拒否されました。 🎜<h3 id="引数の値を変更する">2.3 引数の値を変更する</h3>🎜 strict モードと non-strict モードでは、関数のパラメータ値を変更した結果が異なります。以下の 2 つの例を見てください: 🎜rrreee🎜 出力: 🎜rrreee🎜 非厳密モードの別の例: 🎜rrreee🎜 出力は次のとおりです: 🎜rrreee🎜 上記の 2 つの例からわかるように、厳密モードでは、関数のパラメータは引数オブジェクトに関連していないため、一方の値を変更しても、もう一方の値は変更されません。非厳密モードでは、この 2 つは相互に影響します。 🎜<h3 id="ある関数から別の関数にパラメーターを渡す">2.4 ある関数から別の関数にパラメーターを渡す</h3>🎜 以下は、ある関数から別の関数にパラメーターを渡す場合の推奨される方法です。 🎜rrreee<h3 id="引数とオーバーロード">2.5 引数とオーバーロード</h3>🎜 オーバーロードは多くの言語で利用できますが、JavaScript では利用できません。まず例を見てみましょう: 🎜rrreee🎜 実行結果は次のとおりです: 🎜rrreee🎜 したがって、JavaScript では、関数は異なるパラメーターに基づいて異なる呼び出しを行いません。 🎜🎜JavaScriptにはオーバーロードはありませんか?いいえ、引数を使用してオーバーロードをシミュレートできます。まだ上記の例です。 🎜rrreee🎜実行結果は次のとおりです: 🎜rrreee🎜3. ES6 の引数🎜<h3 id="拡張演算子">3.1 拡張演算子</h3>🎜クリに直接: 🎜rrreee🎜実行結果は次のとおりです: 🎜rrreee🎜拡張演算子の引数は独立したパラメータに拡張できます。 🎜<h3 id="Rest-パラメータ">3.2 Rest パラメータ</h3>🎜同じ例: 🎜rrreee🎜実行結果は次のとおりです: 🎜rrreee🎜上記の結果からわかるように、Rest パラメータは、残りのパラメータのセットを表します。明示的な指定であり、型は Array です。 🎜<h3 id="デフォルトのパラメータ">3.3 デフォルトのパラメータ</h3>🎜チェスト: 🎜rrreee🎜実行結果は次のとおりです: 🎜rrreee🎜デフォルトのパラメータは引数に影響を与えず、引数は依然として、引数が渡されるすべてのパラメータを表すだけであることがわかります。関数を呼び出しています。 🎜<h3 id="配列への-つの引数">配列への 3.4 つの引数</h3>🎜<code>Array.from()
は、すべての配列のようなオブジェクトを配列に変換できる、非常に推奨されるメソッドです。 🎜🎜4. 配列と配列のようなオブジェクト 🎜🎜 配列にはインデックスという 1 つの基本的な機能があります。これは普通の物体にはないものです。 🎜const obj = { 0: "a", 1: "b" }; const arr = [ "a", "b" ];
我们利用 obj[0]
、arr[0]
都能取得自己想要的数据,但取得数据的方式确实不同的。obj[0]
是利用对象的键值对存取数据,而arr[0]
却是利用数组的索引。事实上,Object 与 Array 的唯一区别就是 Object 的属性是 string,而 Array 的索引是 number。
下面看看类数组对象。
伪数组的特性就是长得像数组,包含一组数据以及拥有一个 length 属性,但是没有任何 Array 的方法。再具体的说,length 属性是个非负整数,上限是 JavaScript 中能精确表达的最大数字;另外,类数组对象的 length 值无法自动改变。
如何自己创建一个类数组对象?
function Foo() {} Foo.prototype = Object.create(Array.prototype); const foo = new Foo(); foo.push('A'); console.log(foo, foo.length); console.log("foo is an array? " + Array.isArray(foo));
执行结果是:
["A"] 1 foo is an array? false
也就是说 Foo 的示例拥有 Array 的所有方法,但类型不是 Array。
如果不需要 Array 的所有方法,只需要部分怎么办呢?
function Bar() {} Bar.prototype.push = Array.prototype.push; const bar = new Bar(); bar.push('A'); bar.push('B'); console.log(bar);
执行结果是:
Bar {0: "A", 1: "B", length: 2}
以上就是JavaScript arguments 对象详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません
