Symbol 类型学习

121 阅读2分钟

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

基本用法:

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

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

//symbol可以传递一个字符串参数,
//参数作用是对symbol类型的描述,便于区分这个symbol是哪一个
let s1 = Symbol('symbol');//创建了一个symbol的实例
console.log(s1);//Symbol(symbol)
console.log(typeof s1);//symbol

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

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

使用场景

  • symbol作为属性不能使用点运算符添加属性,用点来添加属性是添加常规字符串属性
  • 字面量添加symbol属性,必须要用[]
//使用方式一
let n = Symbol("uname");
let obj = {};
obj[n] = "tom";
//以symbol作为属性不能使用点运算符添加属性,用点来添加属性是添加常规字符串属性
//obj.n = "tom";
console.log(obj);//{Symbol(uname): "tom"}
//使用方式二
let n = Symbol("uname");
let obj = {
    [n]:"tom"  //字面量添加symbol属性,必须要用[]
};
console.log(obj);//{Symbol(uname): "tom"}
console.log(obj[n]);//tom
console.log(obj.n);//undefined

如果对象下同时添加了与symbol同名的常规属性,则使用[]访问的是symbol属性,使用点运算符访问的是常规属性

let n = Symbol("uname");
let obj = {};
obj.n = "jerry";
obj[n] = "tom";
console.log(obj[n]);//tom
console.log(obj.n);//jerry

symbol类型的值具有唯一性,由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名

let n = Symbol("uname");
let n1 = Symbol("uname");
let obj1 = {};
obj1[n] = "tom";
obj1[n1] = "jerry";
console.log(obj1);//{Symbol(uname): "tom", Symbol(uname): "jerry"}

对象中的symbol属性不会被for in遍历

let n = Symbol("uname");
let obj = {};
obj[n] = "tom";
for(let key in obj){
    console.log(obj[key]);//无输出
}