深切明白ES6笔记(六)Symbol与Symbol属性

主要知识点:建立标记值、运用标记值、同享标记值、标记值转换。检索标记值属性以及着名标记

《深切明白ES6笔记(六)Symbol与Symbol属性》

《深切明白ES6》笔记 目次

ES5 的对象属性名都是字符串,这轻易形成属性名的争执。比方,你运用了一个别人供应的对象,但又想为这个对象增加新的要领(mixin 形式),新要领的名字就有可能与现有要领发生争执。假如有一种机制,保证每一个属性的名字都是举世无双的就好了,如许就从根本上防备属性名的争执。这就是 ES6 引入Symbol的缘由。

ES6 引入了一种新的原始数据范例Symbol,示意举世无双的值。它是 JavaScript 言语的第七种数据范例,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

建立标记值

let firstName = Symbol();
let person = {};
person[firstName] = "Nicholas";
console.log(person[firstName]); // "Nicholas"
console.log(firstName ); // Symbol()
typeof firstName //"symbol"

由于标记值是基础范例的值,因而挪用 new Symbol() 将会抛出毛病。你可以经由过程 new

Object(yourSymbol) 来建立一个标记实例,但尚不清晰这能有什么作用。

Symbol 函数还可以接收一个分外的参数用于形貌标记值,该形貌并不能用来访问对应属性,可以用于调试;

let firstName = Symbol("first name");
let person = {};
person[firstName] = "Nicholas";
console.log("first name" in person); // false
console.log(person[firstName]); // "Nicholas"
console.log(firstName); // "Symbol(first name)"

运用标记值

可以在恣意能运用“需盘算属性名”的场所运用标记,还可以在Object.defineProperty()Object.defineProperties() 挪用中运用它:

let firstName = Symbol("first name");
// 运用一个需盘算字面量属性
let person = {
[firstName]: "Nicholas"
};
// 让该属性变成只读
Object.defineProperty(person, firstName, { writable: false });
let lastName = Symbol("last name");
Object.defineProperties(person, {
    [lastName]: {
        value: "Zakas",
        writable: false
    }
});
console.log(person[firstName]); // "Nicholas"
console.log(person[lastName]); // "Zakas"

同享标记值

假如需要在运用中需要在两个差别的对象范例中运用同一个标记属性,用来示意一个唯一标识符,可以运用Symbol.for()建立同享标记值;
Symbol.for()要领仅接收单个字符串范例的参数,作为目的标记值的标识符,同时此参数也会成为该标记的形貌信息。

let uid = Symbol.for("uid");
let object = {};
object[uid] = "12345";
console.log(object[uid]); // "12345"
console.log(uid); // "Symbol(uid)"

先搜刮全局标记注册表,假如已有,则返回这个已存在的标记值;不然,会建立一个新的标记值,并运用该键值将其记录到全局标记注册表中,然后返回这个新的标记值。

let uid = Symbol.for("uid");
let object = {
    [uid]: "12345"
};
console.log(object[uid]); // "12345"
console.log(uid); // "Symbol(uid)"
let uid2 = Symbol.for("uid");
console.log(uid === uid2); // true
console.log(object[uid2]); // "12345"
console.log(uid2); // "Symbol(uid)"

Symbol.keyFor() 要领在全局标记注册表中依据标记值检索出对应的键值:

let uid = Symbol.for("uid");
console.log(Symbol.keyFor(uid)); // "uid"
let uid2 = Symbol.for("uid");
console.log(Symbol.keyFor(uid2)); // "uid"
//uid3在全局注册表中并不存在,会返回undefined
let uid3 = Symbol("uid");
console.log(Symbol.keyFor(uid3)); // undefined

标记值的转换

范例转换是 JS 言语主要的一部分,可以异常天真地将一种数据范例转换为另一种。但是标记范例在举行转换时异常不天真,由于其他范例缺少与标记值的合理等价,尤其是标记值没法被转换为字符串值或数值,在逻辑运算符中会被以为等价于 true。

let uid = Symbol.for("uid"),
desc = uid + ""; // 激发毛病!
// 运用console.log()  来展现标记值的输出,能这么做是由于自动挪用了标记的  String()  要领来发生输出。你也可以直接挪用  String()  要领来猎取雷同效果
let uid = Symbol.for("uid"),
desc = String(uid);
console.log(desc); // "Symbol(uid)"

检索标记属性

Object.keys() 与 Object.getOwnPropertyNames() 要领可以检索对象的一切属性称号,但不能返回标记范例的属性,ES6 新增Object.getOwnPropertySymbols() 要领,以便让你可以检索对象的标记范例属性。
Object.getOwnPropertySymbols() 要领会返回一个数组,包含了对象自有属性名中的标记值:

let uid = Symbol.for("uid");
let object = {
    [uid]: "12345"
};
let symbols = Object.getOwnPropertySymbols(object);
console.log(symbols.length); // 1
console.log(symbols[0]); // "Symbol(uid)"
console.log(object[symbols[0]]); // "12345"
    原文作者:sevencui
    原文地址: https://segmentfault.com/a/1190000016111274
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞