嬉しい機能【JavaScript】
いくつかの JavaScript 関数の疑似本物と偽物の特性を調べます。
名前
関数オブジェクトにはname
属性があり、予想どおり、このフィールドは関数名を返します。
function add(a, b) {
return a + b;
}
console.log(add.name); // "add"
「これは何の役に立つの?」と言いたくなるかもしれませんが、これは単なる関数オブジェクトの名前ではなく、端的に言えば変数の名前です。しかし、ほとんどの場合、変数名は開発者向けです。開発者が認識できるものであれば、名前が何であれ、重要なのは価値です。
これは実用的ではなく、name
変数名が常に表示されるわけではないことを意味します。シナリオは次のとおりです。
const fn = add;
console.log(fn.name); // "add"
これは少し興味深いですが、name
読み取りは可能ですが書き込みはできないプロパティです。
const fn = add;
console.log(fn.name); // "add"
fn.name = "fn";
console.log(fn.name); // "add"
長さ
関数オブジェクトには、length
関数のパラメーター リストの長さを示すプロパティがあります。例えば:
function add(a, b) {
return a + b;
}
console.log(add.length); // 2
非常にシンプルで大雑把ですが、これで終わりですか? いいえ。length
属性には必要なパラメータの数が反映されるというルールがあります。
関数パラメータはいつオプションになりますか? 次に、ES6 の新しいデフォルト パラメータと残りのパラメータ1を試す必要があります。
function add(a, b = a) {
return a + b;
}
console.log(add.length); // 1
function sum(...nums) {
return nums.reduce((r, v) => r + v)
}
console.log(sum.length); // 0
デフォルト パラメーターへの追加機能は、関数にデフォルト パラメーターがある場合、length
そのプロパティの計算が最初のデフォルト パラメーターから開始され、停止することです。
{
function add(a = 0, b = a) {
return a + b;
}
console.log(add.length); // 0
}
{
// 不符合标准的写法,此处只为演示效果
function add(a, b = a, c) {
return a + b;
}
console.log(add.length); // 1
}
と同様にname
、読み取り専用ルールがありますが、これについては再度説明しません。結論は出せますが、まだ信頼性が低く、テストポイントではありますが、実用的ではありません。
形参同名
初めてこれを見たとき、VSCode を開いて編集を開始しましたがindex.ts
、赤い線を見て深く考えさせられました。誰のことを話しているのですか? これにより、この観点の存在が否定されました。
でも、待ってください、誰が TypeScript を使いたいと思っているのでしょうか? もちろん、このような楽しいことをするには JavaScript が必要です。
まず、日常生活では書けないとしても、これは存在する可能性があるということを説明しましょう。
function add(a, a) {
return a + a;
}
console.log(add(10, 20)); // 40
これはvar
変数を宣言するように動作します。後者は前者をオーバーライドします。関数のパラメーター割り当てプロセスをシミュレートできます。
var a = 10;
var a = 20;
console.log(a); // 20
次に、このフォームは非厳密モードでのみ存在できます。
"use strict"
// Duplicate parameter name not allowed in this context
function add(a, a) {
return a + a;
}
これは低レベルのエラーであり、問題評価としては純粋にスキルであり、TypeScript、ESLint、IDEの時代に書くのは困難です。
-終わり-
コレクション パラメーター (私はこれに慣れています)、残りのパラメーター (「ES6 入門」) とも呼ばれます。ここでは、MDN で翻訳された名前 (残りのパラメーター) を使用することにします。↩︎