初学者跪着学JavaScript Day7 : 资料型别 : Symbol

一日客家话:中文:茄子 客语:雕吹
当作是一种语言扩充机制

  • primitive data type
  • 非字串Property特性的名称用途
  • 不支持new Symbol(),不是建构子所以无法和new使用
  • Symbol(描述Symbol)会产生唯一 unique Symbol,可以解决相同名被覆盖
  • 没有literal 语法所以要建立需呼叫Symbol()
  • 不能进行四则运算
  • 属性无法使用for in
    但可以使用reflect.ownKeys 取得key name

当你想要做共享Symbol可以使用 Symbol.for()

JavaScript有一个全域的Symbol registry注册状态(犀牛JS大全翻译)

  • Symbol.for("key")
    • key会在全域的Symbol registry(全域符号注册表)找寻
    • 当字串关联的Symbol值相同会返回相同的Symbol
    • 当字串关联的Symbol值不相同就会在Symbol registry创新的Symbol

Symbol.for() function 和 Symbol() function 是不一样的

Symbol()不会回传相同的值
Symbol.for()相同字串关联就会回传相同值


建立Symbol

方式一:Symbol() function

let s = Symbol('wendy');
console.log(typeof s); //symbol

方式二:Symbol.for() function

let c = Symbol.for('wendy');
console.log(c, typeof c);//Symbol(wendy) symbol

Symbol( )有唯一性

let a = Symbol('wendy');
let b = Symbol('wendy');
console.log(a===b)//false

Symbol.for()

let c = Symbol.for('wendy');
let d = Symbol.for('wendy');

console.log(c === d);//true
console.log(c, typeof c);//Symbol(wendy) symbol
console.log(d, typeof d);//Symbol(wendy) symbol
let a = Symbol('wendy');
let b = Symbol('wendy');
console.log(a, typeof a);//Symbol(wendy) symbol
console.log(b, typeof b);//Symbol(wendy) symbol
console.log(a === b);//false

let string = a.toString();
console.log(string);//Symbol(wendy)

无法四则运算:

let value1 = Symbol('1');
let value2 = Symbol('2');
console.log(value1 + value2);//error

一个基本的物件:是由properties特性:key和value 组成的无序群集
properties name(key) : 通常是字串
物件里的key 使用 Symbol

let apple = Symbol('red apple');
let myFruit = {
    [apple]: '2',
};


console.log(myFruit);
//{ [Symbol(red apple)]: '2' }
console.log(Object.getOwnPropertyNames(myFruit));
//[]
console.log(Object.getOwnPropertySymbols(myFruit)); 
//[ Symbol(red apple) ]

getOwnPropertyNames:
回传一个array里面放所有Property的Names

getOwnPropertySymbols:
1.返回:symbol的array
2.创建symbol 才有symbol的array

当想要使用相同properties name
因为Symbol 具有唯一性所以不会被覆盖

const fruit = 'fruit';
let symbol1 = Symbol(fruit);
let symbol2 = Symbol(fruit);
let myObject = {};
myObject[symbol1] = 'apple';
myObject[symbol2] = 'banana';
console.log(myObject);
//{ [Symbol(fruit)]: 'apple', [Symbol(fruit)]: 'banana' }

但无法使用:for/in、for...of
for/in:列出object的key值
以Symbol为propertie name是不会被列举

const fruit = 'fruit';
let symbol1 = Symbol(fruit);
let symbol2 = Symbol(fruit);
let myObject = { drink: 'water' };
myObject[symbol1] = 'apple';
myObject[symbol2] = 'banana';
console.log(myObject);
//{ drink: 'water', [Symbol(fruit)]: 'apple', [Symbol(fruit)]: 'banana' }
console.log(myObject[symbol1]); //apple
console.log(myObject[symbol2]); //banana

for (let x in myObject) {
    console.log(x); //drink
}

尚硅谷 ES6 Symbol的介绍与创建
mdn
ES6 and Typescript Tutorial - 36 - Symbols
JavaScript 大全
The Ultimate Guide to JavaScript Symbol


<<:  Swift 语言和你 SAY HELLO!!

>>:  Day 07:大人更要懂选择-BootstrapVue 部分引入

[D26] 物件侦测(7)

YOLO 是一个不断改进和优化的物件侦测系列,除了前三个版本,在 2020 年时,YOLOv4 也问...

Day30:终於要进去新手村了-结语

今天终於要结束这30天的铁人赛了, 我们就来回顾看看这30天到底都写了些什麽? 虽然说主题是JS, ...

Day26:优化修正

前面在写传送资料这一块时,有些环节没有思考妥当,导致问题丛生,所以这边先进行部分重新调整。 登入和发...

[Day17] 安装 MySQL Server 与 MySQL Workbench

今天我们来安装 MySQL 与操作它的 GUI – MySQL Workbench。 安装 MySQ...

Day 5 - 建立测试计画

出於书本 Chapter 3. Developing Your Ethical Hacking Pl...