対象(Object)の常用方法及び対象コピー
18260 ワード
JavaScriptには「万物はすべて対象」という説があります.元の値以外は対象です.JavaScriptの対象は非常に重要です.今日は相手がよく使う方法と対象をまとめてコピーします.
オブジェクトの使い方: 上はよくある対象の方法です.リンクを参照してください.
オブジェクトコピー:
次のオブジェクトの値は他のオブジェクトに割り当てられます.この場合はJavaScriptでよく見られます.オブジェクトのコピーには、深いコピーと浅いコピーがあります.
コピーを言う前に、私達はまずスタックとスタックの概念を理解します.ヒープ(heap):ヒープメモリの略称で、比較的固定サイズが自動的に割り当てられた記憶空間です. スタック(stack):スタックメモリの略称であり、動的にメモリを割り当て、メモリのサイズが異なる記憶空間である.一般的には基本的なタイプはヒープに格納されていますが、直接記憶されているのは値です.参照の種類はスタックに格納されています.記憶されているのはポインタです.このポインタはメモリのある位置を指しています.このポインタが指す位置は変数を格納する実際の値です. 浅いコピー
一般的には深さコピーとは参照タイプのことです.
引用タイプは直接複製または賦課されたものを浅いコピーと呼び、浅いコピーに対しては二つのオブジェクトの間の関連性が強すぎます.
コピー
参照タイプの内部の値のコピーは、アドレスに関係なく、深コピーと呼ばれる.深度コピーにとって私達が実現したいのは、一つの属性が他の一つの値を変えられないことです.ES 6は、
オブジェクトの使い方:
Object.assign(target,...sources):
は、エニュメレート・属性のすべての値を1つまたは複数のソースオブジェクトからターゲットオブジェクトにコピーするために使用され、ターゲットオブジェクトに戻り、パラメータtargetはターゲットオブジェクトであり、パラメータsourcesはソースオブジェクトである. var person = {};
var people = {
name: "tom",
age: 18,
}
var person1 = Object.assign(person, people)
console.log(person, person1)
// {name: "tom", age: 18},{name: "tom", age: 18}
Object.create(proto,[propertiesObject]):
は新しいオブジェクトを作成し、既存のオブジェクトを使用して新規作成オブジェクトの_u u_uを提供する.proto_パラメータ1は、新規作成対象の原型オブジェクトです.パラメータ2はオプションパラメータであり、ない場合はundefinedを表します.新しい楽しみを返します.プロトタイプのオブジェクトと属性を指定します. // create ;
var person = {
name: "tom",
age: 18
}
var people = Object.create(person);
console.log(people)
// __proto__, __proto__ age: 18 name: "tom"。
Object.defineProperties(obj,props):
は、新しい属性を一つのオブジェクトに直接定義したり、既存の属性を変更したりしてオブジェクトに戻す.obj:属性のオブジェクトを定義または変更します.props:列挙属性または修正可能な属性記述子のオブジェクトを定義するには、オブジェクト内に存在する属性記述子は主に2つの中にあります.データ記述子とアクセスディスクリプタです. var obj = {};
var obj1 = {
value: true,
writable: true
}
var obj2 = {
value: 'hello',
writable: false
}
Object.defineProperties(obj, { obj1, obj2 })
console.log(obj)
// : {obj1: true, obj2: "hello"}
Object.entries():
は、与えられたオブジェクト自体の課のエニュメレート・属性のキー値配列を返し、その配列は、for・・・inサイクルを使用してオブジェクトを巡回したときに戻る順序と一致している(for・・inサイクルエニュメレート・プロトチェーンの属性とは異なる).Object.freeze():
方法は一つのオブジェクトを凍結してもいいです.一つのオブジェクトを凍結したら、このオブジェクトに新しい属性を追加できません.属性があるエニュメレーション性、配置性、書き込み性、および既存の属性の値を変更することができません.また、オブジェクトを凍結しても、そのオブジェクトの原型は変更できません.パラメータと同じオブジェクトを返します.Object.fromEntries(iterable):
はキーパッド値対リストをオブジェクトに変換する.iterable:同様に、反復可能プロトコルArayまたはMapまたは他のオブジェクトを実装する反復可能オブジェクト.反復可能なオブジェクト項目を提供する対応する属性を含む新しいオブジェクトを返します.Objection.is(value1,value2)
は、2つの値が同じかどうかを判断する.二つのパラメータは二つの比較が必要な値です.ブール値が同じかどうかを返します.prototypeObj.isPrototypeOf():
は、オブジェクトが他のオブジェクトのプロトタイプチェーン上に存在するかどうかをテストするために使用される.object.toString():
は、オブジェクトを表す文字列を返します. var arr = [1, 2, 3, 4]
var obj = {
name: "tom",
age: 18
}
console.log(arr.toString(), obj.toString());
// :1,2,3,4 [object Object]
オブジェクトコピー:
次のオブジェクトの値は他のオブジェクトに割り当てられます.この場合はJavaScriptでよく見られます.オブジェクトのコピーには、深いコピーと浅いコピーがあります.
コピーを言う前に、私達はまずスタックとスタックの概念を理解します.
一般的には深さコピーとは参照タイプのことです.
引用タイプは直接複製または賦課されたものを浅いコピーと呼び、浅いコピーに対しては二つのオブジェクトの間の関連性が強すぎます.
var arr = [1, 2, 3];
var arr1 = arr;
arr1[3] = 4;
console.log(arr1, arr)
// :[1,2,3,4] [1,2,3,4]
上のコードのように、オブジェクトの浅いコピーの一つの値が変化し、もう一つの値も変化します.しかし、多くの場合、タイプの属性と方法をコピーしたいだけです.明らかに上の状況はだめです.だから私達は深コピーを使います.コピー
参照タイプの内部の値のコピーは、アドレスに関係なく、深コピーと呼ばれる.深度コピーにとって私達が実現したいのは、一つの属性が他の一つの値を変えられないことです.ES 6は、
Object.assign(target,...sources)
の新たな属性を持っています.私たちの需要を実現してくれます. var obj1 = {
a: 1,
b: 2
};
var obj2 = {};
Object.assign(obj2, obj1);
obj2.a = 3;
console.log(obj1, obj2);
// : {a:1,b:2} {a:3,b:2}
このようにして、私達が欲しい効果を実現しましたが、この場合は1階の深度コピーしかできません.より深いレベルのコピーはまだ伝跡です. var obj1 = [{ a: 1, b: 2 }, 2, 3];
var obj2 = [];
Object.assign(obj2, obj1);
obj2[0].a = 3;
console.log(obj1, obj2);
// :[{ a: 3, b: 2 }, 2, 3] [{ a: 3, b: 2 }, 2, 3]
この状況は私たちが望むのと違っています.二階のコピーにはまだ方法があります. function deepCopy(obj)
if (Array.isArray(obj)) {
var newObj = [];
} else {
var newObj = {};
};
for (var i in obj) {
if (typeof obj[i] == "object") {
newObj[i] = deepCopy(obj[i])
} else {
newObj[i] = obj[i];
}
};
return newObj;
};
var arr = [[1], 2, 3];
var arr1 = deepCopy(arr);
arr1[0].push(2);
console.log(arr, arr1)
// :[[1], 2, 3] [[1,2], 2, 3]
これでディープコピーが実現しました.もう一つの簡単な方法で、より深い深さのコピーを実現します. var obj = { a: [1, 2, 3] };
var obj1 = JSON.parse(JSON.stringify(obj));
obj1.a.push(4);
console.log(obj, obj1)
// : {a: [1, 2, 3]} {a:[1, 2, 3, 4]}
以上の2つの方法でディープコピーが可能です.