javascript基础知识学习笔记——五种方法判断变量类型

javascript基础知识学习笔记——判断变量类型

概述

熟悉面向对象变成语言像java、c++、Dot Net的,了解这些语言对变量的命名时都需要声明变量是那种类型,若对变量赋予另一种类型对象时,程序在编译时会产生error,我们反观javascript,使用var variable变量时并没有声明变量类型,此时变量是undefined,在对变量赋值时任何类型都可以,这体现了JavaScript是弱类型语言,不需要编译即可运行。既然变量都是用var声明那么怎么区别变量的类型呢?

一、判断变量的类型用typeof

在es5版中js有五种基本数据类型,即: Undefined、Null、Boolean、Number和String,还有另一类引用类型,像Object、Function、Array,还有一些内置对象,像Math、Date、RegExp、Bom、Dom等等。常用到的就是typeof来判断变量类型,对引用类型除了Function函数,缺点就是还有一些无法区分类型的,像Null和Array、Math、Date、RegExp等引用对象。

var und=undefined
console.log(typeof unde); //undefined
var n=null;
console.log(typeof null); //object
var bool=true;
console.log(typeof bool); //"boolean"
var num=1
console.log(typeof num); //"number"
var str="1"
console.log(typeof str);  //"string"
var obj={};
console.log(typeof obj); //object
var fun=function(){};
console.log(typeof fun); //function
var arr=[];
console.log(typeof arr); //object
console.log(typeof Math); //object
console.log(typeof new RegExp()); // object

二、instandof

对于引用类型或者有构造器的函数对象,可以用这个instandof区分变量是否是该对象的子类或者派生出来的。缺点无法区别五大基本类型。

//是否为数组
function judgeArray(arr){
if(typeof arr =="object"){
   console.log(arr instanceof Array)
   return true
}
return false
}
var arr=[];
judgeArray(arr); //true
var obj={};
judgeArray(arr); //false

三、构造器

创建一个对象时js会在该对象的原型链prototype属性上添加构造器,该构造器同时又指向了自身,即new Array().constructor==Array,为true。缺点无法区别五大基本类型。

console.log([].constructor==Array) ;//true
console.log(new Object().constructor==Object) ;//true

四、api

es5为数组提供了一个isArray的函数用来区分数组的,具体可以看上一篇文章,关于数组api的总结。缺点是受具体的api的限制,有很多变量类型都没有现成的api

var arr=[];
var obj={};
console.log(Array.isArray(arr)); //true
console.log(Array.isArray(obj)); //false

五、tostring

toString()方法是顶级父类Object对象的原生属性,补充一点Object的原型指向Null,而该方法返回对象类型。缺点是无法判断undefined类型。

var n=null;
console.log(Object.prototype.toString.call(null)); //[object Null]
var bool=true;
console.log(Object.prototype.toString.call(bool)); //[object Boolean]
var num=1
console.log(Object.prototype.toString.call(num)); //[object Number]
var str="1"
console.log(Object.prototype.toString.call(str));  //[object String]
var obj={};
console.log(Object.prototype.toString.call(obj)); //[object Object]
var fun=function(){};
console.log(Object.prototype.toString.call(fun)); //[object Function]
var arr=[];
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(Object.prototype.toString.call(Math)); //[object Math]
console.log(Object.prototype.toString.call(new RegExp())); // [object RegExp]

猜你喜欢

转载自blog.csdn.net/qq_29510269/article/details/88624152