JavaScript符号
JavaScript ES6引入了一种称为Symbol
的新原始数据类型。符号是不可变的(无法更改)并且是唯一的。例如,
// two symbols with the same description
let value1 = Symbol('hello');
let value2 = Symbol('hello');
console.log(value1 === value2); // false
尽管value1和value2都包含相同的描述,但它们是不同的。
创建符号
您可以使用Symbol()
函数创建一个Symbol
。例如,
// creating symbol
const x = Symbol()
typeof x; // symbol
您可以传递一个可选的字符串作为其描述。例如,
const x = Symbol('hey');
console.log(x); // Symbol(hey)
访问符号说明
要访问符号说明,请使用.
运算符。例如,
const x = Symbol('hey');
console.log(x.description); // hey
将符号添加为对象键
您可以使用方括号[]
将符号添加为对象中的键 。例如,
let id = Symbol("id");
let person = {
name: "Jack",
// adding symbol as a key
[id]: 123 // not "id": 123
};
console.log(person); // {name: "Jack", Symbol(id): 123}
for … in循环中不包含符号
for...in
循环不会遍历Symbolic属性。例如,
let id = Symbol("id");
let person = {
name: "Jack",
age: 25,
[id]: 12
};
// using for...in
for (let key in person) {
console.log(key);
}
输出
name
age
在对象中使用符号的好处
如果在各种程序中使用相同的代码段,则最好在对象键中使用Symbols
。这是因为您可以在不同的代码中使用相同的键名,并避免重复问题。例如,
let person = {
name: "Jack"
};
// creating Symbol
let id = Symbol("id");
// adding symbol as a key
person[id] = 12;
在上面的程序中,如果person
对象也被另一个程序使用,那么您就不想添加可以被另一个程序访问或更改的属性。因此,通过使用Symbol
,可以创建可以使用的唯一属性。
现在,如果另一个程序也需要使用名为id的属性,只需添加一个名为id
的符号,就不会出现重复问题。例如,
let person = {
name: "Jack"
};
let id = Symbol("id");
person[id] = "Another value";
在上述程序中,即使使用相同的名称存储值, Symbol
数据类型也将具有唯一值。
在上面的程序中,如果使用了字符串键,则后面的程序将更改属性的值。例如,
let person = {
name: "Jack"
};
// using string as key
person.id = 12;
console.log(person.id); // 12
// Another program overwrites value
person.id = 'Another value';
console.log(person.id); // Another value
在上面的程序中,第二个user.id
覆盖了先前的值。
符号方法
Symbol有多种可用方法。
Method | Description |
---|---|
for() |
Searches for existing symbols |
keyFor() |
Returns a shared symbol key from the global symbol registry. |
toSource() |
Returns a string containing the source of the Symbol object |
toString() |
Returns a string containing the description of the Symbol |
valueOf() |
Returns the primitive value of the Symbol object. |
示例:符号方法
// get symbol by name
let sym = Symbol.for('hello');
let sym1 = Symbol.for('id');
// get name by symbol
console.log( Symbol.keyFor(sym) ); // hello
console.log( Symbol.keyFor(sym2) ); // id
符号属性
Properties | Description |
---|---|
asyncIterator |
Returns the default AsyncIterator for an object |
hasInstance |
Determines if a constructor object recognizes an object as its instance. |
isConcatSpreadable |
Indicates if an object should be flattened to its array elements |
iterator |
Returns the default iterator for an object |
match |
Matches against a string |
matchAll |
Returns an iterator, that yields matches of the regular expression against a string |
replace |
Replaces matched substrings of a string |
search |
Returns the index within a string that matches the regular expression |
split |
Splits a string at the indices that match a regular expression |
species |
Create derived objects |
toPrimitive |
Converting an object to a primitive value |
toStringTag |
Used for the default description of an object |
description |
String containing the description of the symbol |
示例:符号属性示例
const x = Symbol('hey');
// description property
console.log(x.description); // hey
const stringArray = ['a', 'b', 'c'];
const numberArray = [1, 2, 3];
// isConcatSpreadable property
numberArray[Symbol.isConcatSpreadable] = false;
let result = stringArray.concat(numberArray);
console.log(result); // ["a", "b", "c", [1, 2, 3]]