この記事は、Yaphi Berhanu、Vildan Softic、Jani Hartikainen、Dan Princeによってレビューされました。 SitePointコンテンツを最高の状態にしてくれたすべてのSitePointピアレビュアーに感謝します! JavaScriptの魅力の1つは、その機能的なプログラミング特性です。最初から、機能はJavaScriptの世界の一流の市民でした。これにより、多くの方法で簡単にまとめることができるエレガントで表現力豊かなコードを作成できます。ただし、機能的なプログラミングを単独で実行する機能を持つことは、機能的なプログラミングを自動的に実装することはできません。 RAMDA.JSは非常に人気のあるライブラリ(GitHubに4K星以上の星があります)で、機能プログラミングのJavaScriptを始めるのに役立ちます。
キーポイントRAMDA.JSは、関数が入力データを変更せず、それにより予測可能性とテストの容易さを改善することにより、JavaScriptの機能プログラミング機能を強化します。
- RAMDA.JSの主な機能には、機能の自動カールと不変性に重点を置くことが含まれているため、副作用のない機能的なパイプラインを簡単に構築できます。
- このライブラリは、フロントエンドおよびnode.js環境に適しており、他のJavaScriptライブラリまたはフレームワークとシームレスに統合できます。
- ramda.jsは、 、
- 、
R.map
などの実用的な方法と関数を提供し、データ構造の操作を簡素化し、コードの読みやすさと保守性を向上させます。R.prop
R.curry
RAMDA.JSには多くの利点がありますが、開発者はそれを使用するかどうかを決定する際に、特定のプロジェクト要件と機能的なプログラミングに精通している必要があります。
ramda.jsを最大限に活用するには、小さなnode.jsプロジェクトを作成することで、その利点に精通している必要があります。ノードパッケージマネージャー(npm)を介して単純にインストールできます。
通常、ライブラリの機能を名前空間Rに単純にインポートします。これにより、RAMDAメソッドへのすべての呼び出しにはR.プレフィックスがあります。
npm install ramda
もちろん、フロントエンドコードでRAMDA.JSを使用することを妨げるものはありません。ブラウザでは、ライブラリコピーへの正しいパスを含める必要があります。これは、次のHTMLコードスニペットと同じくらい簡単かもしれません。
var R = require('ramda');
ramda.jsは、domまたはnode.js固有の機能を使用しません。これは単なる言語ライブラリ/エクステンションであり、JavaScriptランタイムによってすでに公開されている構造とアルゴリズムに基づいて構築されます(ECMaScript 5に標準化されています)。詳細な研究を実施する準備はできましたか?いくつかの機能の実際のアプリケーションを見てみましょう!
<🎜>
コンセプト
機能プログラミングにおける最も重要な概念は、純粋な機能の概念です。純粋な関数は等量であり、状態を変更しません。数学的な観点からは、罪(x)のような機能は非常に自然に見え、外部の状態に依存しないため、これは理にかなっています。純粋な機能に加えて、単一パラメーター機能も必要です。彼らは最も原始的です。ゼロパラメーター関数は通常、外部状態が変更されることを意味するため、純粋な機能ではありません。しかし、JavaScriptのような言語では、通常、複数のパラメーターを持つ関数があります。
currihua
閉鎖と組み合わせた高次関数(つまり、関数を入力として使用し、出力として機能する関数)を持つ機能(ローカル変数のキャプチャ)は、良い方法を提供します:カリー。カリーは、複数(nを仮定する)パラメーターを持つ関数が単一のパラメーターを持つ関数に変換されるプロセスであり、単一のパラメーターで別の関数を返します。これは、必要なすべてのパラメーターが収集されるまで続きます。 RAMDA.JSヘルパー関数を使用して、そのパラメーターが文字列であるかどうかをテストする単一のパラメーターラッパーを書きたいとします。次のコードがジョブを行います。
npm install ramda
これは、カリーを使用するとより簡単に行うことができます。 R.ISはRAMDA.JSの一部であるため、関数が必要とするパラメーターよりも少ないパラメーターを提供する場合、ライブラリはカレー関数を自動的に返します。
var R = require('ramda');これはより表現力があります。 R.ISを単一の引数で呼んだので、関数が得られました。 2回目の呼び出し(元の関数呼び出しが2つのパラメーターを使用することを忘れないでください)では、結果が得られます。しかし、最初にRAMDA.JSヘルパー機能を使用しなかった場合はどうでしょうか?コードのどこかで次の関数を定義したと仮定しましょう。
これは完全な2次多項式です。すべての可能な値を可能にする4つのパラメーターがあります。ただし、通常、パラメーターa、b、cの固定セットに対してxを変更するだけです。 ramda.js:
<🎜>を使用して変換する方法を見てみましょう
同様に、パラメーター評価を使用して特定のサブセットのエイリアスを作成するだけです。たとえば、式x -1は次のように取得できます。
function isString (test) { return R.is(String, test); } var result = isString('foo'); //=> true
パラメーターの数が関数のパラメーターによって与えられていない場合、Currynを使用して、パラメーターの数を明示的に指定する必要があります。カリーはRamda.jsの中心にありますが、図書館はそれほど面白くないようです。機能プログラミングのもう1つの重要な概念は、不変性です。
var isString = R.is(String); var result = isString('foo'); //=> true変更されていない構造
関数が状態を変えるのを防ぐ最も簡単な方法は、変更できないデータ構造を使用することです。単純なオブジェクトの場合、たとえば読み取り専用アクセターが必要です。
は許可されていません。読み取り専用のプロパティを宣言することに加えて、それらをゲッター関数に変換することもできます:
これは今でははるかに優れていますが、オブジェクトを変更することもできます。これは、誰かがGETX関数のカスタム定義を追加できることを意味します。
npm install ramda
不変性を達成する最良の方法は、object.freezeを使用することです。 constキーワードと組み合わせて、変更できない不変変数を導入できます。
var R = require('ramda');
別の例にはリストが含まれます。不変のリストに要素を追加するには、元のリストをコピーし、最後に新しい要素を追加する必要があります。もちろん、元のオブジェクトの不変性知識を使用して、実装を最適化することもできます。これにより、コピーを簡単な参照に置き換えることができます。基本的に、これはリンクされたリストに変わる可能性があります。標準のJavaScriptアレイは可変であるため、正しさを確保するためにコピーする必要があることを認識する必要があります。 append()などの方法JavaScriptアレイで動作し、そのような配列を返します。操作は、同じ引数で関数を複数回呼び出す場合、常に同じ結果を得ることができます。
<🎜>
指定された配列を返すが、指定されたエントリが含まれていない削除メソッドもあります。次のように機能します:
function isString (test) { return R.is(String, test); } var result = isString('foo'); //=> true
柔軟な数のパラメーターがあるため、カレー化を適用するために前述のカリン関数が必要です。また、いくつかの有用な一般的なヘルパー機能もあります。
実用的な方法
すべてのヘルパー関数の最も重要な概念は、カレーを促進するためにパラメーターが順序付けられることです。パラメーターが頻繁に変更されるほど、他のパラメーターよりも前になる可能性が低くなります。
sum()およびrange()
もちろん、合計や範囲など、ramda.jsで一般的な関数を見つけることができます。range()ヘルパー機能の場合、カレーを使用してラッパーを作成できます。
var isString = R.is(String); var result = isString('foo'); //=> true
固定(排他的な)最大でラップしたい場合はどうなりますか? ramda.jsは、r .__:
で表される特別なパラメーターを使用して、私たちのニーズを満たしています。var quadratic = (a, b, c, x) => x * x * a + x * b + c; quadratic(1, 0, 0, 2); //=> 4 quadratic(1, 0, 0)(2); //=> TypeError: quadratic(..) is not a function
map()
さらに、RAMDA.JSは「より良い」ソリューションを使用して、array.prototype.mapなどのJavaScriptコア関数に代わるものを提供しようとします。 「より良い」ソリューションには、異なるパラメーターの順序と箱から出てカリーがあります。以下に示すように、マップ関数の場合:var quadratic = R.curry((a, b, c, x) => x * x * a + x * b + c); quadratic(1, 0, 0, 2); //=> 4 quadratic(1, 0, 0)(2); //=> 4
prop()
もう1つの有用なユーティリティは、指定されたプロパティの値を取得しようとするプロップ関数です。与えられたプロパティが存在しない場合、未定義が返されます。値が実際に定義されていない場合、これは曖昧かもしれませんが、実際にはめったにそれを気にしません。
var xOffset = quadratic(0, 1, -1); xOffset(0); //=> -1 xOffset(1); //=> 0
zipwith()
以前に導入された方法で、Ramda.jsが何か有用なものを提供する可能性があることを納得させない場合、次の方法がより興味深いかもしれません。今回は、特定の例については説明しませんが、代わりに選択されたシナリオを任意に見ていきます。 2つのリストがあり、それらを接続したいとします。 zip関数を使用することは実際には非常に単純です。ただし、通常の結果(それ自体が二重値アレイである要素の配列)は、私たちが望む結果ではない場合があります。これは、zipwith関数が作用する場所です。任意の関数を使用して値を単一の値にマップします。
var position = { x: 5, y: 9 }; position.x = 10; // works!
同様に、ベクトルにドット製品を導入できます。
npm install ramda
乗算(生成[1、4、9])によって2つの配列を圧縮し、結果を合計関数に渡します。いずれにせよ、列挙可能なオブジェクトを使用することは重要なトピックです。 RAMDA.JSが多くの有用なヘルパー機能を提供することは驚くことではありません。各要素に関数を適用するためにR.Mapを導入しました。同様に、要素の数を減らすヘルパー関数がいくつかあります。単一の値は、最も一般的なフィルター関数(別の配列を生成する)または還元関数によって生成できます。
chain()
配列の動作に役立つヘルパー関数がいくつかあります。たとえば、チェーンを使用すると、配列を簡単にマージできます。数値を入力として使用し、出力としてプライムファクターを持つ配列を提供する関数プライムファクター化があると仮定します。関数を次のように適用した結果を組み合わせることができます。
var R = require('ramda');実用的な例
これまでのところ、すべてが順調に進んでいます。現在の最大の問題は、RAMDA.JSによって導入されたこれらの概念を使用して、私たちの日常業務の利点は何ですか?次の(すでに非常に格好良い)コードスニペットがあると仮定しましょう。
<🎜>RAMDA.jsを使用して読みやすくする方法は?まあ、最初の行は十分です。 2行目はすでに非常に混乱しています。私たちが本当に望んでいるのは、提供されたパラメーターの投稿プロパティを抽出することです。最後に、わずかに混乱する第3行があります。ここでは、すべての投稿(パラメーターで提供)を反復しようとします。繰り返しますが、その唯一の目的は、特定の特性を抽出することです。次のソリューションはどうですか?
function isString (test) { return R.is(String, test); } var result = isString('foo'); //=> trueこれはおそらく、RAMDA.JS対応機能プログラミングのおかげで、読みやすさのための最良のソリューションです。ただし、ECMAScript 6に導入された「ファットアロー」構文は、非常に簡潔で読みやすいコードにもつながることに注意する必要があります。
これは、RAMDA.JSの知識なしで読みやすいです。さらに、抽象化の数を減らします。これは、パフォーマンスと保守性にのみ役立ちます。
var isString = R.is(String); var result = isString('foo'); //=> trueレンズ
最後に、有用なオブジェクトヘルパー関数についても議論する必要があります。ここでは、レンズ関数があることに言及する価値があります。レンズは、特定のRAMDA.JS関数にオブジェクトまたは配列で渡すことができる特別なオブジェクトです。これらの関数は、それぞれオブジェクトまたは配列の特定のプロパティまたはインデックスからデータを取得または変換することができます。記事の冒頭で与えられた不変の例と同じように、2つのキーxとyを備えたオブジェクトがあるとします。 GetterおよびSetterメソッドで別のオブジェクトにオブジェクトを包む代わりに、関心のあるプロパティに「焦点を合わせる」ためのレンズを作成できます。オブジェクトのx属性にアクセスするレンズを作成するには、次のことを行うことができます。
Propは標準のゲッター(これが導入されています)ですが、Assocはセッター関数(3つの値構文:key、value、object)です。これで、RAMDA.JSの関数を使用して、このレンズによって定義されたプロパティにアクセスできます。
npm install ramda
この操作は、与えられた位置オブジェクトに触れないことに注意してください(フリーズするかどうかにかかわらず)。セットは単なる特別なケースであり、類似しているが、任意の値ではなく関数をとることに注意する必要があります。この関数は、値を変換するために使用されます。たとえば、次の呼び出しにはX座標に3を掛けます:
var R = require('ramda');
ramda.js、lodashなど?
合理的な質問は、もちろんRamda.jsが選ばれる理由です - なぜLodashか何かを使用しないのですか?もちろん、Ramda.jsが更新されていると主張するかもしれないので、それはより良いに違いありませんが、それは真実とはほど遠いものです。真実は、ramda.jsは、パラメーターの配置と選択への新しいアプローチ(JavaScriptライブラリの場合)を念頭に置いて構築されているということです。たとえば、RAMDA.JSのリストIteratorは、リストではなくデフォルトでアイテムのみを渡します。一方、他のライブラリの標準(Lodashなど)は、アイテムとインデックスを渡してコールバック関数を渡すことです。これはわずかな問題のように思えますが、RAMDA.JSを使用しているときに、ParseInt()(オプションの2番目の引数を取ります)のような便利な内蔵機能を使用することを妨げます。これは正常に機能します。最終的に、選択したものは、特定の要件またはチームの経験および/または知識に依存しますが、RAMDA.JSにそれにふさわしい注意を引くためのいくつかの正当な理由があります。
さらに読み取り
- Advanced Order Functions
- なぜカリーが役立つのか
- 不変
- なぜラムダを選ぶのですか?
- ramdaドキュメント RAMDA.js
- を使用した 機能プログラミング
結論
機能的プログラミングは万能薬と見なされるべきではありません。代わりに、既存のツールボックスへの自然な追加と見なされる必要があります。これにより、複合性が向上し、柔軟性が向上し、障害の許容度が向上します。最新のJavaScriptライブラリは、いくつかの機能的概念を活用しようとしました。 RAMDA.JSは、独自の機能ユーティリティライブラリを拡張する強力なツールです。機能的なプログラミングについてどう思いますか?どのような面で、それはうまく機能すると思いますか?コメントで教えてください!
RAMDAを使用した機能プログラミングに関するFAQ(FAQS) 機能プログラミングにRAMDAを使用することの主な利点は何ですか?
Ramdaは、JavaScriptプログラマーにとって実用的な機能ライブラリです。機能的なプログラミングスタイル用に設計されているため、機能的なパイプラインの作成が容易になり、ユーザーデータが変更されません。 RAMDAを使用することの主な利点は、不変性と副作用のない機能を強調することです。これは、関数が入力データを変更せず、コードが予測とテストを容易にすることを意味します。 Ramdaの機能は自動的にカレーであり、これにより、多くのブラケットやコールバックHellで迷子になることなく、古い機能から新しい機能を簡単に構築できます。
Ramdaは他のJavaScriptライブラリとどう違うのですか?
他のJavaScriptライブラリとは異なり、RAMDAは機能的なプログラミングをサポートするように設計されており、データを変更しません。デフォルトでカレーである一連の実用的な関数を提供します。つまり、新しい機能を作成するために一緒に使用することを目的としています。これは、UnderscoreやLodashなどのライブラリとは大きく異なります。これは、デフォルトではカレーのようなものではなく、通常、同じ結果を得るために追加のコードを記述する必要があります。 RamdaのAPIは、シンプルさと読みやすさに重点を置いて、より一貫性があり、使いやすくなります。
他のJavaScriptライブラリやフレームワークでRAMDAを使用できますか?
はい、Ramdaは他のJavaScriptライブラリとフレームワークで使用できます。これは、他のライブラリやフレームワークに依存せず、JavaScriptオブジェクトのプロトタイプを変更しないスタンドアロンライブラリです。これにより、対立や予期しない副作用を心配する必要なく、他のライブラリやフレームワークと協力しても安全になります。 JQuery、React、Angular、Vue、またはその他のライブラリまたはフレームワークを使用している場合でも、RAMDAを使用して、よりクリーナー、より機能的なコードの書き込みを支援できます。
ラムダは、機能プログラミングの初心者に適していますか?
Ramdaは、機能プログラミングの初心者に最適なツールです。そのAPIデザインはシンプルで直感的であり、その命名規則は明確で一貫しています。ドキュメントも非常に詳細であり、開始する多くの例があります。しかし、新しいツールやパラダイムと同様に、学習曲線があります。機能的な思考に慣れ、Ramdaの機能を効果的に使用する方法を理解するには時間がかかる場合があります。ただし、練習をすれば、コードを大幅に簡素化し、理解しやすくすることができることがわかります。
RamdaはNullおよび未定義の値をどのように処理しますか?
Ramdaは、他の機能的なプログラミング言語がそれらを処理する方法と同様に、null値と未定義の値をnull値として扱います。これは、エラーや例外を引き起こすことなく、nullまたは未定義をRamdaの機能に安全に渡すことができることを意味します。ただし、予期しない動作を避けるために、それらを関数に渡す前に、nullまたは未定義の値を常に確認することをお勧めします。
node.js環境でRAMDAを使用できますか?
はい、ramdaはnode.js環境で使用できます。これは、ブラウザやnode.jsで使用できる一般的なライブラリです。 NPM経由でインストールでき、他のパッケージと同様にnode.jsモジュールに必要です。
Ramdaは非同期操作をどのように処理しますか?
Ramdaには、主に同期ライブラリであるため、組み込みの非同期操作サポートがありません。ただし、約束や非同期/待ち望など、非同期操作をサポートする他のライブラリで使用できます。また、非同期関数またはその後のコールバックでRAMDAの関数を使用することもできます。
RAMDAプロジェクトに貢献する方法は?
Ramdaはオープンソースプロジェクトであり、いつでも貢献できます。バグを報告したり、新機能を提案したり、ドキュメントを改善したり、プルリクエストを送信したりすることで貢献できます。貢献する前に、Ramda Githubページの寄付ガイドを読むのが最善です。
ラムダはまだ維持と更新を維持していますか?
はい、Ramdaは積極的に維持し、定期的に更新しています。メンテナンス担当者は、図書館を最新の状態に保ち、発生する問題やエラーを解決することに取り組んでいます。最新のアップデートとバージョンについては、GitHubページを確認できます。
商業プロジェクトにRAMDAを使用できますか?
はい、RamdaはMITライセンスの下でライセンスされています。つまり、商業プロジェクトに使用できることを意味します。ただし、あなたの権利と責任を理解するために、常に完全なライセンス契約を読むことをお勧めします。
以上がRAMDA.JSを使用した実践的な機能プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

10の楽しいjQueryゲームプラグインして、あなたのウェブサイトをより魅力的にし、ユーザーの粘着性を高めます! Flashは依然としてカジュアルなWebゲームを開発するのに最適なソフトウェアですが、jQueryは驚くべき効果を生み出すこともできます。また、純粋なアクションフラッシュゲームに匹敵するものではありませんが、場合によってはブラウザで予期せぬ楽しみもできます。 jquery tic toeゲーム ゲームプログラミングの「Hello World」には、JQueryバージョンがあります。 ソースコード jQueryクレイジーワードコンポジションゲーム これは空白のゲームであり、単語の文脈を知らないために奇妙な結果を生み出すことができます。 ソースコード jquery鉱山の掃引ゲーム

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

このチュートリアルでは、jQueryを使用して魅惑的な視差の背景効果を作成する方法を示しています。 見事な視覚的な深さを作成するレイヤー画像を備えたヘッダーバナーを構築します。 更新されたプラグインは、jQuery 1.6.4以降で動作します。 ダウンロードしてください

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

Matter.jsは、JavaScriptで書かれた2D Rigid Body Physics Engineです。このライブラリは、ブラウザで2D物理学を簡単にシミュレートするのに役立ちます。剛体を作成し、質量、面積、密度などの物理的特性を割り当てる機能など、多くの機能を提供します。また、重力摩擦など、さまざまな種類の衝突や力をシミュレートすることもできます。 Matter.jsは、すべての主流ブラウザをサポートしています。さらに、タッチを検出し、応答性が高いため、モバイルデバイスに適しています。これらの機能はすべて、物理ベースの2Dゲームまたはシミュレーションを簡単に作成できるため、エンジンの使用方法を学ぶために時間をかける価値があります。このチュートリアルでは、このライブラリのインストールや使用法を含むこのライブラリの基本を取り上げ、

この記事では、JQueryとAjaxを使用して5秒ごとにDivのコンテンツを自動的に更新する方法を示しています。 この例は、RSSフィードからの最新のブログ投稿と、最後の更新タイムスタンプを取得して表示します。 読み込み画像はオプションです


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

Dreamweaver Mac版
ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

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

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

ホットトピック



