资讯专栏INFORMATION COLUMN

ES6 Symbol ,对象匿名(anonymous)属性实现

JowayYoung / 570人阅读

摘要:在运行时环境中,通过调用函数创建值,该函数动态生成匿名的唯一值。创建和使用值的唯一创建方法,是通过调用函数来返回,不支持操作。共享体系提供了一个全局注册表,用于在大文件或多文件代码中追踪值。

Symbol由来

Symbol是ES6引入的新类型,所以在ES5的基础上,JS就有了字符串(string)、数字型(number)、布尔(bool)、null、undefined和Symbol共六种基本类型(bigint ES2016 添加)。

In JavaScript, Symbol is a primitive value.
Symbol是一种原始数据类型
什么是原始数据类型
A value having the data type "symbol" can be referred to as a "symbol value." In the JavaScript run-time environment, a symbol value is created by invoking the function Symbol, which dynamically produces an anonymous, unique value. A symbol may be used as an object property.
具有Symbol数据类型的值被称为"Symbol"值。在JavaScript运行时环境中,通过调用函数Symbol创建Symbol值,该函数动态生成匿名唯一值。
Symbol can have an optional description, but for debugging purposes only.
MDN Symbol
该数据类型通常被用作一个对象属性的键值——当你想让它是私有的时候。例如,symbol 类型的键存在于各种内置的 JavaScript 对象中。同样,自定义类也可以这样创建私有成员。symbol 数据类型具有非常明确的目的,并且因为其功能性单一的优点而突出;一个 symbol 实例可以被赋值到一个左值变量,还可以通过标识符检查类型,这就是它的全部特性。不能对该类型实例使用其他操作符(将“Symbol”类型的实例与 “Number” 类型的实例对比,例如整数 42,该实例就具有将值与其他类型的值进行比较或组合的运算符)。
创建和使用Symbol

Symbol值的唯一创建方法,是通过调用Symbol()函数来返回,不支持new操作。
Symbol接受一个可选参数,可以添加一段文本描述,但这段描述不可用于属性访问。

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

Symbol的描述被存储在内部的[[Description]]属性中,只有当调用Symbol的toString方法才可以读取这个属性,但不能直接在代码里访问[[Description]]。
所有使用计算属性名的地方,都可以使用Symbol。

let firstName = Symbol("first name");

let person = {
    [firstName] : "Tom" 
}

Object.defineProperty(person, firstName, { writable: false});

let lastName = Symbol("last name");

Object.defineProperties(person, {
    [lastName]: {
        value: "Lee",
        writable: false
    }
});

console.log(person[firstName]); // Tome
console.log(person[lastName]); // Lee

const propertyNames = Object.getOwnPropertyNames(person);
console.log(propertyNames); // []

const propertySymbols = Object.getOwnPropertySymbols(person);

console.log(propertySymbols); // [Symbol(first name), Symbol(last name)]
共享体系

Symbol提供了一个全局注册表,用于在大文件或多文件代码中追踪Symbol值。
如果想创建一个可共享的Symbol,需要使用Symbol.for方法。它只接受一个参数,也就是即将创建的Symbol的字符串标识,这个参数也被用作Symbol的描述。

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

Symbol.for方法首先在全局注册表中搜索键值为"uid"的Symbo值,如果存在,直接返回已有的Symbol,否则,创建一个新的Symbol,并使用这个键在Symbol全局注册表中注册,随即返回新创建的Symbol。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105629.html

相关文章

  • 学习笔记——JavaScript 编码规范

    类型 基本类型 - string - number - boolean - null - undefined - symbol(表示独一无二的值,使用时需要注意浏览器是否支持) //example const symbol1 = Symbol(); const symbol2 = Symbol(42); const symbol3 = Symbol(...

    lufficc 评论0 收藏0
  • ES6精华:函数扩展

    摘要:在函数方面的扩展比较丰富也很实用,本篇概括了这中的精华知识。所以无法成为构造函数,不能使用操作符。参数将扩展运算符作用于参数,即为参数。声明式,直接为函数名。通过构造函数生成的,为。函数的属性,在其描述对象的属性上,为函数名。 ES6在函数方面的扩展比较丰富也很实用,本篇概括了这中的精华知识。 1 箭头函数 箭头函数是ES6中定义函数的新形式。 新形式不仅简化了定义方式,更为函数本身...

    lansheng228 评论0 收藏0
  • ECMAScript6

    摘要:返回布尔值标签模板可以紧跟一个函数名后边,该函数将被调用来处理这个模板字符串。其它情况下返回值为在内部,整数和浮点数使用同样的存储方法,所以和被视为同一个值。 简介 ES6目标,让JavaScript变成一个企业级的开发语言,不仅仅限制与前端页面的脚本语言。 标准(Standard): 用于定义与其他事物区别的一套规则 实现(Implementation): 某个标准的具体实施/真实实...

    MSchumi 评论0 收藏0
  • ES6入门之对象的扩展

    摘要:属性的简洁表示法在中允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁。循环遍历对象自身的和继承的可枚举属性不含属性。返回一个数组,包含对象自身的所有属性的键名。 showImg(https://segmentfault.com/img/remote/1460000019259004?w=1282&h=1920); 1. 属性的简洁表示法 在ES6中 允许直接写入变量...

    AWang 评论0 收藏0

发表评论

0条评论

JowayYoung

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<