1、js中的数据类型

基本数据类型:Undefined、Null、Boolean、Number、String,Symbol
引用数据类型 :Object

  1. let bool = true;
  2. let num = ;
  3. let str = 'abc';
  4. let und= undefined;
  5. let nul = null;
  6. let arr = [,,,];
  7. let obj = {name:'xiaoming',age:};
  8. let fun = function(){console.log('hello')};
  9. let s1 = Symbol();

2、typeof

  1. console.log(typeof bool); //boolean
  2. console.log(typeof num);//number
  3. console.log(typeof str);//string
  4. console.log(typeof und);//undefined
  5. console.log(typeof nul);//object
  6. console.log(typeof arr);//object
  7. console.log(typeof obj);//object
  8. console.log(typeof fun);//function
  9. console.log(typeof s1); //symbol
typeof可以识别出基本类型boolean,number,undefined,string,symbol,但是不能识别null。不能识别引用数据类型,会把null、array、object统一归为object类型,但是可以识别出function。
所以typeof可以用来识别一些基本类型。

3、instanceof

  1. console.log(bool instanceof Boolean);// false
  2. console.log(num instanceof Number);// false
  3. console.log(str instanceof String);// false
  4. console.log(und instanceof Object);// false
  5. console.log(nul instanceof Object);// false
  6. console.log(arr instanceof Array);// true
  7. console.log(obj instanceof Object);// true
  8. console.log(fun instanceof Function);// true
  9. console.log(s1 instanceof Symbol);// false
从结果中看出instanceof不能识别出基本的数据类型 number、boolean、string、undefined、unll、symbol。
但是可以检测出引用类型,如array、object、function,同时对于是使用new声明的类型,它还可以检测出多层继承关系。
其实也很好理解,js的继承都是采用原型链来继承的。比如objA instanceof A ,其实就是看objA的原型链上是否有A的原型,而A的原型上保留A的constructor属性。
所以instanceof一般用来检测对象类型,以及继承关系。

4、constructor

  1. console.log(bool.constructor === Boolean);// true
  2. console.log(num.constructor === Number);// true
  3. console.log(str.constructor === String);// true
  4. console.log(arr.constructor === Array);// true
  5. console.log(obj.constructor === Object);// true
  6. console.log(fun.constructor === Function);// true
  7. console.log(s1.constructor === Symbol);//true

null、undefined没有construstor方法,因此constructor不能判断undefined和null。
但是他是不安全的,因为contructor的指向是可以被改变。

5、Object.prototype.toString.call

  1. console.log(Object.prototype.toString.call(bool));//[object Boolean]
  2. console.log(Object.prototype.toString.call(num));//[object Number]
  3. console.log(Object.prototype.toString.call(str));//[object String]
  4. console.log(Object.prototype.toString.call(und));//[object Undefined]
  5. console.log(Object.prototype.toString.call(nul));//[object Null]
  6. console.log(Object.prototype.toString.call(arr));//[object Array]
  7. console.log(Object.prototype.toString.call(obj));//[object Object]
  8. console.log(Object.prototype.toString.call(fun));//[object Function]
  9. console.log(Object.prototype.toString.call(s1)); //[object Symbol]

此方法可以相对较全的判断js的数据类型。
至于在项目中使用哪个判断,还是要看使用场景,具体的选择,一般基本的类型可以选择typeof,引用类型可以使用instanceof。

6、综合:

JavaScript 标准文档只给出了一种获取 [[Class]] 值的方法,那就是使用 Object.prototype.toString。

  1. function is(type, obj) {
  2. var clas = Object.prototype.toString.call(obj).slice(8, -1);//slice() 参数8过滤[object ,参数-1,过滤]
  3. return obj !== undefined && obj !== null && clas === type;
  4. }
  5.  
  6. is('String', 'test'); // true
  7. is('String', new String('test')); // true

上面例子中,Object.prototype.toString 方法被调用,this 被设置为了需要获取 [[Class]] 值的对象。

Object.prototype.toString 返回一种标准格式字符串,所以上例可以通过 slice 截取指定位置的字符串,如下所示:

  1. Object.prototype.toString.call([]) // "[object Array]"
  2. Object.prototype.toString.call({}) // "[object Object]"
  3. Object.prototype.toString.call(2) // "[object Number]"

js类型判断:typeof与instanceof的更多相关文章

  1. JS类型判断typeof PK {}.toString.call(obj)

    参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...

  2. JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱

    JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...

  3. 浅谈JS中的typeof和instanceof的区别

    JS中的typeof和instanceof常用来判断一个变量是否为空,或者是什么类型. typeof typeof运算符返回一个用来表示表达式的数据类型的字符串. typeof一般返回以下几个字符串: ...

  4. JS基础-数据类型判断typeof、instanceof、Object.prototype.toString

    typeof用在基本数据类型和函数时,返回其对应类型的描述,对于引用类型都返回为object. instanceof无法判断基本数据类型,对于引用类型数据,返回其其对应类型. Object.proto ...

  5. 类型和原生函数及类型转换(二:终结js类型判断)

    typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...

  6. js类型判断-丰富加好用

    一, 自己有时候写一些东西,要做类型判断,还有测试的时候,对于原生的和jQuery中的类型判断,实在不敢恭维,所以就写了一个好用的类型判断,一般情况都够用的. function test(type) ...

  7. JS类型判断&原型链

    JS类型检测主要有四种 1.typeof Obj 2.L instanceof R 3.Object.prototype.toString.call/apply(); 4.Obj.constructo ...

  8. 看jquery3.3.1学js类型判断的技巧

    需要预习:call , typeof, js数据类型 1. isFunction中typeof的不靠谱 源码: var isFunction = function isFunction( obj ) ...

  9. js类型判断

    console.log('---------------------'); var a="string"; console.log(a); //string var a=1; co ...

随机推荐

  1. JDK + Tomcat 安装 + 制作自定义镜像【第 2 篇 Tomcat】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...

  2. vue模板字符串写法

    1.模板字符串拼接id <div class="thumbnail" :id="`ctrol_${item.id}`"> <i :class= ...

  3. 使用cnpm淘宝镜像

    选装cnpm 1.说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事. 2.官方网址:http://npm.ta ...

  4. Jerry眼中的SAP客户数据模型

    本文Jerry将介绍八款SAP产品中的客户模型.希望您在阅读完本文之后,能对SAP客户模型设计的思路有一个最最粗浅的了解. 由于Jerry水平和精力所限,本文不会详细阐述这些产品里的客户模型设计细节, ...

  5. ASP.NET IHttpModule IHttpHandler IHttpHandlerFactory 拦截请求

    先来看看代码,拦截所有Http请求类.下面包含了两种类的集成 IHttpModule IHttpHandlerFactory using System; using System.Collection ...

  6. Am335x SD卡刷eMMC二

    犹豫前段时间一直在搞另一个项目,Am335x这个BBlack板就放置一边了.前几天把BBlack板重新拿到手,之前搞得给全忘了.SD卡烧写emmC时突然出现了错误,一直找不到原因,今天终于算是有点眉目 ...

  7. 8.caffe:make_mean.sh( 数据平均化 )

    个人实践代码如下: #!/usr/bin/env sh # Compute the mean image from the imagenet training lmdb # N.B. this is ...

  8. Python:出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte问题

    我在导入一个csv文件的时候出现了一个问题 报错的内容是这样的: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in positio ...

  9. Lambda使用深入解析

    这一次继续对Lambda表达式进行深入,因为它实在太重要了,这次会涉及到java.util.function中的一些新的FunctionalInterface的使用,用它来进一步巩固对Lambda表达 ...

  10. 用代理服务加快brew下载速度。方法:curl

    加快brew更新速度的方式:用代理 参考: https://www.zhihu.com/question/31360766常用的ss客户端都自带PAC模式的,比如ShadowsocksX-NG. 再次 ...