ES 6新規データタイプ(Symbol)
25580 ワード
ES 6新規データタイプ(Symbol)
基本タイプと引用タイプはSymbolを知る前に、JSのデータタイプを知る必要があります.JSではデータタイプは2種類に分けられます.基本タイプと引用タイプです.基本タイプ:数値タイプ(Number)、文字タイプ(String)、ブール値タイプ(Boolean)、null、undefined 参照タイプ:オブジェクト ここでSymbolも基本タイプです.
概説ES 6は、新しい元のデータタイプSymbolを導入し、ユニークな値を表し、最大の使用法は、オブジェクトを定義するための唯一の属性名である. Symbol値は他のタイプの値とは演算できません. エラーが発生します. smbolによって得られたシンボルは永遠に等しくありません. Symbol値は、明示的に文字列に変換しても良いし、ブール値に変換しても良いが、数値 には変換できない. ES 2019にSymbolの記述を読み取るためにdescriptionを追加しました. 属性名としてはSymbolの値が等しくないので、Symbolを対象とした属性名は、属性が名前を重ねないことを保証することができます. Symbolは対象属性名としては使えません.演算子は、四角い括弧 を使います. Symbol値が属性名である場合、この属性は共有属性であり、プライベート属性ではなく、クラスの外部アクセス である.
属性名の遍歴Symbolは属性名として遍歴されないいくつかの方法です. for…in、for…ofサイクル中 Object.keys() Object.getOwn PropertyNames() Symbolは属性名として照会できます. Object.getOwn PropertySymbors()
この方法は、現在のオブジェクトのすべてが属性名として使用されているSymbol値である行列を返します.
プライベートメソッドを定義 Symbol.for():同じSymbol値を再利用する 文字列をパラメータとして受け入れ、そのパラメータを名前とするSymbol値があるかどうかを検索します.もしあるなら、このSymbol値を返します.そうでないと、新しいSymbol値を作成して、グローバルに登録します. Symbol.keyFor()方法は、登録されたSymbolタイプ値のkey を返す. Symbol.has Instanceは、instance ofの値に影響を与えることができ、この方法はinstance ofステートメントの使用のために呼び出され、オブジェクトがあるクラスのインスタンスかどうかを確認する. Symbol.isConcat Spreadableは、配列を構成するconcat方法をどのようにスティッチングしても良いですか?オブジェクトに属性を定義するための Symbol.toPrimitiveこの方法は、オブジェクトが値タイプに変換する必要があるときに呼び出すことができ、プログラムの動作に応じてオブジェクトの変換が必要な値を決定することができる. Symbol.toStrigTagこの有名なシンボルはObject.prototype.toStringの戻り値 に影響を及ぼします.
基本タイプと引用タイプはSymbolを知る前に、JSのデータタイプを知る必要があります.JSではデータタイプは2種類に分けられます.基本タイプと引用タイプです.
概説ES 6は、新しい元のデータタイプSymbolを導入し、ユニークな値を表し、最大の使用法は、オブジェクトを定義するための唯一の属性名である.
let syb1 = Symbol();
let syb2 = Symbol();
console.log(syb1) // Symbol()
console.log(typeof syb1) // 'symbol'
console.log(syb1 == syb2) // false
console.log(syb1 === syb2) // false
したがって、Symbolの記述値パラメータが同じであっても、それらの値は同じではなく、記述値が記述の役割を果たしているだけで、Symbol値自体に対して何の変化もしないことを示している.記述値に関して注意すべき点は、Symbol値以外のすべての値を受け入れることである. let s1 = Symbol('foo');
let s2 = Symbol('bar');
let s3 = Symbol(3.6);
let s4 = Symbol({
foo:'bar'});
console.log(s1) // Symbol(foo)
console.log(s2) // Symbol(bar)
console.log(s1.toString()) // "Symbol(foo)"
console.log(s2.toString() )// "Symbol(bar)"
console.log(s3) //Symbol(3.6)
console.log(s4) //Symbol([object Object])
なぜSymbolは基本的な(値)タイプですか?参照タイプではありません.Symbol関数はコンストラクタではないので、new方法を使ってSymbolオブジェクトを生成できません.そうでないと、コンパイラは次のコードを実行するように異常を投げます. new Symbol //TypeError: Symbol is not a constructor
description
const syb1 = Symbol(" ");
const obj = {
a : 1,
b : 2,
[syb1] : 3
}
console.log(obj[syb1]) //3
属性名の遍歴Symbolは属性名として遍歴されないいくつかの方法です.
この方法は、現在のオブジェクトのすべてが属性名として使用されているSymbol値である行列を返します.
const Hero = ( () =>{
const getli = Symbol(); //
return class Hero{
constructor(gong,fang,hp){
this.gong = gong;
this.fang = fang;
this.hp = hp;
}
getgong(){
console.log(this.gong * this.getli(0.8,1.1))
}
[getli](min,max){
return Math.random() * (max - min) + min;
}
}
} )()
const hero = new Hero(50,10,1000);
console.log(hero) //Hero {gong: 50, fang: 10, hp: 1000}
Symbol.for()、Symbol.keyFor() let syb1 = Symbol.for('foo');
let syb2 = Symbol.for('foo');
syb1 === syb2 // true
let syb1 = Symbol.for("foo");
Symbol.keyFor(syb1) // "foo"
let syb2 = Symbol("foo");
Symbol.keyFor(syb2) // undefined
知名な記号(特殊な共有記号) function A() {
}
const a = new A();
console.log(a instanceof A); //true
console.log(A[Symbol.hasInstance](a)); //true
function A() {
}
const a = new A();
Object.defineProperty(A,Symbol.hasInstance, {
value : function(){
return false;
}
})
console.log(a instanceof A); //false
console.log(A[Symbol.hasInstance](a)); //false
const arr1 = [1,2,3];
const arr2 = [4,5,6];
arr2[Symbol.isConcatSpreadable] = false;
const arr3 = arr1.concat(arr2);
console.log(arr3) // [1, 2, 3, [4,5,6]]
const obj = {
a: 1,
b: 2
}
// obj[Symbol.toPrimitive] = function() {
// return 100;
// }
console.log(obj + 123);
console.log(obj * 123);
class Temperature {
constructor(degree) {
this.degree = degree;
}
[Symbol.toPrimitive](type) {
console.log(type)
if (type === "default") {
return this.degree + " ";
} else if (type === "number") {
return this.degree;
} else if (type === "string") {
return this.degree + "℃"
}
}
}
const t = new Temperature(30);
// console.log(t + 1)
console.log(String(t))
class A{
[Symbol.toStringTag] = 'hello'
}
const a = new A();
console.log(a); //A {Symbol(Symbol.toStringTag): "hello"}
console.log(Object.prototype.toString.call(a)); //[object hello]