(11)es6——js第7种数据类型symbol和es10新增属性description

创建symbol的方式

// 第一种创建symbol的方式
let s = Symbol();
console.log(s, typeof s); // Symbol() symbol

// 传递一个字符串标识名,实际上s1和s2还是随机的,唯一的
let s1 = Symbol('zhangsan');
let s2 = Symbol('zhangsan');
console.log(s1 === s2); // false
// 第二种symbol.for创建,可以通过后面的标识符查询到,可以与后面的标识符一一对应
let s3 = Symbol.for('zhangsan');
let s4 = Symbol.for('zhangsan');
console.log(s3 === s4); // true

获取symbol的描述信息

let s = Symbol('zhangsan');
console.log(s.description); // zhangsan

注意事项

不能与其它数据类型进行运算

let s5 = Symbol.for('1');
s5 = s5 + 1;// Cannot convert a Symbol value to a number

值是唯一的?分情况!

let s1 = Symbol('zhangsan');
let s2 = Symbol('zhangsan');
let s3 = Symbol.for('zhangsan');
let s4 = Symbol.for('zhangsan');
/* 和 Symbol() 不同的是,用 Symbol.for() 方法创建的的 
symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 
并不是每次都会创建一个新的 symbol,它会首先检查给定的 
key 是否已经在注册表中了。假如是,则会直接返回上次存储
的那个。否则,它会再新建一个。 */
console.log(s1 === s2); // false
console.log(s3 === s4); // true

不能用for-in遍历

let obj = {};
obj[Symbol("1")] = 1;
obj[Symbol("2")] = 2;
for (const key in obj) {
    if (Object.hasOwnProperty.call(obj, key)) {
        console.log(key); // 无输出,遍历不到
        const element = obj[key];
        console.log(element); // 无输出,遍历不到
    }
}

可以使用Reflect.ownKeys来获取定义的对象的所有键名,从而来遍历对象

let obj = {};
obj[Symbol("1")] = 1;
obj[Symbol("2")] = 2;
obj.a = 3;
const result = Reflect.ownKeys(obj);
console.log(result); // [ 'a', Symbol(1), Symbol(2) ]
for (const index of result) {
    console.log(obj[index]); // 3 1 2
}

应用场景

// 当我们需要向一个对象中添加方法时,如果我们不知道对象内部是怎么样的,如果直接添加可能会有命名冲突
let obj = {
    up() {
        console.log("xiangshang");
    },
    down() {
        console.log("xiangxia");
    },
};

let symobj = {
    up: Symbol(),
    down: Symbol(),
};

obj[symobj.up] = function() {
    console.log("我是新添加的up方法");
};

obj[symobj.down] = function() {
    console.log("我是新添加的down方法");
};

console.log(obj);
/* {
  up: [Function: up],
  down: [Function: down],
  [Symbol()]: [Function (anonymous)],
  [Symbol()]: [Function (anonymous)]
} */
obj[symobj.down](); // 我是新添加的down方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LiuJie_Boom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值