在本教程中,您将借助示例了解 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 循环不会迭代符号属性。例如,
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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/zsx0728/article/details/124374631
内容来源于网络,如有侵权,请联系作者删除!