JavaScript 符号

x33g5p2x  于2022-04-25 转载在 Java  
字(2.7k)|赞(0)|评价(0)|浏览(180)

在本教程中,您将借助示例了解 JavaScript 符号。

JavaScript 符号

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

// two symbols with the same description

const value1 = Symbol('hello');
const 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 循环不会迭代符号属性。例如,

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
在对象中使用符号的好处

如果在不同的程序中使用相同的代码段,那么最好在对象键中使用符号。这是因为您可以在不同的代码中使用相同的键名,从而避免重复问题。例如,

let person = {
    name: "Jack"
};

// creating Symbol
let id = Symbol("id");

// adding symbol as a key
person[id] = 12;

在上面的程序中,如果 person 对象也被另一个程序使用,那么您不希望添加一个可以被另一个程序访问或更改的属性。因此,通过使用符号,您可以创建一个可以使用的唯一属性。
    现在,如果另一个程序也需要使用名为 id 的属性,只需添加名为 id 的符号,就不会出现重复问题。例如,

let person = {
    name: "Jack"
};

let id = Symbol("id");

person[id] = "Another value";

在上述程序中,即使使用相同的名称存储值,符号数据类型也将具有唯一的值。
    在上面的程序中,如果使用了字符串键,那么后面的程序就会更改属性的值。例如,

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 有多种方法可用。

方法描述说明
for()搜索现有符号
keyFor()从全局符号注册表返回一个共享符号键
toSource()返回包含符号对象源的字符串
toString()返回包含符号描述的字符串
valueOf()返回符号对象的基本值
示例:符号方法
// 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(sym1) ); // id
符号属性
属性描述说明
asyncIterator返回对象的默认异步迭代器
hasInstance确定构造函数对象是否将对象识别为其实例
isConcatSpreadable指示是否应将对象展平为其数组元素
iterator返回对象的默认迭代器
match与字符串匹配
matchAll返回一个迭代器,它产生正则表达式与字符串的匹配项
replace替换字符串的匹配子字符串
search返回与正则表达式匹配的字符串中的索引
split在与正则表达式匹配的索引处拆分字符串
species创建派生对象
toPrimitive将对象转换为基本值
toStringTag提供对象的默认描述
description返回包含符号描述的字符串
示例:符号属性示例
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]]

上一教程 :JS Numbers                                          下一教程 :JS try…catch…finally

参考文档

[1] Parewa Labs Pvt. Ltd. (2022, January 1). Getting Started With JavaScript, from Parewa Labs Pvt. Ltd: https://www.programiz.com/javascript/symbol

相关文章