ES6 数据类型Symbol(符号)(1)

目录

  • 数据类型

    • 数据分类
  • Symbol 数据类型

    • 概述
  • 作为属性名

  • 属性名的遍历

  • 定义一个私有属性

  • 定义一个私有方法

  • Symbol.for(),Symbol.keyFor()

  • 其他方法详解

  • BigInt 数据类型

    • 为什么要引入?
  • BigInt 对象

数据分类


  • 基本类型: 直接存取基本类型

  • 字符串

  • 数值

  • 布尔类型

  • null

  • undefined

  • Symbol(ES6)

  • BigInt(ES2020)

  • 复杂类型: 通过引用的方式存取复杂类型

  • 对象

  • 数组

  • 函数

回到顶部 目录

Symbol 数据类型


概述

为什么要引入该数据类型:

ES5 的对象属性名都是字符串,这容易造成属性名的冲突

Symbol:表示独一无二的值,最大的用法是用来定义对象的唯一属性名,而且它是一个值类型。

let sym1 = Symbol();

let sym2 = Symbol();

console.log(sym1) // Symbol()

console.log(typeof sym1) // ‘symbol’

console.log(sym1 == sym2) // false

console.log(sym1 === sym2) // false

Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述

主要是为了在控制台显示,或者转为字符串时,比较容易区分

let s1 = Symbol(‘foo’);

let s2 = Symbol(‘bar’);

console.log(s1) // Symbol(foo)

console.log(s2) // Symbol(bar)

console.log(s1.toString()) // “Symbol(foo)”

console.log(s2.toString() )// “Symbol(bar)”

  • Symbol 值不能与其他类型的值进行运算,会报错

  • Symbol 值可以显式转为字符串、也可以转为布尔值,但是不能转为数值

  • 在ES2019中增加了一个description可用于读取Symbol的描述.description

作为属性名

Symbol具有唯一性,用于对象的属性名,就能保证不会出现同名的属性

const my = Symbol();

const s = Symbol();

// 1

const a = {};

amy = ‘hello’;

// 2

const b = {

s { … }

};

// 3

const c = {};

Object.defineProperty(a, my, {value: ‘hello’});

  • Symbol 值作为对象属性名时,不能用点运算符

  • Symbol 值作为属性名时,该属性还是公开属性,不是私有属性

属性名的遍历

Symbol 作为属性名不会被查询的几种方法:

  • for…in、for…of循环中

  • Object.keys()

  • Object.getOwnPropertyNames()

  • JSON.stringify()

Symbol 作为属性名可以被获取的方法:

  • Object.getOwnPropertySymbols()方法

该方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值

  • Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名

回到顶部 目录

定义一个私有属性

let size = Symbol(‘size’);

class Count{

constructor(){

this[size] = 0;

}

add(item){

this[this[size]] = item;

this[size] ++;

}

static sizeOf(instance){

return instance[size];

}

}

let x = new Count();

console.log(Count.sizeOf(x));// 0

x.add(‘foo’);

console.log(Count.sizeOf(x));// 1

console.log(Object.keys(x)); // [“0”]

console.log(Object.getOwnPropertyNames(x));// [“0”]

console.log(Object.getOwnPropertySymbols(x));// [Symbol(size)]

// 对象x的size属性是一个 Symbol 值,所以Object.keys(x)、Object.getOwnPropertyNames(x)都无法获取它。这就造成了一种非私有的内部方法的效果

最后

其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《前端开发四大模块核心知识笔记》

最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值