常见的数据类型检测的方法:

一、最为基础的typeof

二、不可不知的instanceof

三、比instanceof更好的constructor

四、检测值或者表达式的结果是否为NaN

五、易用的jQuery函数isArray,isFunction

六、高大上的原型方法Object.prototype.toString


typeof基本数据类型的检测:

语法:typeof  被检测的内容  或者 typeof(要检测的内容)

范例:

<script>
var num=2;
console.log(typeof num);//string
</script>

基本解析:

  typeof是一个运算符,针对一个操作数(操作数可以是变量也可以是常量)进行运算,其返回值是一个字符串,返回值包括"number","string","boolean","undefined","object","function".

<script>
var user;
var obj={
user:''HTML5学堂"
}
var h5course=function(){
console.log("码农");
};
console.log(tyopeof 234);
console.log(tyopeof "html5");
console.log(tyopeof true);
console.log(tyopeof user);
console.log(tyopeof obj);
console.log(tyopeof h5course);
</script>

typeof的局限性:

  typeof的问题在于:针对对象类型数据,无法进行具体细化的检测。对于数组、正则、对象{}、null等数据,虽然均属于对象类型,但却各不相同,使用typeof进行检测时,均返回object

<script>
console.log(tyopeof null);
console.log(tyopeof {user:"html5"});
console.log(tyopeoft [4,5]);
console.log(tyopeof /\d{3}/);
</script>

不可不知的instanceof:

面对typeof的类型检测缺陷,可以使用instanceof来弥补

语法:要检测的内容 instanceof 类型

范例:

<script>
console.log([4,5] instanceof Array);//true
console.log(/\d{3}/ instanceof RegExp);//true
</script>

基本解析:

  instanceof能够用于数据类型的检测,但是仅限于引用数据类型,无法检测基本数据类型的值;检测的返回值内容是布尔值。此外,会受到原型链的影响,只要是在原型链上,返回值都是true

instanceof的局限性:

  局限一:不能够检测以“字面量”方式出现的基本数据类型

<script>
var str=''HTML5学堂";
var str2=new String("码农");
console.log(str instanceof String);//false
console.log(str2 instanceof String);//true
</script>

  代码解析:str是使用字面量的方式创建的字符串,而str2是使用String对象实例化的字符串,检测str时返回值是false,而检测str2时返回值是true;

  局限性二:会检测该类所归属的原型链,只要在原型链当中能够找到,检测结果均为true,检测结果有可能会出现问题

<script>
//范例一
var str=new String("码农");
console.log(str instanceof String);//true
console.log(str instanceof Object);//true
//范例二:
var box=document.getElementsByTagName("body");
console.log(box[0] instanceof HTMLBodyElement);
console.log(box[0] instanceof Node);
console.log(box[0] instanceof Object);
//范例三
var arr=['htnl5','码农'];
console.log(arr instanceof Array);
console.log(arr instanceof Object);
</script>

  代码解析:

    在此处如果不是很了解原型链可以换个角度来理解,例如:数组隶属于对象,对于这种归属,检测也是成功的

    范例一中的字符串,的确属于string类型,但是他是通过String构造函数实例化得到的,String本身是一个字符串对象,所以str也符合Object这个条件

    范例二中的body标签本身是一个对象,细化一些说是一个节点对象,在细化说一个body元素,所以三种检测均为true,范例三中的数组同理(数组属于对象的一个分类)

比instanceof更好的constructor:

  语法:要检测的内容.constructor===类型

  范例:

<script>
console.log([4,5].constructor=== Array);
console.log(/\d{3}/.constructor===RegExp);
console.log('html5'.constructor===String);
var num=234;
console.log(num.constructor===Number);
</script>

  基本解析;

    constructor是对象的一个属性,不是运算符,constructor属性指向对象的构造函数。

    constuctor的作用与instanceof基本类似,但是对instanceof的两个缺陷均进行了弥补,也就是说:既能够检测基本数据类型,又不受原型链的影响。

<script>
//范例一
var box=document.getElementsByTagName("body");
console.log(box[0].constructor=== HTMLBodyElement);//true
console.log(box[0].constructor=== Node);//false
console.log(box[0].constructor=== Object);//false
//范例二
var arr=['htnl5','码农'];
console.log(arr.constructor=== Array);//true
console.log(arr.constructor===Object);//false
</script>

  constructor的局限性:

    对于自己创建的构造函数,constructor的局限性会比较大,当然这里不是我主要想说的东西,constructor属性是异变的,可以进行定义,所以并不能够保证他指向相应的构造函数。但是,对于系统的各类构造函数来说,还是可以正常使用的,毕竟我们平日里并不会去修改系统默认对象的constructor的指向

<script>
function Me(){}
var demo=new Me();
console.log(demo.constructor);
//此处检测的结果是:constructor指向构造函数Me,但是我们却可以人工修改指向,比如修改为Peo;
function Peo(){}
demo.constructor=Peo;
console.log(demo.constructor);
//此处检测的结果就变成了Peo
</script>

  相关说明:

    如果希望了解instanceof和constructor的基本原理,需要掌握原型,了解构造函数的内在机制。

检测值或者表达式的结果是否为NaN:

  isNaN函数:

    isNaN用于检测值或者表达式“转化为数字”时,是否为NaN,是NaN,结果为false,不是NaN结果为true。可以用于辅助parseFloat()和parseInt()进行进一步的结果检测

<script>
console.log(isNaN(NaN));//false
console.log(isNaN(234));//false
console.log(isNaN("89"));//true
</script>

易用的jQuery函数---isArray、isFunction等:

  jQuery中提供了大量的数据类型的检测方法,可以检测数据属于那种具体的对象类型,此处就不做解释了,在JQ的API文档中都可以查得到

Object.prototype.toString.call():

  语法与范例

<script>
console.log(Object.prototype.toString.call(236));//[object Number]
  console.log(Object.prototype.toString.call(null));//[object Null]
  console.log(Object.prototype.toString.call(true));//[object Boolean]
   console.log(Object.prototype.toString.call("码农"));//[object String]
   console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
   console.log(Object.prototype.toString.call([4,5]));//[object Array]
</script>

  基本解析:

    Object.prototype.toString比较常用于判断对象值属于那种内置属性,返回值类型为字符串,返回的字符串格式为:“[object 数据类型]”.由于许多引用类型都重写了Object继承来的toString方法,所以通常使用call/apply方法,借用Object.prototype.toString函数来判断数据类型

    每一种数据类型所属的类的原型上都有toString方法,例如:Number.prototype,String.prototype,Array.prototype等等。除了Object上的toString之外,其他原型上的toString都用于将数值转化为字符串

  Plus:

    可以借助字符串截取的方法,获取Object.prototype.toString的结果,并进行处理,从而得到"Number","null"等数据类型字符串,从而更方便进行数据类型比较/检测。

<script>
var demo="测试用的数据";
var type=Object.prototype.toString.call(demo).slice(8,-|);
//slice(8,-|)表示从第八个字符开始截取,到倒数第一个字符之间的部分,不包括倒数第一个字符
   console.log(type);//String
</script>

原生JS-----论数据类型检测的更多相关文章

  1. JS中数据类型及原生对象简介

    js是一种专门设计用来给网页增加交互性的编程语言,它的技术体系包含了一下几个方面: 1.JavaScript核心语言定义:包括数据类型,变量,常量,运算符,语句等. 2.原生对象和内置对象 3.浏览器 ...

  2. js数据类型检测

    目录 1. typeof {} 2. {} instanceof Object 3. {}.constructor === Object 4. Object.property.toString.cal ...

  3. js 数据类型检测

    提起数据类型检测  大多数人首先想起的应该是  typeof 'xxx' == '数据类型' 坦然这种方法对于基本数据类型的检测还是非常方便的,但是当遇到引用数据类型 Object时却爱莫能助,下面就 ...

  4. 原生JS—实现图片循环切换及监测鼠标滚动切换图片

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法以及如何检测鼠标滚动循环切换图片.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们 ...

  5. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  6. JS基本数据类型和引用数据类型的区别及深浅拷贝

    前言 首先我们先来了解一下什么叫栈堆,基本数据类型与引用数据类型 1.栈(stack)和堆(heap)stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动 ...

  7. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  8. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  9. JavaScript知识 一、JS的数据类型

    一.JS的数据类型 1.基本类型 JS共有5大基本类型,分别是: 1)Undefined.他只有一个值:undefined.如果一个变量被定义但是没有给他赋值,那么这个时候系统会默认给这个变量赋值为u ...

随机推荐

  1. ASP.NET使用ajax实现分页局部刷新页面

    listview列表实现分页是非常容易的.ListView分页是非常简单的,加上一个DataPager控件,把ListView的ID赋予就可以了.最开始我就是这么写的.(网上有人说这样是伪分页?) & ...

  2. 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  3. Spring-java代理技术总结

    Spring 中采用JDk的动态代理和CGLib代理技术在运行期间织入增强,所以用户不需要装备特殊的编译器或者类装载器就可以使用AOP功能. 要使用jdk的动态代理,目标类必须实现接口,而CGLib代 ...

  4. Sublime 常用快捷键

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  5. CSS.05 -- 规避脱标 定位的盒子居中、CSS标签规范、溢出隐藏、内容移除(网页优化)、CSS精灵图

    规避脱标   定位的盒子居中显示 Margin:0 auto : 只能让标准流的盒子居中对齐 当A是B的父系,B可以使用 margin-left:auto: 来获得相当于定位right:0:的效果 M ...

  6. try{} catch(…){} 讨论(转)

    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: .try .{ .BYTE* pch ...

  7. flask框架+pygal+sqlit3搭建图形化业务数据分析平台

    一. 前言 先说下主要的框架和主要的图形库的特点:(个人见解) Django:python开发的一个重量级的web框架,集成了MVC和ORM等技术,设计之初是为了使开发复杂的.数据库驱动的网站变得简单 ...

  8. iOS中书写代码规范35条小建议

    1.精简代码, 返回最后一句的值,这个方法有一个优点,所有的变量都在代码块中,也就是只在代码块的区域中有效,这意味着可以减少对其他作用域的命名污染.但缺点是可读性比较差 NSURL *url = ({ ...

  9. 老李推荐:第1章2节《MonkeyRunner源码剖析》概述:边界

    老李推荐:第1章2节<MonkeyRunner源码剖析>概述:边界   边界 怎么样才算分析清楚一个事物的原理是什么呢?就以前面提到的<LINUX内核源代码情景分析>为例子,分 ...

  10. 老李分享:jvm结构简介 1

    老李分享:jvm结构简介     poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...