资讯专栏INFORMATION COLUMN

ES6 symbol类型详解

Yi_Zhi_Yu / 1021人阅读

摘要:一定义类型是新的原始数据类型,表示独一无二的值,其他的原始数据类型还有,属于复杂数据类型。三值作为对象值作为属性名时不能使用点运算定义属性时,必须放在方括号内,与普通键值进行区分。值可显示地转换成字符串。可以显示或隐式转成,却不能转成数值。

一、定义
symbol类型是新的原始数据类型,表示独一无二的值,其他的原始数据类型还有Number,String,Boolean,Null,Undefined;Object属于复杂数据类型。

二、参数

1、Symbol函数接受字符串作为参数,控制台输出时,比较容易区分。

2、Symbol函数的参数仅表示Symbol值得描述,相同的参数返回值也不一样

var a = Symbol("a"); 
var b = Symbol("a");
a === b   //false

3、Symbol.for()可以生成同一个Symbol值。

请输入代码
var a = Symbol.for("a"); 
var b = Symbol.for("a");
a === b   //true

Symbol.for()生成的名字是全局环境的,可以在不同的iframe中给取到值。

三、Symbol值作为对象
1、Symbol值作为属性名时不能使用点运算
2、定义属性时,必须放在方括号内,与普通键值进行区分。

var a = Symbol("a");
var obj = {
   a: "normal key",
  [a]: "symbol key"    
}

3、Symbol值定义的属性属于公开属性,普通方法无法遍历。

//如上例
Obj.getOwnProperty()   //["a"]
Obj.getOwnPropertySymbols() //[Symbol("a")]

Refelect.ownKeys() // ["a", Symbol("a")]

4、利用Symbol的特性可定义内部私有属性或方法

function getObj (obj) {
   let privateKey = symbol("privateKey"),
       objCopy = ...obj || {};
   objCopy[privateKey] = function privateFunc () {
       console.log("privateFunc ")
   }
   return objCopy;
}

let newObj = getObj();
newObj[privateKey]  // 报错,外部无法获取到privateKey的值
newObj[symbol("privateKey")]  //undefined,此时的symbol已经变成新的symbol值

三、注意点
1、Symbol值不能进行隐式转换,因此它与其他类型的值进行运算,会报错。

2、Symbol值可显示地转换成字符串。

var a = Symbol("a");
a.toString()   // "Symbol(a)"

3、可以显示或隐式转成Boolen,却不能转成数值。

var a = Symbol("a");
Boolean(a)  //true
if (a) { 
   console.log(a);
}   //Symbol("a") 打印出来地Symbol值会带上参数,便于区分

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

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

相关文章

  • ES6之Object.assign()详解

    摘要:另外,本文版权归原作者所有,翻译仅用于学习。因为值具有唯一性,这就意味着作为对象的属性名时,可以保证不会出现同名的属性。不过,这个提议在中被拒绝了,也许之后的版本会再考虑。事实上,与都有语法解决构造器中属性名重复的问题。 译者按: 这篇博客将介绍ES6新增的Object.assign()方法。 原文: ECMAScript 6: merging objects via Object...

    niceforbear 评论0 收藏0
  • ES6的Iterator对象详解

    摘要:实现原理创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。具体来说,就是返回一个包含和两个属性的对象。接口部署在对象的属性上可以调用这个属性,就得到遍历器对象。 Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。 第一次调用指针对象的next方法,可以将指针指向数据结构的第一...

    KoreyLee 评论0 收藏0
  • JavaScript 运算符规则与隐式类型转换详解

    摘要:我们再来回顾下文首提出的这个比较运算,首先为对象,则调用函数将其转化为字符串对于右侧的,首先会进行显式类型转换,将其转化为。 JavaScript 运算符规则与隐式类型转换详解 从属于笔者的现代 JavaScript 开发:语法基础与工程实践系列文章,主要探讨 JavaScript 中令人迷惑的加减乘除与比较等常见运算中的规则与隐式类型转换;本文中涉及的参考资料全部声明在了JavaSc...

    snifes 评论0 收藏0
  • JavaScript 运算符规则与隐式类型转换详解

    摘要:我们再来回顾下文首提出的这个比较运算,首先为对象,则调用函数将其转化为字符串对于右侧的,首先会进行显式类型转换,将其转化为。 JavaScript 运算符规则与隐式类型转换详解 从属于笔者的现代 JavaScript 开发:语法基础与工程实践系列文章,主要探讨 JavaScript 中令人迷惑的加减乘除与比较等常见运算中的规则与隐式类型转换;本文中涉及的参考资料全部声明在了JavaSc...

    Kyxy 评论0 收藏0
  • ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解

    摘要:变量声明与赋值值传递浅拷贝与深拷贝详解归纳于笔者的现代开发语法基础与实践技巧系列文章。变量声明在中,基本的变量声明可以用方式允许省略,直接对未声明的变量赋值。按值传递中函数的形参是被调用时所传实参的副本。 ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解归纳于笔者的现代 JavaScript 开发:语法基础与实践技巧系列文章。本文首先介绍 ES6 中常用的三种变量声明方式,然后讨论了...

    snowLu 评论0 收藏0

发表评论

0条评论

Yi_Zhi_Yu

|高级讲师

TA的文章

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