前言

  • 360极速浏览器: 12.0.1476.0 (正式版本) (32 位)
  • 修订版本: 47c49e5a5935cfffa348dcfa6c581f4394327ac8
  • 操作系统: Windows 10 OS Version 2004 (Build 19041.450)
  • JavaScript :V8 7.8.279.23
    注:使用命令 chrome://version/ 查看 JavaScript 版本
  • javascript 查看变量类型
  • 该怎么判断自定义的类型呢?

Object.prototype.toString 查看自定义类型的问题

class MyBook {}
console.log(Object.prototype.toString.call(new MyBook())); // "[object Object]"function MyVideo() {}
console.log(Object.prototype.toString.call(new MyVideo())); // "[object Object]"console.log(Object.prototype.toString.call({})); // "[object Object]"

通过上面的代码可以看出无法区分出 MyBookMyVideo
期望能够获得 [object MyBook][object MyVideo]

Object.prototype.toString 方法的原理

简单理解 Object.prototype.toString 的返回值为:"[object " + @@toStringTag + “]” 。

@@toStringTag 是啥?我没明白是个啥,这里不介绍了。

正确设置自定义类型

class MyBook { get[Symbol.toStringTag](){return "MyBook";} }
console.log(Object.prototype.toString.call(new MyBook())); // "[object MyBook]"function MyVideo() {}
MyVideo.prototype[Symbol.toStringTag]="MyVideo";
console.log(Object.prototype.toString.call(new MyVideo())); // "[object MyVideo]"let myHome = { [Symbol.toStringTag]:"MyHome" };
console.log(Object.prototype.toString.call(myHome)); // "[object MyHome]"

还可以这样:

class MyBook { [Symbol.toStringTag]="MyBook"; }
console.log(Object.prototype.toString.call(new MyBook())); // "[object MyBook]"class MyBook {}
MyBook.prototype[Symbol.toStringTag]="MyBook";
console.log(Object.prototype.toString.call(new MyBook())); // "[object MyBook]"function MyVideo() { this[Symbol.toStringTag]="MyVideo"; }
console.log(Object.prototype.toString.call(new MyVideo())); // "[object MyVideo]"

一个值得思考的问题

不要这样做:

class MyBook {}
let myBook=new MyBook();
myBook[Symbol.toStringTag]="MyBook";
console.log(Object.prototype.toString.call(myBook)); // "[object MyBook]"class MyVideo {}
let myVideo=new MyVideo();
myVideo[Symbol.toStringTag]="MyVideo";
console.log(Object.prototype.toString.call(myVideo)); // "[object MyVideo]"let myHome = {};
myHome[Symbol.toStringTag]="MyHome";
console.log(Object.prototype.toString.call(myHome)); // "[object MyHome]"

提防这个情况:

Object.prototype.toString=function(){return "[object CaiBuDao]";}
console.log(Object.prototype.toString.call(1)); // "[object CaiBuDao]"
console.log(Object.prototype.toString.call("1")); // "[object CaiBuDao]"

参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag
https://www.softwhy.com/article-7583-1.html
https://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html
https://www.cnblogs.com/fundebug/p/why-does-javascript-need-symbol.html

javascript 自定义类型相关推荐

  1. JavaScript 自定义对象

    原文:JavaScript 自定义对象 在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式: ...

  2. 详解JavaScript变量类型判断及domReady原理 写得很好

    原文:详解JavaScript变量类型判断及domReady原理 我们知道,在开发JavaScript时候,经常要判断JavaScript变量类型,此 JavaScript教程 详细介绍JS变量的判断 ...

  3. JavaScript对象类型Object

    前言 系统学习JavaScript,由于有3年的java后端开发经验,并且有2年的JavaScript+Jquery开发经验,所以像编程语言的一些通用知识就直接跳过了,重点关注JavaScript的语 ...

  4. [JavaScript]自定义MessageBox

    前言: 继上文([JavaScript]自定义Title的显示方式)之后,我的工作是进一步增强一些IE所不能提供的东东. 还记得Windows下的MessageBox嘛? IE呢?Alert?Conf ...

  5. JavaScript 自定义对象 及 new()原理与实现 如何完整地手写实现new

    JavaScript 自定义对象 及 new() 原理与实现 作者: 李俊才 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_285502 ...

  6. JavaScript自定义事件--高级技巧

    观察者模式 事件是JavaScript和浏览器交互的主要途径.事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术. 观察者模式:由两类对象组成,主体和观察者,主体负责发布事件,观察者通过订 ...

  7. 聊一聊JavaScript的类型检测

    JavaScript的类型检测 一共有四种原生办法检测js的类型 1. typeof 2. instanceof 3. constructor 4. Object.prototype.toString ...

  8. JavaScript自定义对象

    JavaScript自定义对象 2.1.类和对象的概念 ​ 所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的存在,可以发现身边很多对象,汽 ...

  9. Oracle type (自定义类型的使用)

    oracle - type type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要 ...

最新文章

  1. 趋势型指标——MACD
  2. 【UIKit】表格 UITableView
  3. APACHE利用Limit模块限制IP连接数
  4. python零基础怎么学-零基础python入门分析,如何做到一个月学会(深思极恐)
  5. Deformable ConvNets--Part4: Deformable Convolutional Networks
  6. 腾讯基于 Flink 的实时流计算平台演进之路
  7. SetForceGroundWindow
  8. 用一个按钮做主窗口,可以吗?
  9. C#正则表达式编程(四)转致周公
  10. remove()方法
  11. Google Kickstart Round.B C. Diverse Subarray
  12. 世界第一个无人机快递网络下月在瑞士运营 物品 30 分钟内可达
  13. [绍棠] Xcode9无线调试教程
  14. Reeder的本地使用
  15. 瑞星杀毒软件网络版2012支持Web日志访问
  16. 搬家后计算机总重启,电脑无故重启是这一个月来的事了,我刚刚搬家电脑搬到新家那用了没几 爱问知识人...
  17. 心得三、做事先做人(转载)
  18. 双硬盘安装win10和linux双系统,双硬盘安装win10+ubuntu18心得
  19. 手工编程铣加工视频教程 铣代码讲解
  20. 服务端向客户端主动发送消息

热门文章

  1. CI Weekly #22 | flow.ci 新版 iOS 构建流程的 4 大变化
  2. MSSQL WITH (NOLOCK) 脏读
  3. PHP计算表达式-栈
  4. 计算机系统和中断的概念
  5. java 调整数组顺序使奇数位于偶数前面
  6. spring整合mybatis是如何配置事务的?
  7. SpringMVC访问静态页面
  8. DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案
  9. ASP.NET GetPostBackEventReference
  10. Mybatis if test 中int integer判断非空的坑