「javascript現代プログラミング」学習ノート——対象Objectとsmbol
43294 ワード
基礎
リストの最後の属性はコンマで終わるべきです.
多単語を属性名として、[]でアクセスします. 整数属性(ここでいう4つの変更なしに証明書に変換される文字列)は、数字順に並べられた である.は整数属性ではなく、作成時の順序で を並べ替える.
参照コピー
オブジェクトは他の基本タイプとは異なり、オブジェクトは参照によって格納され、コピーされます.基本タイプのコピー:
比較参照
2つのオブジェクト参照相は、同時に
オブジェクトをコピーしてクローンしたり、オブジェクトを統合したりします.属性名が同じであれば、 が上書きされます.を統合した後、複製されたオブジェクトを修正することは、行の変化であり、クローン後の結果に影響を与えない.
オブジェクトの属性が他のオブジェクトの参照である場合は、深さクローンが準備されます.例えば次のこのオブジェクト Object.keys(obj)は、オブジェクト全体のキーを含む配列を返します. Object.values(obj)は、オブジェクトのすべての値を含む配列を返します. Object.entries(obj)は、オブジェクトのすべてのキーペアを含む配列を返します. は、キー属性として . Symbolタイプのキーを取得するには、 を返すことができる.は、
「Symbol」値は一意の識別子を表す.
基本的な使い方作成 Symbolは自動的に文字列 に変換されません.
属性を隠す
対象文字数の中のSymbolは、四角い括弧を使ってくくります. は、点演算子を使用してはいけません.
Symbol.for()
グローバルSymbolレジストリがあります.レジストリからSymbolを読み取るには、
レジストリのキーで名前を返します.
リストの最後の属性はコンマで終わるべきです.
let user = {
name: "John",
age: 30,
}
これはフォロー(triling)またはコンマをかけることといいます.このように属性を追加、削除、移動するのに便利です.すべての行は似ています.多単語を属性名として、[]でアクセスします.
let user = {
name: "John",
age: 30,
"likes birds": true //
};
“likes birds”
は、1つの複数の単語を対象とする属性名である.彼の価値を得るためには、正常なuser.name
のように取得することができません.[]
が必要です.alert(user["likes birds"])//true
先に定義してから使用できます.let key = "likes birds";
delete user[key];
しかし、通常のuser.name
のような点記号は上記のように定義されてはいけない.let key = "name";
alert( user.key ) // undefined
属性の略記function makeUser(name, age) {
return {
name, // name: name
age // age: age
// ...
};
}
存在性チェック===undefined
key in Object
let obj = {
test: undefined
};
alert( obj.test ); // undefined, ?
alert( "test" in obj ); // true, !
for…inlet user = {
name: "John",
age: 30,
isAdmin: true
};
for (let key in user) {
// keys
alert( key ); // name, age, isAdmin
//
alert( user[key] ); // John, 30, true
}
属性の並べ替えlet codes = {
"49": "Germany",
"41": "Switzerland",
"44": "Great Britain",
// ..,
"1": "USA"
};
for(let code in codes) {
alert(code); // 1, 41, 44, 49
}
もしお客様が整数に従いたくないなら、私達は非整数属性の名来の騙しプログラムを使って、各キーの前に“+”
号を追加します. let codes = {
"+49": "Germany",
"+41": "Switzerland",
"+44": "Great Britain",
// ..,
"+1": "USA"
};
for (let code in codes) {
console.log(+code); // 1, 41, 44, 49
console.log(typeof +code);//number
}
let user = {
name: "John",
surname: "Smith"
};
user.age = 25; //
//
for (let prop in user) {
alert( prop ); // name, surname, age
}
オブジェクトの参照参照コピー
オブジェクトは他の基本タイプとは異なり、オブジェクトは参照によって格納され、コピーされます.基本タイプのコピー:
let message = "Hello!";
let phrase = message;
console.log(message,phrase);//Hello! Hello!
phrase = "world";
console.log(message,phrase);//Hello! world
オブジェクトは参照によってコピーされます. let user = {
name : 'John',
}
let admin = user;
console.log(admin,user);//{name: "John"} {name: "John"}
admin.name = 'Peter';
console.log(admin,user)//{name: "Peter"} {name: "Peter"}
オブジェクトがコピーされると、参照はコピーされますが、オブジェクト自体はコピーされていません.つまり、対象は一つの引き出しに相当します.uer
とadmin
は二つの鍵で、admin
で対象となる引き出しの内容を変えました.比較参照
2つのオブジェクト参照相は、同時に
user
および==
を参照してtrueに戻ります.let a = {};
let b = a; //
alert( a == b ); // true,
alert( a === b ); // true
2つのオブジェクトが戻ってくるのは===
です. let a = {};
let b = {}; //
alert(a == b); // false
alert(a === b); //false
オブジェクトを定数false
によって修正されたオブジェクトは修正可能であり、ここでいう修正は修正値であり、参照ではない. const user = {
name: 'aa'
}
user.name = 'bb';
console.log(user.name);//bb
user = {
name: 'cc'
}
console.log(user.name);//Uncaught TypeError: Assignment to constant variable.
Object.assignをコピーして合併します.オブジェクトをコピーしてクローンしたり、オブジェクトを統合したりします.
const
この方法はsrc 1,…,srcCNのこれらすべてのオブジェクトをdestにコピーする.つまり、2番目のパラメータからすべてのオブジェクトの属性が最初のパラメータオブジェクトにコピーされ、destに戻ります. let user = { name: "John" };
let permissions1 = { name: "Peter" };
let permissions2 = { canEdit: true };
Object.assign(user,permissions1,permissions2);
console.log(user);//{name: "Peter", canEdit: true}
permissions1.name = "Happy";
console.log(permissions1.name)//Happy
console.log(user.name);//Peter
Object.assign(dest,[sec1,sec2])
は、循環割当値の代わりに簡単なクローン動作を行う. let user = { name: "John" };
let clone = Object.assign({},user);
console.log(clone)//{name: "John"}
深さクローンオブジェクトの属性が他のオブジェクトの参照である場合は、深さクローンが準備されます.例えば次のこのオブジェクト
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
let clone = Object.assign({},user);
console.log(clone.sizes);//{height: 182, width: 50}
console.log(clone.sizes == user.sizes)//true
user.sizes.height ++;//183
console.log(clone.sizes.height)//183
上記のようにObject.assign
オブジェクトを複製することができないのは、user
のこの参照のみがコピーされているからである.この問題を解決するために、私達はコピーする時にuser[key]のそれぞれの値をチェックします.もしそれが対象であれば、それをもう一回コピーします.これをディープコピーといいます.JavaScriptによって実現されたライブラリlodashは、メソッド名を_といいます.clone Deep(obj) <script src="lodash.js"></script>
<script>
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
let clone = _.cloneDeep(user);
console.log(clone.sizes == user.sizes)//false
オブジェクトのキー、値、アイテムsizes
は、行列オブジェクトを返します.Object.***
を無視することができるSymbol
を使用してSymbolタイプのみを含む配列Object.gatOwnPropertySymbol
方式を使用して「すべて」キーを返すこともできる. let id = Symbol('id');
let user = {
name: "John",
age: 30,
[id]: '123'
};
let result = Object.keys(user);
console.log(result);
// ["name", "age"]
// 0: "name"
// 1: "age"
// length: 2
console.log(typeof result); //object
for (let values of Object.values(user)) {
console.log(values);
}
console.log(Object.getOwnPropertySymbols(user)); //[Symbol(id)]
console.log(Reflect.ownKeys(user));
// ["name", "age", Symbol(id)]
// 0: "name"
// 1: "age"
// 2: Symbol(id)
// length: 3
Symbolタイプ「Symbol」値は一意の識別子を表す.
基本的な使い方
let id = Symbol('id');
Reflect.ownKeys(obj)
のSymbol('id')
は説明である.同じ値の記述も異なる. let id = Symbol('id');
let id1 = Symbol('id');
console.log(id == id1);//false
alert(id)//Uncaught TypeError: Cannot convert a Symbol value to a string
alert(id.toString())//Symbol(id)
alert(id.description);//id
id
および.toString()
を呼び出して説明のみを表示することができます.属性を隠す
let user = { //
name: "John"
};
let id = Symbol("id");
user[id] = 1;
console.log(user[id]); // 1 Symbol
let id1 = Symbol("id");
user[id1] = "Their id value";
console.log(user)// {name: "John", Symbol(id): 1, Symbol(id): "Their id value"}
文字列「id」にSymbol(「id」)を使うとどんなメリットがありますか?アメリカはもう一つのコードに属していますので、もう一つのコードもそれを使っていくつかの操作を実行します.だから私たちはその上に任意のフィールドを加えるべきではないです.これはとても危険です.ただし、Symbolは意外にアクセスされないので、第三者コードが見えないので、Symbolを使うのは問題ないかもしれません.対象文字数の中のSymbol
let id = Symbol("id");
let user = {
name: "John",
[id]: 123 // "id:123"
};
alert(user[id])//123
for…inスキップObject.keysも無視します.let id = Symbol("id");
let user = {
name: "John",
age: 30,
[id]: 123
};
for (let key in user) alert(key); // name, age (no symbols)
// Symbol
alert( "Direct: " + user[id] )
Object.assignは文字列とsmbol属性を同時にコピーします.let id = Symbol("id");
let user = {
[id]: 123
};
let clone = Object.assign({}, user);
alert( clone[id] ); // 123
グローバルSymbolSymbol.for()
グローバルSymbolレジストリがあります.レジストリからSymbolを読み取るには、
symbol.description
を使用してください.呼び出しは、グローバルレジストリを確認し、Symbol.for(key)
として説明されたkey
があれば、Symbol
に戻り、そうでなければ新しいSymbol
を作成し、与えられたSymbol(Symbol(key))
を介してレジストリに格納する.//
let id = Symbol.for("id"); // Symbol ,
// ( )
let idAgain = Symbol.for("id");
// Symbol
alert( id === idAgain ); // true
Symbol.keyFor()レジストリのキーで名前を返します.
// name Symbol
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// Symbol name
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
したがって、非グローバルSymbolには適用されません.let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); // name, Symbol
alert( Symbol.keyFor(localSymbol) ); // undefined,
alert( localSymbol.description ); // name
Symbolがグローバルでないと、それは見つけられなくなり、undefinedに戻ります.