Symbol类型

  • 用途:创建唯一记号,用作非字符串形式的对象属性
  • 基本用法

  • 不能与new关键字一起作为构造函数使用,否则会报错

  • 全局符号注册表

1.目的:创建并重用符号
2.Symbol.for()以一个字符串作为键,第一次调用时生成一个新符号实例并添加到注册表中,以后使用同样的字符串调用时会先检查注册表,发现存在与字符串对应的符号时就会返回该符号实例


3.Symbol.keyFor()查询全局注册表


4.使用符号作为属性
(1)创建属性的方法:
对象字面量(只能在计算属性语法中使用符号作为属性)、Object.defineProperty()
Object.defineProperties()


(2)返回属性的方法:
Object.getOwnPropertyNames()返回常规属性数组,
Object.getOwnPropertySymbols()返回符号属性数组,
Object.getOwnPropertyDescriptiors()返回同时包含常规属性和符号属性描述符的对象,
Reflect.ownKeys()返回常规属性和符号属性的键


(3)直接创建并用作对象属性的符号不会丢失(符号属性是对内存中符号的一个引用),但如果没有显式地保存对这些符号属性的引用,就必须遍历对象的所有符号属性才能找到相应的属性键:


  • 内置符号
    (1)ES6引入了一组常用的内置符号(well-known symbol),这些内置符号以Symbol工厂函数字符串属性的形式存在,它们暴露了语言的内部行为,这些行为可以直接被我们访问、模拟、重写,典型例子:for-of循环会在对象上使用Symbol.iterator属性,我们可以重新定义它的值来改变for-of迭代对象时的行为
    (2)所有内置符号属性都是不可写、不可枚举、不可配置的
    (3)内置符号其实就是全局函数Symbol()的普通字符串属性,指向一个符号的实例
    (4)引用符号在ECMAScript规范中的名称时,前缀为"@@",如:@@iterator就是指Symbol.iterator
    (具体的常用符号如下,由于现阶段整体框架有待形成,所以这些以后再来展开)
    Symbol.asyncIterator
    Symbol.hasInstance
    Symbol.isConcatSpreadable
    Symbol.iterator
    Symbol.match
    Symbol.replace
    Symbol.search
    Symbol.species
    Symbol.split
    Symbol.toPrimitive
    Symbol.toStringTag
    Symbol.unscopables

Object类型

  • 对象不过就是一组数据和功能的集合
  • ECMAScript中的Object是派生其他对象的基类,类似于Java中的java.lang.Object
  • 创建对象一般通过new操作符后跟要创建对象的名称,通过Object对象的实例可以创建自定义对象

  • Object的属性和方法
    注:Object的所有属性和方法在其派生的对象上同样存在
    (1)constructor:创建当前对象的函数

(2)hasOwnProperty(propertyName):判断实例上是否存在给定的属性,接受的参数为字符串或符号


(3)isPrototypeOf(object):判断当前对象是否为另一个对象的原型


(4)propertyIsEnumerable(propertyName):判断给定的属性是否可以使用for-in语句枚举,接收的参数为字符串


(5)toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境


(6)toString():返回对象的字符串表示


(7)valueOf():返回对象的数值、布尔值或字符串表示


注:宿主对象,如DOM对象或BOM对象并不受ECMAScript-262标准的约束,所以它们有可能不会继承Object

posted on 2021-10-12 00:58  KK的备忘录  阅读(62)  评论(0)    收藏  举报