📜  JavaScript符号

📅  最后修改于: 2020-09-27 07:43:36             🧑  作者: Mango

在本教程中,您将在示例的帮助下了解JavaScript Symbol。

JavaScript符号

JavaScript ES6引入了一种称为Symbol的新原始数据类型。符号是不可变的(无法更改)并且是唯一的。例如,

// two symbols with the same description

let value1 = Symbol('hello');
let value2 = Symbol('hello');

console.log(value1 === value2); // false

尽管value1value2都包含相同的描述,但它们是不同的。


创建符号

您可以使用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]]