一、Symbol数据类型是什么意思?
Symbol是ES6引入的一种新的基本数据类型,表示一种独一无二的值,可以用来作为对象属性名,避免对象属性名的冲突问题。
在JavaScript中,任何类型的值都可以作为对象的属性名,这就导致了可能会出现属性名冲突的情况。而使用Symbol作为属性名,则可以有效解决这个问题。每个Symbol都是唯一的,这意味着即使在不同的对象中使用同一个Symbol作为属性名,它们也不会冲突。
Symbol可以通过Symbol函数创建,也可以通过Symbol类的静态属性直接获取预定义的Symbol值。例如:
// 使用Symbol函数创建Symbol值 let sym1 = Symbol("foo"); let sym2 = Symbol("foo"); console.log(sym1 === sym2); // false // 通过Symbol类的静态属性获取预定义的Symbol值 let sym3 = Symbol.iterator; let sym4 = Symbol.iterator; console.log(sym3 === sym4); // true
二、Symbol数据类型的作用
Symbol的主要作用是用来作为对象属性名,这样可以避免属性名冲突问题。除此之外,Symbol还有一些其他的用途:
1、定义类的私有属性
通过Symbol定义的属性是不可枚举的,在ES6之前,要定义类的私有属性只能使用变量或者函数作用域区分,如下代码所示:
function Person(name) { let age = 10; // 定义私有属性 this.getName = function() { return name; } this.getAge = function() { return age; } } let person = new Person("Tom"); console.log(person.getName()); // "Tom" console.log(person.age); // undefined console.log(person.getAge()); // 10
使用Symbol定义私有属性的代码:
const age = Symbol("age"); // 定义私有属性 class Person { constructor(name) { this.name = name; this[age] = 10; } getName() { return this.name; } getAge() { return this[age]; } } let person = new Person("Tom"); console.log(person.getName()); // "Tom" console.log(person[age]); // undefined console.log(person.getAge()); // 10
2、定义常量
由于每个Symbol都是唯一的,这就可以用来定义常量,如下代码所示:
const COLOR_RED = Symbol("color-red"); const COLOR_GREEN = Symbol("color-green"); const COLOR_BLUE = Symbol("color-blue"); function getBackgroundColor(color) { switch (color) { case COLOR_RED: return "red"; case COLOR_GREEN: return "green"; case COLOR_BLUE: return "blue"; default: return "white"; } } console.log(getBackgroundColor(COLOR_RED)); // "red" console.log(getBackgroundColor(COLOR_GREEN)); // "green" console.log(getBackgroundColor(COLOR_BLUE)); // "blue"
三、Symbol数据类型的使用场景
Symbol的主要使用场景是在对象中作为属性名,以及定义类的私有属性,还可以用来定义常量。
在对象中使用Symbol作为属性名可以避免属性名冲突问题,并且可以使对象的属性更加清晰明了。例如可以使用Symbol.iterator定义一个对象的迭代器,使其支持for…of循环。
const obj = { [Symbol.iterator]() { let i = 0; return { next() { i++; if (i <= 3) { return { value: i, done: false }; } else { return { value: undefined, done: true }; } } } } }; for (let item of obj) { console.log(item); } // 输出 // 1 // 2 // 3
四、Symbol数据类型怎么用?
Symbol可以通过Symbol函数创建,也可以通过Symbol类的静态属性直接获取预定义的Symbol值。Symbol创建时可以给其一个可选的描述符。
// 使用Symbol函数创建Symbol值 let sym1 = Symbol("foo"); // 通过Symbol类的静态属性获取预定义的Symbol值 let sym2 = Symbol.iterator; console.log(sym1); // Symbol(foo) console.log(sym2); // Symbol(Symbol.iterator)
可以使用Symbol作为对象的属性名,以及定义类的私有属性、常量等。例如:
const age = Symbol("age"); // 定义私有属性 const COLOR_RED = Symbol("color-red"); // 定义常量 let obj = { name: "Tom", [age]: 10, // 使用Symbol作为私有属性名 [COLOR_RED]: "#FF0000" // 使用Symbol定义常量 }; console.log(obj.name); // "Tom" console.log(obj[age]); // 10 console.log(obj[COLOR_RED]); // "#FF0000"
五、与Symbol数据类型相关的其他数据类型
1、COBOL数据类型S9
S9是COBOL编程语言中的一种常见的数据类型,表示带符号的数字。与Symbol数据类型没有直接相关性。
2、Decimal数据类型
Decimal数据类型是在.NET Framework中使用的一种用于精确表示小数的数据类型,与Symbol数据类型没有直接相关性。
3、Smallint数据类型
Smallint是SQL编程语言中的一种整数数据类型,表示可以存储的整数范围为-32768到32767。与Symbol数据类型没有直接相关性。
4、JavaScript中Symbol类型
JavaScript中的Symbol类型是ES6之后引入的一种新的基本数据类型。与本文中讨论的Symbol数据类型是同一个类型。
5、数据类型Sym改成Double
将Symbol数据类型改成Double数据类型没有任何实际意义,在JavaScript中Double不是一种基本数据类型。
结束语
Symbol是ES6引入的一种新的基本数据类型,主要用于作为对象属性名,可以有效避免属性名冲突问题。除此之外,还可以使用Symbol定义类的私有属性、常量等。虽然Symbol的应用场景相对较少,但是在特定的场景下确实能够很好地解决问题。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/153450.html