この記事では、参照用のJavaScriptオブジェクトの浅いコピーとディープコピーコードを共有しています。特定のコンテンツは次のとおりです
1。ライトコピー
コピーとは、親オブジェクトのすべてのプロパティを子オブジェクトにコピーすることを意味します。
次の関数がコピーしています。
var中国= {nation: 'china'} var doctor = {career: 'chroct'} function endoctcopy(p){var c = {}; for(var i in p){c [i] = p [i]; } c.uber = p; c; }それを使用するとき、これを書いてください:
var doctor = extendcopy(中国語); doctor.career = 'doctor'; alert(doctor.nation); // 中国
ただし、そのようなコピーには問題があります。つまり、親オブジェクトのプロパティが配列または別のオブジェクトに等しい場合、実際には、子オブジェクトは実際のコピーではなくメモリアドレスのみを取得するため、親オブジェクトが改ざんされる可能性があります。
参照してください、今、中国人に「出生地」プロパティを追加します。その価値はアレイです。
中国語.birthplaces = ['Beijing'、 'Shanghai'、 'Hong Kong'];
extendCopy()関数を通じて、医師は中国人を継承します。
var doctor = extendcopy(中国);
次に、医師の「出生地」に都市を追加します。
doctor.birthplaces.push( 'xiamen');
入力結果をご覧ください
アラート(doctor.birthplaces); //北京、上海、香港、Xiamen
アラート(中国語.birthplaces); //北京、上海、香港、Xiamen
その結果、両方の出生地が変更されました。
したがって、extendCopy()は基本タイプデータをコピーするだけで、このコピーを「浅いコピー」と呼びます。
2。ディープコピー
浅くて深いコピーにはそのような欠点があるので、次に深いコピーを見てみましょう
いわゆる「ディープコピー」は、配列とオブジェクトの実際のコピーを実現できることを意味します。その実装は難しくありません。「浅いコピー」を再帰的に呼び出すだけです。
関数deepcopy(p、c){var c = c || {}; for(var i in p){if(typeof p [i] === 'object'){c [i] =(p [i] .constructor === array)? []:{}; deepcopy(p [i]、c [i]); } else {c [i] = p [i]; }} return c; }使用方法をご覧ください。
var doctor = deepcopy(中国語);
次に、配列として値を持つ親オブジェクトにプロパティを追加します。次に、子オブジェクトでこのプロパティを変更します。
中国語.birthplaces = ['beijing'、 'shanghai'、 'hongkong']; doctor.birthplaces.push( 'xiamen'); alert(doctor.birthplaces); //北京、上海、香港、Xiamen Alert(中国語.birthplaces); //北京、上海、香港
これにより、コピーが完成します。
$ .extend()
$ .extend()in jqueryは同じです。
$ .extend([deep]、target、object1 [、objectn])
•深い
タイプ:Boolean
Trueの場合、Mergeは再帰的になります(Deepコピーとも呼ばれます)。
•ターゲット
タイプ:オブジェクト
オブジェクト拡張機能。これにより、新しいプロパティが届きます。
•object1
タイプ:オブジェクト
追加のプロパティを含むオブジェクトが最初のパラメーターにマージされました。
•objectn
タイプ:オブジェクト
最初のパラメーターにマージする追加の属性が含まれています
$ .extend()に2つ以上のオブジェクトを提供すると、オブジェクトのすべてのプロパティがターゲットオブジェクト(ターゲットパラメーター)に追加されます。
$ .extend()に1つのパラメーターのみが提供されている場合、これはターゲットパラメーターが省略されていることを意味します。この場合、jQueryオブジェクト自体はデフォルトでターゲットオブジェクトになります。このようにして、jqueryネームスペースの下に新しい機能を追加できます。これは、プラグイン開発者がjQueryに新しい機能を追加する場合に役立ちます。
ターゲットオブジェクト(最初のパラメーター)が変更され、$ .extend()で返されることに注意してください。ただし、元のオブジェクトを保持したい場合は、空のオブジェクトをターゲットオブジェクトとして渡すことができます。
var object = $ .extend({}、object1、object2);
デフォルトでは、$ .extend()を介したマージ操作は再帰的ではありません。最初のオブジェクト自体のプロパティがオブジェクトまたは配列である場合、2番目のオブジェクトと同じキーを使用してプロパティを完全に上書きします。これらの値はマージされません。これは、以下の例でバナナの値をチェックすることで理解できます。ただし、Trueが関数の最初の引数として使用される場合、オブジェクト上で再帰マージが実行されます。
警告:最初のパラメーターのfalseを渡すことはサポートされていません。
1. 2つのオブジェクトをマージし、最初のオブジェクトを変更します。
var object1 = {apple:0、banana:{weight:52、price:100}、cherry:97}; var object2 = {banana:{ride:200}、durian:100}; // merge object2 intobjec1 $ .extend(object1、object2); ); // {"Apple":0、 "Banana":{"Price":200}、 "Cherry":97、 "Durian":100}2。2つのオブジェクトを再帰的にマージし、最初のオブジェクトを変更します。
var object1 = {apple:0、banana:{weight:52、price:100}、cherry:97}; var object2 = {banana:{rice:200}、durian:100}; // merge object2 into object1 Object1)3.デフォルトとオプションオブジェクトをマージし、デフォルトオブジェクトを変更しないでください。これは、一般的に使用されるプラグイン開発モデルです。
var defaults = {validate:false、limit:5、name: "foo"}; var options = {validate:true、name: "bar"}; // defaultsvar settings = $ .extend({}、defaults、options); console.log(json.Strings); log(json.Stringify(json.Stringify); ]JavaScriptは、オブジェクトが等しいかどうかを決定します
JavaScriptでは、平等操作には「==」、「===」の一貫性が含まれます。 2つの間の違いの大部分が必要ではありません。この記事では、2つのオブジェクトが等しいかどうかを判断する方法について説明します。 2つのオブジェクトに同じプロパティがあり、そのプロパティが同じ値を持っている場合、2つのオブジェクトは等しいと思うかもしれません。次に、例を使用してデモを行いましょう。
var obj1 = {name: "benjamin"、sex: "male"} var obj2 = {name: "benjamin"、sex: "male"} // outputs:false secondso.log(obj1 == obj2); // outputs:false secondso.log(obj1 == obj2);上記の例から、「==」または「==」を使用するかどうかにかかわらず、Falseが返されることがわかります。主な理由は、基本型の文字列と数値が値によって比較され、オブジェクト(日付、配列)と通常のオブジェクトは、ポインターによって指されたメモリのアドレスによって比較されることです。次の例を参照してください。
var obj1 = {name: "benjamin"、sex: "male"}; var obj2 = {name: "benjamin"、sex: "male"}; var obj3 = obj1; // outputs:trueconsole.log(obj1 == obj3); falseconsole.log(obj2 === obj3); // outputs:falseconsole.log(obj2 === obj3);上記の例は、OBJ1とOB3のポインターがメモリ内の同じアドレスを指しているため、trueを返します。これは、オブジェクト指向言語(Java/C ++)での価値の合格と参照の合格の概念に似ています。なぜなら、2つのオブジェクトが等しいかどうかを判断したい場合は、2つのオブジェクトのプロパティが同じかどうか、またはプロパティに対応する値が同じかどうか、または何であるかを判断しようとしている必要がありますか?
function person(name){this.name = name; } var p1 = new person( "p1"); var p2 = new person( "p2"); console.log(p1 == p2); // false person.prototype.sayhi = function(){// sayhi here} console.log(p1.sayhi()== p2.sayhi()); // true Console.log(p1.sayhi()== p2.sayhi()); // true Console.log(p1.sayhi()=== p2.sayhi()); //真実上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。