Rumah > Artikel > hujung hadapan web > Mengapa terdapat jenis Simbol? Bagaimana untuk menggunakan
Apakah itu Simbol? Mengapa ada perkara sedemikian? Artikel berikut akan memperkenalkan anda kepada jenis Simbol dalam JavaScript dan bercakap tentang cara menggunakannya. Saya harap ia akan membantu anda!
Simbol (simbol) ialah jenis data baharu yang ditambahkan dalam ES6. Simbol ialah nilai primitif (jenis data asas), dan contoh Simbol adalah unik dan tidak boleh diubah. Ia dijana kerana ia digunakan untuk menandakan secara unik dan kemudian digunakan sebagai atribut objek dalam bentuk bukan rentetan untuk memastikan atribut objek menggunakan pengecam unik tanpa risiko konflik atribut. [Cadangan berkaitan: Tutorial pembelajaran javascript]
Fungsi Symbol() boleh menerima parameter rentetan untuk diterangkan, dan kemudian anda boleh menggunakan rentetan ini untuk nyahpepijat kod. Tetapi perlu diingat bahawa walaupun berbilang fungsi Symbol() menerima parameter yang sama, nilainya tidak sama.
let sym = Symbol(); console.log(typeof sym); // symbol2 Gunakan pendaftaran simbol global
let genericSymbol = Symbol(); let otherGenericSymbol = Symbol(); let fooSymbol = Symbol("foo"); let otherFooSymbol = Symbol("foo"); console.log(genericSymbol == otherGenericSymbol); // false console.log(fooSymbol == otherFooSymbol); // false
let fooGlobalSymbol = Symbol.for("foo"); // 创建新符号 let otherFooGlobalSymbol = Symbol.for("foo"); // 重用已有符号 console.log(fooGlobalSymbol === otherFooGlobalSymbol); // trueKejadian yang dibuat oleh Symbol() sentiasa unik dan tidak akan sama dengan kejadian lain hanya kerana parameter yang anda lalui adalah sama Walau bagaimanapun, jika tika yang dibuat oleh Symbol.for() mempunyai parameter yang sama, mereka akan menjadi sama, kerana mereka akan berkongsi contoh Simbol yang sama
3 Gunakan simbol sebagai atribut
let fooSymbol = Symbol("foo"); let otherFooSymbol = Symbol("foo"); console.log(fooSymbol == otherFooSymbol); // false let fooGlobalSymbol = Symbol.for("foo"); // 创建新符号 let otherFooGlobalSymbol = Symbol.for("foo"); // 重用已有符号 console.log(fooGlobalSymbol === otherFooGlobalSymbol); // true
let s1 = Symbol("foo"), s2 = Symbol("bar"), s3 = Symbol("baz"), s4 = Symbol("qux"); let o = { [s1]: "foo val", }; // 这样也可以:o[s1] = 'foo val'; console.log(o); // {Symbol(foo): foo val} Object.defineProperty(o, s2, { value: "bar val" }); console.log(o); // {Symbol(foo): foo val, Symbol(bar): bar val} Object.defineProperties(o, { [s3]: { value: "baz val" }, [s4]: { value: "qux val" }, }); console.log(o); // {Symbol(foo): foo val, Symbol(bar): bar val, // Symbol(baz): baz val, Symbol(qux): qux val}Buat tika Symbol. Apabila digunakan sebagai atribut objek, jika simbol ditukar tanpa mengisytiharkan pembolehubah untuk penerimaan pada permulaan, maka semua atribut simbol objek mesti dilalui untuk mencari kunci atribut yang sepadan:
4. Simbol terbina dalam yang biasa digunakan
let o = { [Symbol("foo")]: "foo val", [Symbol("bar")]: "bar val", }; console.log(o); // {Symbol(foo): "foo val", Symbol(bar): "bar val"} let barSymbol = Object.getOwnPropertySymbols(o).find(symbol => symbol.toString().match(/bar/)); console.log(barSymbol); // Symbol(bar)
5. Symbol.asyncIterator
6. hasInstance
Jika anda mentakrifkan semula sifat Symbol.hasInstance bagi sesuatu fungsi, anda boleh membenarkan kaedah instanceof mengembalikan sesuatu yang tidak dijangka
function Foo() {} let f = new Foo(); console.log(f instanceof Foo); // true class Bar {} let b = new Bar(); console.log(b instanceof Bar); // trueSymbol.isConcatSpreadabl
class Bar {} class Baz extends Bar { static [Symbol.hasInstance]() { return false; } } let b = new Baz(); console.log(Bar[Symbol.hasInstance](b)); // true console.log(b instanceof Bar); // true console.log(Baz[Symbol.hasInstance](b)); // false console.log(b instanceof Baz); // false
Symbol.isConcatSpreadable Kesan sepadan
true: Tambah keseluruhan objek Tambahkan pasangan pada tatasusunan
8 Symbol.iteratorlet initial = ["foo"]; let array = ["bar"]; console.log(array[Symbol.isConcatSpreadable]); // undefined console.log(initial.concat(array)); // ['foo', 'bar'] array[Symbol.isConcatSpreadable] = false; console.log(initial.concat(array)); // ['foo', Array(1)] let arrayLikeObject = { length: 1, 0: "baz" }; console.log(arrayLikeObject[Symbol.isConcatSpreadable]); // undefined console.log(initial.concat(arrayLikeObject)); // ['foo', {...}] arrayLikeObject[Symbol.isConcatSpreadable] = true; console.log(initial.concat(arrayLikeObject)); // ['foo', 'baz'] let otherObject = new Set().add("qux"); console.log(otherObject[Symbol.isConcatSpreadable]); // undefined console.log(initial.concat(otherObject)); // ['foo', Set(1)] otherObject[Symbol.isConcatSpreadable] = true; console.log(initial.concat(otherObject)); // ['foo']
该属性会返回一个 Generator 函数,for of 就会依次的去调用 next()方法,这就是为什么 for of 可以使用在某些对象身上。
class Emitter { constructor(max) { this.max = max; this.idx = 0; } *[Symbol.iterator]() { while (this.idx < this.max) { yield this.idx++; } } } function count() { let emitter = new Emitter(5); for (const x of emitter) { console.log(x); } } count(); // 0 // 1 // 2 // 3 // 4
根据 ECMAScript 规范,这个符号作为一个属性表示“一个正则表达式方法,该方法用正则表达式去匹配字符串。由 String.prototype.match()方法使用”。
String.prototype.match()方法会使用以 Symbol.match 为键的函数来对正则表达式求值。所以更改一个正则表达式的 Symbol.match 属性,可以让 String.prototype.match()得到你想要的值
console.log(RegExp.prototype[Symbol.match]); // ƒ [Symbol.match]() { [native code] } console.log("foobar".match(/bar/)); // ["bar", index: 3, input: "foobar", groups: undefined] class FooMatcher { static [Symbol.match](target) { return target.includes("foo"); } } console.log("foobar".match(FooMatcher)); // true console.log("barbaz".match(FooMatcher)); // false class StringMatcher { constructor(str) { this.str = str; } [Symbol.match](target) { return target.includes(this.str); } } console.log("foobar".match(new StringMatcher("foo"))); // true console.log("barbaz".match(new StringMatcher("qux"))); // false
这个符号作为一个属性表示“一个正则表达式方法,该方法返回字符串中 匹配正则表达式的索引。由 String.prototype.search()方法使用”
这个符号作为一个属性表示“一个函数值,该函数作为创建派生对象的构 造函数”。
这个符号作为一个属性表示“一个正则表达式方法,该方法在匹配正则表 达式的索引位置拆分字符串。由 String.prototype.split()方法使用”。
这个符号作为一个属性表示“一个方法,该方法将对象转换为相应的原始 值。由 ToPrimitive 抽象操作使用”
这个符号作为一个属性表示“一个字符串,该字符串用于创建对象的默认 字符串描述。由内置方法 Object.prototype.toString()使用”
这个符号作为一个属性表示“一个对象,该对象所有的以及继承的属性, 都会从关联对象的 with 环境绑定中排除
更多编程相关知识,请访问:编程视频!!
Atas ialah kandungan terperinci Mengapa terdapat jenis Simbol? Bagaimana untuk menggunakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!