JavaScript判断数据类型的多种方法【 js判断一个变量的类型】

时间: 2018-03-29阅读: 2851标签: 数据

JavaScript中,变量一共有七种内置类型,分别为:

string: 字符串类型,由单引号或双引号来说明,如"string"
number:数字类型,比如什么整数啊浮点数啊都叫数字。
Boolean: 布尔类型,也就是true和false啦。
undefined:未定义类型,就是你创建一个变量后却没给它赋值~
null: 空值,null就是没有,什么也不表示。
object: 对象类型,是我们在js中经常使用的类型。
symbol : ES6引入了一种新的原始数据类型,Symbo表示独一无二的值。


判断js数据类型的方法主要有:typeof、instanceof、 constructor、 prototype.toString.call()等,下面就逐一介绍它们的异同。


1、最常见的判断方法:typeof

console.log(typeof 'hello')   // string
console.log(typeof 1)   // number
console.log(typeof {})   // object
console.log(typeof function(){})   // function
console.log(typeof true)   // boolen
console.log(typeof Symbol())  //symbol
//其中typeof返回的类型都是字符串形式,需注意,例如:
console.log(typeof 'string' == "string") // true
console.log(typeof 'a' == 'String')  // false
//另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。


2、判断已知对象类型的方法: instanceof

console.log([] instanceof Array) //判断是数组类型 true
console.log(new Date instanceof Date) //判断是日期类型  true
console.log(function(){} instanceof Function) //判断为function类型   true

注意:

1.instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

2.instanceof判断一个对象是否是另一个对象的实例,所以下面返回的是false:

console.log(true instanceof Boolean) //false
console.log('hello' instanceof String) //false
console.log(1 instanceof Number) // false

上面返回false的原因是,都是基本数据类型,不是对象,可以使用typeof来判断。使用new的形式就可以了,如下:

console.log(new String('hello') instanceof String) //true
console.log(new Number(1) instanceof Number) // true
console.log(new Boolean(true) instanceof Boolean) //true


3、根据对象的constructor判断

var a=[1,2];
console.log(a.constructor === Array); // true	数组
var b=1
console.log(b.constructor === Number);  // true	数字
var c='hello'
console.log(c.constructor === String); // true	字符串
var d={a: 1}
console.log(d.constructor === Object);  // true 对象
var e=Symbol()
console.log(e.constructor === Symbol);	// true 符号
var f = function a() { };
console.log(f.constructor === Function);  // true 函数
var j= new Date();
console.log(j.constructor === Date);	 // true 日期 
var h= new RegExp();
console.log(h.constructor === RegExp);	// true 正则

注意点1:如果数据不存在构造函数的时候,就会报错,如null,undefined:

var a=null
a.constructor// 报错:null 是 JS 原型链的起点,没有构造函数;
var b=undefined
b.constructor // 报错:undefined没有构造函数;
//错误提示:Uncaught TypeError: Cannot read property 'constructor' of null at <anonymous>:2:3

注意点2:constructor在类继承时会出错,解决construtor的问题通常是让对象的constructor手动指向自己。如下:

function A(){};
function B(){};
A.prototype = new B(); //A继承自B
var aObj = new A();
console.log(aobj.constructor === B) //true;
console.log(aobj.constructor === A) //false;
//而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:
console.log(aobj instanceof B) -----//true;
console.log(aobj instanceof B) -----//true;
//言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:
aobj.constructor = A; //将自己的类赋值给对象的constructor属性
console.log(aobj.constructor === A) //true;
console.log(aobj.constructor === B) //false; //基类不会为true;


4、prototype.toString.call()方法

var a=[1,2]
console.log(Object.prototype.toString.call(a) === '[object Array]') // true;
var b=1
console.log(Object.prototype.toString.call(b) === '[object Number]') // true;
var c='hello'
console.log(Object.prototype.toString.call(c) === '[object String]') // true;
var d=new Date()
console.log(Object.prototype.toString.call(d) === '[object Date]') // true;
var e=function(){}
console.log(Object.prototype.toString.call(e) === '[object Function]') // true;
var f={};
console.log(Object.prototype.toString.call(f) === '[object Object]') // true;
var j=Symbol()
console.log(Object.prototype.toString.call(j) === '[object Symbol]') // true;
var h=null
console.log(Object.prototype.toString.call(h) === '[object Null]')//true
var i=undefined
console.log(Object.prototype.toString.call(i)=== '[object Undefined]')	//true
var k=Math
console.log(Object.prototype.toString.call(k)=== '[object Math]')	//true

可以看出使用prototype.toString.call()方法,能更加精准的判断多种类型,比typeof判断的更多更具体。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/566

使用Proxy实现双向绑定

vue3.0要用Proxy来实现双向绑定,因此先来尝试一下实现方法。原来vue2的实现使用Object.defineProperty,监听set,但对于数组直接下标给数组设置值监听不了。

8种常见数据结构及其Javascript实现

做前端的同学不少都是自学成才或者半路出家,计算机基础的知识比较薄弱,尤其是数据结构和算法这块,所以今天整理了一下常见的数据结构和对应的Javascript的实现,希望能帮助大家完善这方面的知识体系。

js算法_判断数字是否为素数/质数

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。比如100以内共25个,js实现代码如下。

js常见的八种数据结构

数组(Array)数组是最简单、也是使用最广泛的数据结构。栈(Stack)栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。

node post 大数据无响应超时

使用 express 框架,post 较大数据量(富文本,里面包含了图片base64数据,大约300k)时,node 无响应,把数据内容减少后能顺利提交。是因为数据量大过body post 的限制导致不能提交。

web scraper 抓取网页数据的几个常见问题

如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据。如果你在使用 web scraper 抓取数据,很有可能碰到如下问题中的一个或者多个,而这些问题可能直接将你计划打乱,甚至让你放弃 web scraper 。

Nginx返回大长度的JSON数据被截断

1 添加Nginx参数,增加缓存字符串大小;2 遇到权限问题,原因是大文件会先缓存到/proxy-temp文件夹下面,然后再返回;修改文件夹的权限为Nginx用户

在 React-Native 中持久化 redux 数据

在最近的一个项目中,要求对 redux 数据做持久化处理,经过研究后成功实现,在此记录一下过程,我们可以使用 redux-persist 对数据做持久化处理,安装npm i --save redux-persist

哪种方式更适合在React中获取数据?

当执行像数据获取这样的I/O操作时,你必须发起获取请求,等待响应,将响应数据保存到组件的状态中,最后渲染。异步的数据获取会要求额外的工作来适应React的声明性,React也在逐步改进去最小化这种额外的工作

大数据平台常见开源工具集锦

大数据平台是对海量结构化、非结构化、半机构化数据进行采集、存储、计算、统计、分析处理的一系列技术平台。大数据平台处理的数据量通常是TB级,甚至是PB或EB级的数据

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!