Javascript之类型检测

一、检测原始(基本数据:字符串、数字、布尔、null、undefined)类型。

用typeof检测原始类型:1.对于字符串,typeof返回"string";

2.对于数字,typeof返回"number";

3.对于布尔型,typeof返回"boolean";

4.对于undefined,typeof返回"undefined";

5.对于null,typeof返回"object".

所以检测前面四种类型用typeof,对于null类型直接用===(或!==)检测。

二、检测引用类型。

引用类型也称为对象(object),在javascript中除了原始数据之外的值都是引用.

因为typeof检测引用类型都会返回"object",所以不是一种检测引用类型的好方式.

用instanceof检测引用类型(内置的引用类型:Object、Array、Date、Error等):value instanceof constructor(语法).

instanceof除了可以检测内置的引用类型,同样可以检测自定义的类型.

三、检测函数。

检测函数的方法有两种,一种是使用instanceof检测,因为函数也是一种引用类型(对象),但是这种方法不是检测函数的最好方法,因为不能跨帧使用.一般采用第二种方法,用typeof方法来检测.

//检测函数的两种写法

function myFunc() {}
console.log(typeof myFunc === "function");//好的写法
console.log( myFunc instanceof  Function);//不好的写法

  使用typeof来检测函数类型有一个限制就是,在IE8中和更早的版本的IE浏览器中,使用typeof来检测DOM节点中的函数都会返回"object",而不是"function";不过在其他情形中,typeof仍然是检测JavaScript函数的最佳选择.

//IE8以及更早版本的IE
console.log(typeof document.getElementById);  //"object"
console.log(typeof document.getElementsByTagName);  //"object"
console.log(typeof document.creatElement);  //"object"

  在IE8及更早浏览器中检测DOM方法的最安全做法。

//用in运算符检测DOM方法

if("querySelectorAll" in document) {
   imgs = document.querySelectorAll("img");
}

四、检测数组。

检测数组的一种优雅解决方案(可以跨帧使用).

function isArray(value) {
    return Object.prototype.toString.call(value) === "[object Array]";
}

 

一些浏览器提供了Array.isArray(value)来检测函数,和上面的方法一样,同样可以跨帧使用.此方法的浏览器兼容性如下:

 

两种方法结合使用:

function isArray (value) {
   if(typeof Array.isArray === "function") {//判断浏览器中是否有isArray方法
       return Array.isArray(value);
  } else {
    return Object.prototype.toString.call(value) === "[object Array]";
  }
}

  

五、检测属性。

用in检测属性是否存在,如果属性存在实例中或存在原型对象中,in运算符都会返回true.用in检测属性,它只会简单地判断属性是否存在,而不会去读属性的值.

var student = {
     count: 0,
     related: null
};

//好的写法
if("count" in student) {
console.log("我是count,我会执行");
}

//不好的写法
if (student["count"]) {
 //代码不会执行
 console.log("我不会执行");
}

//好的写法
if("related" in student) {
console.log("我是related我会执行");
}

//不好的写法
if (student["related"] === null) {
 //代码会执行
 console.log("我也会执行");
}

上面的测试结果如下:

不要设法通过检测属性的值的情况来判断属性是否存在,如下:

//不好的写法,检测假值
if(object[propertyName]) {
//一些代码
}

//不好的写法,和null比较
if(object[propertyName] != null) {
//一些代码
}

//不好的写法,和undefined比较
if(object[propertyName] != undefined) {
//一些代码
}

 因为当对象的属性值为假值(0、""、false、null和undefined)时,用上面的方法判断会出错.

检测实例对象的某个属性是否存在,使用hasOwnProperty()方法(所有继承自Object的JavaScript对象都有这个方法).在IE8及更早版本的IE中,DOM对象不是继承自Object,所以不包含这个方法.所以在调用DOM对象的hasOwnProperty()方法之前应当先检测其是否存在.

//对所有非DOM对象来说,是好的用法
if(object.hasOwnProperty("related")) {
   //执行这里的代码
}

//如果不确定是否为DOM对象,可以这样写
if("hasOwnProperty" in object && object.hasOwnProperty("related)) {
       //执行这里的代码
}

  

  最后总结:除了null,其他基本数据类型都应该用typeof方法检测,typeof除了可以检测基本数据类型,还可以检测函数.但是对于IE8及更早的浏览器版本,检测DOM函数最安全的做法是用in运算符;instanceof一般用来检测引用类型,它也可以检测函数;但是不能跨帧使用,所以不是好的方法,检测函数好的方法还是使用typeof(在非IE8及更早浏览器版本的情况下).数组的检测一些浏览器中都实现了检测数组的方法——Array.isArray(),对于没有此方法的浏览器可以用Object.prototype.toString.call(value) === "[object Array]"来检测数组;因为存在IE8以及更早版本IE的情形,在判断实例对象的属性是否存在时,用in运算符检测是很好的方式,只有在需要判断属性是存在实例对象中时(而不是存在原型对象中)才会用hasOwnProperty().(关于原型对象可以参见这篇文章:理解javascript中的原型模式 )


				
时间: 2024-07-31 04:54:05

Javascript之类型检测的相关文章

JavaScript中类型检测

JavaScript是类型松散的,也就是说,在使用变量和函数参数之前,不会对它们进行比较已确保它们的数据类型正确. JS有五种基本数据类型:Undefined.Null.Boolean.Number和String,还有一种复杂数据类型Object. JS是不支持任何创建自定义类型的机制,所有值最终都将是上述6种数据类型之一. 对于上述6种类型的变量,可以利用typeof操作符来检测. typeof操作符可能返回下列六个字符串: "undefined"--这个值未定义,对应Undefin

复习javascript之类型检测

昨天面了阿里一面,有一个检测类型问题,虽然当时给了答案,但是感觉自己还是不够确信,事实的结果是我给的答案有几个的确是错的~~唉~~有道是信誓旦旦不思其反.面试的时候脑子进水~~ typeof null 返回object,这是因为特殊值null被认为是一个空的对象引用. typeof 123 返回number typeof NaN 返回number .NaN,非数值是一个特殊的数值. 这个数值用来表示一个本来要返回数值的操作数未返回数值的情况. typeof new Number(123) 返回o

Javascript 常用类型检测

1.判断变量是否为数组的数据类型? 方法一 :判断其是否具有"数组性质",如slice()方法.可自己给该变量定义slice方法,故有时会失效. 方法二 :obj instanceof Array ,但是在某些IE版本中不正确 方法三 :来自于zepto.js源码 , function isArray(arg){ return Object.prototype.toString.call(arg) === "[object Array]" }    对于支持ECMA

说说javascript变量类型和变量类型检测

javascript是一种弱类型语言,它的典型例子就是即变量在使用的时候可以给它赋值任何类型.那么先来看下javascript都有那些变量类型已经它们的使用方法吧. 先来看看javascript都有那些类型吧: string --- 字符串number --- 数值boolean --- 布尔值undefined --- 未申明的变量 或 申明并未赋值null --- 空object  --- 对象function  --- 函数 这里比较有争议的是 function 类型到底要不要归属到变量类

JavaScript安全的类型检测

在JavaScript中,内置的类型检测机制并非是完全可靠的.这里分别指的typeof和instanceof关键字. 由于typeof有一些无法预知的行为,经常会导致检测数据类型时得到不靠谱的结果,Safari在对正则表达式应用typeof时会返回"function",在chrome下回返回"object". instanceof存在多个全局作用域的情况下(指的是一个页面中包含iframe),也是问题多多.比如下面的代码: var isArray = value i

javascript 类型检测

javascript类型检测主要包括下面几个方法: typeofinstanceofObject.prototype.toStringconstructorduck type 一.typeof方法 typeof可以检测给定变量的数据类型,对一个值使用typeof操作符可能返回下列某个字符串: “undefined”  如果这个值未定义 “boolean”     如果这个值是布尔值 "string"        如果这个值是字符串 “number”     如果这个值是数值 “obj

JavaScript数据类型、类型检测函数——慕课网ArraysSimilar编程练习

基本类型 string number boolean function undefined object (null,Array,Date,window) 隐式转换与"==""===" num-string   var str=num+' ' string-num   var num=str-0 "=="进行隐式转换后判断(即判断变量里面的值) "==="直接判断(判断是不是一个东西) ( NaN!=NaN null===nu

JavaScript类型检测

在编写JS代码中,经常要对某个变量进行类型检测.常用的类型检测方法有: typeof Object.prototype.toString constructor instanceof typeof typeof可以识别出基本数据类型(null除外),同时typeof并不能识别具体的对象类型(Function除外). eg: typeof "seven"; // "string" typeof 7; //"number" typeof true ;

JavaScript中如何检测一个变量是一个String类型?

1 typeof x === "string" 2 typeof(x) === "string' // 小写 3 x.constructor === String // 大写类型 同理:Number, Boolean Function 类型也可以这样检测 注意:object不同 var obj = { 'age':19, 'put':function(){ return 0; } } 这样定义的对象与前面规则一样 var Obj = function(){ this.age