es6加上symbol的基础数据类型

简介: 【10月更文挑战第22天】ES6中的 `Symbol` 作为一种新的基础数据类型,为JavaScript提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了JavaScript的数据类型体系和编程模式,在实际开发中具有重要的应用价值。

在ES6中,新增了 Symbol 类型,它是一种原始数据类型,与其他基础数据类型(如 NumberStringBooleannullundefined)有所不同

Symbol基础

  • 定义Symbol 是ES6引入的一种新的原始数据类型,表示独一无二的值。它通过调用 Symbol() 函数生成,该函数接受一个可选的描述符作为参数,用于在控制台输出等场景中对 Symbol 值进行描述,但这个描述符不会影响 Symbol 值的唯一性。
let sym1 = Symbol();
let sym2 = Symbol('description');

console.log(sym1); 
console.log(sym2);
  • 唯一性:每次调用 Symbol() 函数都会返回一个全新的、独一无二的 Symbol 值,即使传入相同的描述符,生成的 Symbol 值也是不同的。
let sym3 = Symbol('same description');
let sym4 = Symbol('same description');

console.log(sym3 === sym4);

Symbol作为对象属性名

  • 使用方式Symbol 值可以作为对象的属性名,这是 Symbol 的一个重要应用场景。使用 Symbol 作为属性名可以避免属性名冲突,因为不同的 Symbol 值是唯一的。
let obj = {
   };
let symProp = Symbol('property');

obj[symProp] = 'This is a property with Symbol key';

console.log(obj[symProp]);
  • 属性遍历:使用 Symbol 作为属性名的属性不会被常规的对象属性遍历方法(如 for...inObject.keys() 等)所遍历到,需要使用 Object.getOwnPropertySymbols() 方法来获取对象中所有以 Symbol 为属性名的属性。
let obj2 = {
   
  name: 'Alice',
  [Symbol('age')]: 30
};

for (let key in obj2) {
   
  console.log(key); 
}

let symbolKeys = Object.getOwnPropertySymbols(obj2);
for (let symKey of symbolKeys) {
   
  console.log(symKey, obj2[symKey]); 
}

与其他基础数据类型的对比

与Number、String、Boolean的区别

  • 值的性质NumberStringBoolean 类型的值是可以重复的,并且具有明确的字面量表示形式。而 Symbol 的值是独一无二的,没有字面量形式,必须通过 Symbol() 函数生成。
  • 用途Number 主要用于表示数字数据,如整数、小数等;String 用于表示文本数据;Boolean 用于表示逻辑值 truefalse。而 Symbol 主要用于在对象中创建唯一的属性名,以避免属性名冲突,或者用于实现一些特定的设计模式,如私有属性等。

与null、undefined的区别

  • 含义和用途null 表示一个空值或不存在的对象引用,常用于表示变量的初始值或对象属性的缺失。undefined 表示一个未定义的值,通常用于表示变量声明但未初始化的情况。而 Symbol 是一种具有特定用途的原始数据类型,用于创建唯一标识符。
  • 类型判断:使用 typeof 运算符对 null 进行操作时,返回 object,这是JavaScript中的一个历史遗留问题;对 undefined 进行操作时,返回 undefined;对 Symbol 进行操作时,返回 symbol

实际应用场景

避免属性名冲突

  • 在多人协作开发或使用第三方库时,可能会出现对象属性名冲突的情况。使用 Symbol 作为属性名可以有效地避免这种冲突,确保每个属性都具有唯一的标识符。
let library1 = {
   
  version: '1.0',
  [Symbol('method')]: function() {
   
    console.log('Method from library 1');
  }
};

let library2 = {
   
  version: '2.0',
  [Symbol('method')]: function() {
   
    console.log('Method from library 2');
  }
};

library1[Symbol('method')]();
library2[Symbol('method')]();

模拟私有属性

  • 虽然JavaScript中没有真正的私有属性,但可以利用 Symbol 的唯一性来模拟私有属性。通过在对象内部使用 Symbol 作为属性名,并在外部不暴露该 Symbol,可以实现一定程度上的私有性。
let obj3 = (function() {
   
  let privateSymbol = Symbol('private property');

  return {
   
    setPrivateProperty: function(value) {
   
      this[privateSymbol] = value;
    },
    getPrivateProperty: function() {
   
      return this[privateSymbol];
    }
  };
})();

obj3.setPrivateProperty('This is private');
console.log(obj3.getPrivateProperty());

ES6中的 Symbol 作为一种新的基础数据类型,为JavaScript提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了JavaScript的数据类型体系和编程模式,在实际开发中具有重要的应用价值。

相关文章
|
6月前
|
JavaScript 前端开发
ES6:什么是Symbol?
ES6:什么是Symbol?
74 1
|
6月前
ES6之Symbol
ES6之Symbol
|
2天前
|
设计模式 JavaScript 前端开发
es6加上symbol的基础数据类型
【10月更文挑战第30天】ES6 中的 `Symbol` 作为一种新的基础数据类型,为 JavaScript 提供了一种创建唯一标识符和处理对象属性名冲突的有效方式,丰富了 JavaScript 的数据类型体系和编程模式,在实际开发中具有重要的应用价值。
|
4月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(二)
51 1
|
4月前
|
存储 JavaScript 前端开发
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】(一)
36 0
|
6月前
|
存储 JavaScript
ES6+新特性-Symbol与Set/Map数据结构
ES6 引入了三种新的数据结构:Symbol、Set和Map。Symbol是唯一且不可变的值,常用于定义对象的独特属性;Set存储不重复值,适合数组去重;Map则是键值对集合,键可为任意类型,提供了更灵活的存储方式。这些新数据结构提供了更高效的操作手段,分别解决了属性命名冲突、数据去重和复杂键值对存储的问题。示例展示了如何使用Symbol、Set和Map进行基本操作。
|
6月前
|
JavaScript
js开发:请解释什么是ES6的Symbol,以及它的用途。
ES6的Symbol数据类型创建唯一值,常用于对象属性键(防冲突)和私有属性。示例展示了如何创建及使用Symbol:即使描述相同,两个Symbol也不等;作为对象属性如`obj[symbol1] = 'value1'`;也可作枚举值,如`Color.RED = Symbol('red')`。
51 4
|
6月前
|
JavaScript 前端开发
|
6月前
|
JavaScript 前端开发 开发者