javascript高级程序设计阅读收获(3.4.7)——Symbol类型

1.Symbol类型是什么,有什么用

Symbol可以定义为一个符号,一种标识符,用来区分某些东西。

2.创建一个符号

  1. 通过Symbol来创建,Symbol不是一个构造方法,所以不能够使用new操作符。
let sym = Symbol();
let sym = Symbol("aaa");//"aaa"是这个符号的description(描述)
  1. 两个description相同的符号,并不是同一个符号。两个没有description的符号,也不是同一个符号。
let sym1 = Symbol("aaa");
let sym2 = Symbol("aaa");
console.log(sym1 == sym2);//控制台输出结果为false
let sym3 = Symbol();
let sym4 = Symbol();
console.log(sym3 == sym4);//控制台输出结果为false
  1. Symbol不能通过new构造函数来创建,所以不能够创建符号包装对象,如果确实想用符号包装对象,可以借用Object函数。
let sym = Symbol();
let symbolObject = Object(sym);
console.log(typeof symbolObject);//输出结果为object
  1. 通过全局符号注册表来创建符号。
    Symbol.for()的参数只能是一个字符串,它会检查全局注册表,如果没有找到,就会生成一个新符号添加到注册表中。后续再使用这种方式用相同的字符串创建符号的话,这个字符串在全局注册表中被找到,就会发现存在与该字符串对应的符号,然后就会返回该符号实例。
let symbol1 = Symbol.for("boo");
let symbol2 = Symbol.for("boo");
console.log(symbol1 === symbol2);//控制台输出true
  1. 通过全局符号注册表创建的符号和通过Symbol创建的符号,即使字符串一样,也不是同一个符号。
let symbol1 = Symbol("boo");
let symbol2 = Symbol.for("boo");
console.log(symbol1 === symbol2);//控制台输出false
  1. 通过给Symbol.KeyFor()一个符号参数,返回这个符号的字符串键。(必须是全局符号,否则会返回undefined)
let symbol1 = Symbol("aoo");
let symbol2 = Symbol.for("boo");
console.log(Symbol.KeyFor(symbol1));//控制台打印出undefined
console.log(Symbol.KeyFor(symbol2));//控制台打印出"boo"

3.给对象添加符号属性

  1. 定义一个符号,然后将其作为对象的一个属性。
let s1 = Symbol("foo");
let obj = {[s1]:'value1'};
console.log(obj);

在这里插入图片描述
2. 通过Objdect的defineProperty方法来给对象新添加符号属性。

let s1 = Symbol("bar");
let obj = {};
Object.defineProperty(obj,s1,{value:'value1'});

在这里插入图片描述
3. 通过Object的defineProperties方法来给对象一次性添加多个符号属性

let s1 = Symbol("bar");
let s2 = Symbol("foo");
let obj = {};
Object.defineProperties(obj,{[s1]:{value:'value1'},
							 [s2]:{value:'value2'}});
console.log(obj);

在这里插入图片描述

4.获取对象中的符号属性

  1. 通过Object的getOwnPropertySymbols获取对象中的所有符号属性。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
	[s1]:"value1",
	[s2]:"value2",
	baz: "value3",
	qux: "value4"
};
console.log(Object.getOwnPropertySymbols(obj));

在这里插入图片描述

  1. 通过Object的getOwnPropertyNames获取对象中的非符号属性。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
	[s1]:"value1",
	[s2]:"value2",
	baz: "value3",
	qux: "value4"
};
console.log(Object.getOwnPropertyNames(obj));

在这里插入图片描述
3. 通过Object的getOwnPropertyDescriptors获取对象的所有属性和对应的值。

let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
	[s1]:"value1",
	[s2]:"value2",
	baz: "value3",
	qux: "value4"
};
console.log(Object.getOwnPropertyDescriptors(obj));

在这里插入图片描述

  1. 通过Reflect的ownKeys获取对象的所有属性。
let s1 = Symbol("foo");
let s2 = Symbol("var");
let obj = {
	[s1]:"value1",
	[s2]:"value2",
	baz: "value3",
	qux: "value4"
};
console.log(Reflect.ownKeys(obj));

在这里插入图片描述

5.常用内置符号

  1. Symbol.asyncIterator
  2. Symbol.hansInstance
  3. Symbol.isConcatSpreadable
  4. Symbol.iterator
  5. Symbol.match
  6. Symbol.replace
  7. Symbol.search
  8. Symbol.species
  9. Symbol.split
  10. Symbol.toPrimitive
  11. Symbol.toStringTag
  12. Symbol.unscopables
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子 旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值