JavaScript —— Symbol数据类型的拓展

上一篇文章学习了Symbol的基本用法和作用,但对于Symbol的构造器对象,里面还有很多内置方法我们可以研究一下,让我们一起看看吧!

上一篇文章:《传送地址》

一、Symbol.hasInstance

hasInstance?看起来好眼熟。难道它跟我们的某些API有关系?

没错!他就是instanceof!当我们使用这个API判断类型的时候,就会调用这个类型构造器的内置对象属性。我们可以举个例子:

class myObject {static [Symbol.hasInstance](obj) {return obj.constructor === Object}
}console.log({} instanceof myObject) // true
// 相当于 myObject[Symbol.hasInstance]({})
console.log([] instanceof myObject) // false
// 相当于 myObject[Symbol.hasInstance]([])

上面这个例子,我们自己替myObject这个类实现了对应instanceof的内置方法,一般JavaScript的数据类型都内置有这个构造器对象属性,如果没有,则返回false

class myObject {}
console.log({} instanceof myObject) // false

二、Symbol.iterator

当JavaScript的一些数据类型含有Symbol.iterator内置对象属性时,我们把由这种数据类型创建的对象称为可迭代对象

其作用是,当可迭代对象被for...of语句调用时,返回默认的迭代器。在ES6中,ArraySetMapstring都是可迭代对象,他们都被内置了Symbol.iterator对象属性。

什么意思呢?我们举个例子:

const arr = [1, 2, 3, 4, 5];
for (let a of arr) {console.log(a);
}// 输出 1
// 输出 2
// 输出 3
// 输出 4
// 输出 5

其实我们可以把它拆分出来,实际上在执行for...of语句时,本质是下面这样的:

const iterator = arr[Symbol.iterator]();console.log(iterator.next()); // Object {value: 1, done: false}
console.log(iterator.next()); // Object {value: 2, done: false}
console.log(iterator.next()); // Object {value: 3, done: false}
console.log(iterator.next()); // Object {value: 4, done: false}
console.log(iterator.next()); // Object {value: 5, done: false}
console.log(iterator.next()); // Object {value: undefined, done: true}

执行for...of循环的时候,先调用了arr数组的Symbol.iterator方法,由此来获取迭代器对象。接下来就是调用iterator.next()方法将迭代器对象的value属性赋值到a当中,5次迭代之后,该对象的done属性为true,然后循环结束。

当然,我们也可以为自己的类定义集合且来实现可迭代对象:

class myArray {constructor() {this.myArr = [];}add(data) {this.myArr.push(data);return this;}*[Symbol.iterator]() {for (let a of this.myArr) {yield a;}}
}// 1.创建对象
const otherArr = new myArray();
// 2.调用事先定义好的方法
otherArr.add(1);
otherArr.add(2);
otherArr.add(3);
otherArr.add(4);
otherArr.add(5);
// 3.使用for...of调用可迭代对象
for (let b of otherArr) {console.log(b);
}// 输出 1
// 输出 2
// 输出 3
// 输出 4
// 输出 5

反之,如果我们没有为类定义好内置的对象迭代属性,我们使用for...of,就会报错:

class myArray {constructor() {this.myArr = [];}add(data) {this.myArr.push(data);return this;}
}// 1.创建对象
const otherArr = new myArray();
// 2.调用事先定义好的方法
otherArr.add(1);
otherArr.add(2);
otherArr.add(3);
otherArr.add(4);
otherArr.add(5);
// 3.使用for...of调用可迭代对象
for (let b of otherArr) {console.log(b);
}// 输出 Uncaught TypeError: otherArr is not iterable,即 otherArr 不是可迭代对象

三、总结

其实也没有什么好总结的,只是,我们要知道是这个数据类型Symbol它的一些能力即可。上面两点只是我临时起意,就码来玩玩,大家有兴趣的可以继续研究最上面的那个截图~

JavaScript —— Symbol数据类型的拓展相关推荐

  1. JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)

    JavaScript重难点解析1(数据类型) var.let.const区别: 类型补充 "==="."typeof"."instanceof&quo ...

  2. 前端之 JavaScript 常用数据类型和操作

    JavaScript 常用数据类型有:数字.字符串.布尔.Null.Undefined.对象 JavaScript 拥有动态类型 JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型 ...

  3. ES6 Symbol 数据类型

    ES6-Symbol 类型 ES5 除类数组对象(类数组对象名可以为数字,对象必须有 length 属性,可以用数组下标的方式访问对象属性,但不能通过点的方式访问)外,对象属性名都是字符串,这很容易造 ...

  4. 深度解析javaScript常见数据类型检查校验

    前言 在JavaScript中,数据类型分为两大类,一种是基础数据类型,另一种则是复杂数据类型,又叫引用数据类型 基础数据类型:数字Number 字符串String 布尔Boolean Null Un ...

  5. 【核心基础知识】javascript的数据类型

    JavaScript 的数据类型可以分为 7 种:空(Null).未定义(Undefined).数字(Number).字符串(String).布尔值(Boolean).符号(Symbol).对象(Ob ...

  6. 如何判断 JavaScript 的数据类型?

    如何判断 JavaScript 的数据类型? JavaScript 数据类型一共有 8 种: undefined.Null.Boolean.String.Symbol.Number.bigint.Ob ...

  7. JavaScript判断数据类型的方式

    JavaScript判断数据类型的方式 js中的数据类型有哪些? 基本数据类型:number.string.boolean.null.undefined.symbol以及未来ES10新增的BigInt ...

  8. JavaScript 判断数据类型

    JavaScript 判断数据类型 首先JavaScript基本数据类型有:number null undefined string boolean es6以后还新增了bigint和symbol (上 ...

  9. JavaScript判断数据类型的方法

    JavaScript判断数据类型的方法 1 数据类型有哪些? 2 判断JavaScript数据类型的方法 2.1 typeof 2.2 instanceof 2.3 constructor 2.4 t ...

  10. html js定义一个变量的值,JavaScript的数据类型与变量的解析(附示例)

    本篇文章给大家带来的内容是关于JavaScript的数据类型与变量的解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 这篇文章,来聊聊 JS 中的数据类型与变量.这是在学 ...

最新文章

  1. iOS 没到年底NSDate 时间出错问题
  2. base64编码 vba_VB VBA ASP 可通用的基于Base64进行加密和解密的函数
  3. WINCE6.0 error C2220: warning treated as error问题解决
  4. petalinux zynq spi_ZYNQ 系列 01 | PL 实现按键控制 LED(1)
  5. 爱创课堂每日一题第二天8/24日 Quirks模式是什么?它和Standards模式有什么区别?...
  6. monogdb操作system.*权限
  7. 自回归模型/向量自回归模型
  8. TokenInsight:BTC新增人气缺乏,多头持仓量持续上升
  9. 跳出框架iframe的操作语句
  10. Cesium:改变地球背景
  11. vb源代码框中不能用滚轮的解决办法
  12. 【JSP售票系统】JSP+SSH+MSSQL火车票铁路售票系统源码
  13. informix 如何下载
  14. App测试工具大全,收藏这篇就够了
  15. 『码上行动-编程擂台』学员作品展(附源码)
  16. WebStream生成vue项目报错Error: The project seems to require yarn but it‘s not installed.
  17. android 设置路由器,安卓手机如何设置无线路由器 实现WiFi上网
  18. DirectX是什么,出现游戏打不开问题解决方案
  19. 使用IntelliJ Idea新建SpringBoot项目
  20. 微信小程序:for循环与if判断

热门文章

  1. python抽奖教程_详解用python写一个抽奖程序
  2. 【图像融合】基于matlab高斯金字塔+拉普拉斯金字塔彩色水下图像融合【含Matlab源码 1629期】
  3. 【时间序列预测】基于matlab麻雀算法优化LSTM时间序列预测【含Matlab源码 JQ001期】
  4. 【图像处理】基于matlab GUI数字图像处理【含Matlab源码 652期】
  5. 【图像去噪】基于matlab小波变换+Contourlet变换+PCA图像去噪【含Matlab源码 610期】
  6. python惰性_如何创建惰性属性以提高Python的性能
  7. http 响应消息解码_响应生成所需的解码策略
  8. 计算机系统结构自考知识点总结,自考《计算机系统结构》问答题总结(3)
  9. 美国计算机科学本科申请条件,美国计算机专业申请条件
  10. 饿了么分布式KV架构与实践