资讯专栏INFORMATION COLUMN

JS数据类型检验

wuyumin / 1853人阅读

摘要:如果此方法在自定义对象中未被覆盖,返回,其中是对象的类型那为什么会报错呢这是为什么呢,因为为构造函数,构造函数本身没有方法。依照原型链关系,构造函数的上游原型链是。所以,你调用本质上是调用,这里需要的参数类型是函数,所以会报错。

我们知道判断数据类型可以用typeof

定义一些数据

let num=1,str="str",bool=true,obj={},arr=[],sy=Symbol("s"),g,reg=/test/,date=new Date()

typeof运算符

typeof num //"number"
typeof str //"string"
typeof bool //"boolean"
typeof g //"undefined"
typeof obj //"object"
typeof arr //"object"
typeof reg//"object"
typeof date //"object"
typeof null //"object"

可以看出来typeof 对基本类型(除了null)可以判断出类型,但是对应对象,没有办法知道具体的类型

instanceof 判断是否为每个类型的实例,通过这个方法可以判断出类型,我们对上述数据进行判断

function Person(){}
let p=new Person()
function Foo(){}
let f=new Foo()
num instanceof Number //false 
str instanceof String //false
arr instanceof Object //true
arr instanceof Array //true 
obj instanceof Object //true 
obj instanceof Array //false 
reg instanceof RegExp //true
date instanceof Date //true

constructor

arr.constructor ===Array //true 
obj.constructor ===Object //true 
str.constructor === String  //true

从输出的结果我们可以看出,除了undefined和null,其他类型的变量均能使用constructor判断出类型。
不过使用constructor也不是保险的,因为constructor属性是可以被修改的,会导致检测出的结果不正确

Object.prototype.toString.call

Object.prototype.toString.call(str) //"[object String]"

Object.prototype.toString.call(obj) //"[object Object]"

Object.prototype.toString.call(null) //"[object Null]"

Object.prototype.toString.call(num) ///"[object Number]"

...

每个对象都有一个toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型

那为什么Object.toString.call(params) 会报错呢?

Object.toString.call(num)

Uncaught TypeError: Function.prototype.toString requires that "this" be a Function at Number.toString () at :1:17

这是为什么呢,因为Object为构造函数,Object构造函数本身没有toString方法。
依照原型链关系,Object构造函数的上游原型链是Function.prototype。
所以,你调用Object.toString.call(param)本质上是调用Function.prototype.toString.call(param),这里需要的参数类型是函数,所以会报错。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102996.html

相关文章

  • javascript 参数检验(一):实现一个方便的参数检验工具

    摘要:本文尝试编写一种参数检查工具,期待能缓解类似问题。为了实现链式调用,返回的是一个特殊的包装对象。如果要打印出检查失败的参数名,需要写成。由于德摩根定律的存在,后的参数表实际上在表达与的关系,比如表示的是参数既不为也不为。 综述 javascript 属于弱类型语言,参数的类型错误只能在运行期发现。当你需要 expose 非常健壮的接口给外部,或者在调试较大项目的时候,你可能会怀念强类型...

    maxmin 评论0 收藏0
  • 利用Object.prototype.toString.call()来进行类型检验

    摘要:会将数组中的每个元素一个个传入给。参考链接与的区别二进行类型检验首先来看一个问题,用来检验类型有什么缺点呢答案是无法准确地检验对象类型。比较好的方式就是用来进行检验。判断是否是对象类型注意使用是不能得到类型的。 一、apply与call的区别 相同点:可以让一个对象调用另一个对象的方法不同点: apply最多只能传入两个参数,第一个为对象,第二个为数组 call能传入多个参数,第一个...

    JackJiang 评论0 收藏0
  • 分享一个超详细的数据分析案例【Python】附ABTest详细介绍

    摘要:确定分流方案使用各类平台分配流量。备择假设与零假设相反,即实验者希望证实的假设。虽然该数据集的统计结果与支付宝的实际规模有偏差,但不影响解决方案的适用性。选定统计方法由于样本较大,故采用检验。 ...

    3fuyu 评论0 收藏0
  • JavaScript数据类型

    摘要:数字十进制直接写二进制前缀八进制前缀十六进制前缀字符串你好转义加,表示特定含义或者本来有特定含义的变为一般字符本意,转义后换行符本意引用,转义后输出本意,转义后制表符本意引用,转义后输出多行字符串布尔符号对象设定设置对象属性名,左边引号可省 数字 NUMBER 十进制 直接写 11.1 .11.1e^2 二进制前缀 0b 八进制前缀 0 十六进制前缀 0x 字符串 str...

    Dogee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<