ES6中的symbol类型

zgqCodeIP属地: 黑龙江
0.775字数 334

symbol类型(primitive type==原始类型)

symbol类型是es6新增的一个基本数据类型,表示独一无二的值,最大的用法是用来定义对象的唯一属性名

基本用法:

symbol不是一个构造函数,不能使用new来创建,与普通函数调用类似

var s1 = Symbol();//创建了一个symbol的实例
console.log(s1);//Symbol()
console.log(typeof s1);//symbol

symbol可以传递一个字符串参数,参数作用是对symbol类型的描述,便于区分这个symbol是哪一个

var s1 = Symbol("symbol");
console.log(s1);//Symbol(symbol)
console.log(typeof s1);//symbol

symbol类型的值具有唯一性,是一个独一无二的值,每一个 Symbol 的值都不相等。相同参数 Symbol() 返回的值不相等

var s1 = Symbol("symbol");
var s2 = Symbol("symbol");
console.dir(s1 == s2);//false

使用场景:

用于对象中的属性
//使用方式一
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
//以symbol作为属性不能使用点运算符添加属性,用点来添加属性是添加常规字符串属性
//obj.n = "tom";
console.log(obj);//{Symbol(uname): "tom"}
//使用方式二
var n = Symbol("uname");
var obj = {
    [n]:"tom"  //字面量添加symbol属性,必须要用[]
};
console.log(obj);//{Symbol(uname): "tom"}
访问以上添加的symbol属性
console.log(obj[n]);//tom
console.log(obj.n);//undefined
如果对象下同时添加了与symbol同名的常规属性,则使用[]访问的是symbol属性,使用点运算符访问的是常规属性
var n = Symbol("uname");
var obj = {};
obj.n = "jerry";
obj[n] = "tom";
console.log(obj[n]);//tom
console.log(obj.n);//jerry
symbol类型的值具有唯一性,由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。
var n = Symbol("uname");
var n2 = Symbol("uname");
var obj1 = {};
obj1[n] = "tom";
obj1[n2] = "jerry";
console.log(obj1);//{Symbol(uname): "tom", Symbol(uname): "jerry"}
对象中的symbol属性不会被for in遍历
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
for(var key in obj){
    console.log(obj[key]);//无输出
}
对象中的symbol属性不会被 Object.keys(obj) 、Object.values(obj)、 Object.getOwnPropertyNames(obj) 返回。
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
console.log(Object.keys(obj));//[]
console.log(Object.values(obj));//[]
console.log(Object.getOwnPropertyNames(obj));//[]
可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
var n = Symbol("uname");
var obj = {};
obj[n] = "tom";
console.log(Reflect.ownKeys(obj));//[Symbol(uname)]
console.log(Object.getOwnPropertySymbols(obj));//[Symbol(uname)]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
9人点赞
zgqCodeH5大前端
总资产1共写了1.9W字获得101个赞共141个粉丝

推荐阅读更多精彩内容

  • 1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象...
    赵然228阅读 818评论 2 10
  • 本文为阮一峰大神的《ECMAScript 6 入门》的个人版提纯! babel babel负责将JS高级语法转义,...
    Devildi已被占用阅读 2,027评论 0 4
  • 1.属性的简洁表示法 允许直接写入变量和函数 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量...
    雨飞飞雨阅读 1,153评论 0 3
  • 概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加...
    oWSQo阅读 547评论 1 3
  • Symbols 是ES6引入了一个新的数据类型 ,它为JS带来了一些好处,尤其是对象属性时。 但是,它们能为我们做...
    强哥科技兴阅读 769评论 0 0