javascript 判断变量类型

Object.prototype.toString

在JS 中,想要判断内置类型,最靠谱的方法,就是通过 Object.prototype.toString

var arr = [];
console.log(Object.prototype.toString.call(arr))  //"[object Array]"

ES3 tostring 方法规范

执行步骤
1. 获取 this 对象的[[class]]属性的值
2. 计算出三个字符串”[object “, 第一步的操作结果Result(1), 以及 “]”连接后的新字符串
3. 返回第二部的操作结果

注:[[Class]] 是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性

注:ES3中的[[Class]]原生属性值一共有10种:”Array”, “Boolean”, “Date”, “Error”, “Function”, “Math”, “Number”, “Object”, “RegExp”, “String”

[[Class]] 定义:

内部属性描述
[[Class]]一个字符串值,表明了该对象的类型

[[Class]] 解释:
所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[Class]]属性的值.[[Class]]属性的值可以用来判断一个原生对象属于哪种内置类型.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值(查看 15.2.4.2).

ES 5.1 tostring 方法

执行步骤
1. 如果 this 的值为 undefined,则返回 “[object Undefined]”
2. 如果 this 的值为 null,则返回 “[object Null]”.
3. 让 O 成为 ToObject(this)的结果
4. 让 class 成为 O 的内部属性[[Class]]的值
5. 返回三个字符串”[object “, class, 以及 “]”连接后的新字符串

注:ES5.1 [[Class]]内部属性值多了两种, arguments对象的[[class]]成了”Arguments”,JSON的[[Class]]的值为”JSON”

ES6 规范

[[Class]]内部属性去掉,取而代之的是 [[NativeBrand]]

[[NativeBrand]] 定义:

内部属性属性值描述
[[NativeBrand]]枚举 NativeBrand 的一个成员该属性的值对应一个标志(tag value),可以用来区分原生对象的类型

[[NativeBrand]] 解释:
[[NativeBrand]]内部属性用来识别某个原生对象是否为符合本规范的某一种特定类型的对象.[[NativeBrand]]内部属性的值为下面这些枚举类型的值中的一个:NativeFunction, NativeArray, StringWrapper, BooleanWrapper, NumberWrapper, NativeMath, NativeDate, NativeRegExp, NativeError, NativeJSON, NativeArguments, NativePrivateName.[[NativeBrand]]内部属性仅用来区分区分特定类型的ECMAScript原生对象.只有在表10中明确指出的对象类型才有[[NativeBrand]]内部属性.

操作步骤
1. 如果this的值为undefined,则返回”[object Undefined]”.
2. 如果this的值为null,则返回”[object Null]”.
3. 让O成为调用ToObject(this)的结果.
4. 如果O有[[NativeBrand]]内部属性,让tag成为表29中对应的值.
5. 否则
1. 让hasTag成为调用O的[[HasProperty]]内部方法后的结果,参数为@@toStringTag.
2. 如果hasTag为false,则让tag为”Object”.
3. 否则,
1. 让tag成为调用O的[[Get]]内部方法后的结果,参数为@@toStringTag.
2. 如果tag是一个abrupt completion,则让tag成为NormalCompletion(“???”).
3. 让tag成为tag.[[value]].
4. 如果Type(tag)不是字符串,则让tag成为”???”.
5. 如果tag的值为”Arguments”, “Array”, “Boolean”, “Date”, “Error”, “Function”, “JSON”, “Math”, “Number”, “Object”, “RegExp”,或者”String”中的任一个,则让tag成为字符串”~”和tag当前的值连接后的结果.
6. 返回三个字符串”[object “, tag, and “]”连接后的新字符串.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值