在强类型语言,数组类型检测是非常容易的事情(typeof就可以解决),而在弱语言JS数据类型就很容易混淆了。

JS中常见的数据类型有:number、string、boolean、undefined、function、array、Object和null。下面先用typeof来测试下:

var k = 9;
console.log(typeof k); //number

检测number可以用typeof来检测了。

var k = "string";
console.log(typeof k); //string

检测string可以用typeof来检测了。

var k = true;
console.log(typeof k); //Boolean

检测boolean可以用typeof来检测了。

var u;
console.log(typeof u); //undefined

检测undefined也可以用typeof来检测。

var f = function(){};
console.log(typeof f); //function

function 也可以用typeof来检测。

var t = null;
console.log(typeof t); //object
var array = [];
console.log(typeof array); //object
var obj = {};
console.log(typeof obj); //object

用typeof来检测null,array和object检测的都是object。看来需要对这三种数据结构进行特殊处理。

function type(o){
return (o === null) ? "null": (typeof o)
}

先对null进行特殊处理,在看看array和object有没有其它属性来判断。

var array = [];
var toString = Object.prototype.toString;
console.log(toString.apply(array)); //[object Array] var obj = {};
console.log(toString.apply(obj));//[object Object]

OK,通过检测其它数据类型:regexp和date也可以通过这种方式来检测:

var regex = /^\s+/;
var toString = Object.prototype.toString;
console.log(toString.apply(regex)); //[object RegExp]
var date = new Date();
console.log(toString.apply(date)); //[object Date]

最后,我们来写一个通用的函数来对JS数据类型检测:

function typeOf(e){
var _toString = Object.prototype.toString;
var _type = {
"undefined":"undefined",
"number":"number",
"boolean":"boolean",
"string":"string",
"function":"function",
"[object RegExp]":"regex",
"[object Array]":"array",
"[object Date]":"date"
}
return _type[typeof e] || _type[_toString.call(e)] ||(e? "object":"null");
}

我在zepto.js中看到另外一些检测数据类型的方式,可以参考:

var toString = ({}).toString; //挺巧妙的。
function isFunction(value) {
return toString.call(value) == "[object Function]"
}
// value通过对象字面量定义的对象,或者通过new定义的对象isObject(value)都为true
function isObject(value) {
return value instanceof Object
}
//对于通过字面量定义的对象,new定义的实例对象为false
//new Object时传参数的构造函数的原型链没有isPrototypeOf属性,而构造函数的原型链的__proto__对象有。
function isPlainObject(value) {
var key, ctor
//如果不是object类型返回false。
if (toString.call(value) !== "[object Object]") return false
//获得该对象原型链中的属性或者对象,如果是对象自面量,那么isFunction(value.constructor)是为true,是构造函数定义则为true,不管是false,还是true
//value.constructor.prototype都返回对象,即ctor为一个对象,并且该对象没有isPrototypeOf属性!
ctor = (isFunction(value.constructor) && value.constructor.prototype) //true
//解释一下:isPrototypeOf:如果对象 A 存在于 对象obj的原形链中,则 A.isPrototypeOf(obj)返回true,而obj必定继承了A 的属性
//!ctor为false,查看ctor是否有'isPrototypeof'属性值,如果不存在isPrototypeOf属性,并且ctor为false,则不是对象。
if (!ctor || !hasOwnProperty.call(ctor, 'isPrototypeOf')) return false
//如果value为{},那么执行for (key in value)之后,key为最后一个元素,如果是通过Object.create来创建的,则key为undefined。
//如果是构造函数构造的对象,key为原型链中的方法,即hasOwnProperty.call(value, key)为false,
for (key in value);
//可以确定{}返回为true,函数或者其他都返回为false;
return key === undefined || hasOwnProperty.call(value, key);
}
function isArray(value) {
return value instanceof Array
}
function likeArray(obj) { //类数组,不是真正的数组,是对象,有一个成员类型“length”
return typeof obj.length == 'number'
}

来看看一个特殊的例子:

console.log({}?"x":"y"); //"x"

JS数组类型检测的更多相关文章

  1. 【JS】类型检测

    本文首发于我的个人博客 : http://cherryblog.site/ 前言 js 中的类型检测也是很重要的一部分,所以说这篇文章我们就来讲一下怎么对 JavaScript 中的基本数据类型进行检 ...

  2. JS做类型检测到底有几种方法?看完本文就知道了!

    JS有很多数据类型,对于不同数据类型的识别和相互转换也是面试中的一个常考点,本文主要讲的就是类型转换和类型检测. 数据类型 JS中的数据类型主要分为两大类:原始类型(值类型)和引用类型.常见的数据类型 ...

  3. JS中类型检测方式

    在js中的类型检测目前我所知道的是三种方式,分别有它们的应用场景: 1.typeof:主要用于检测基本类型. typeof undefined;//=> undefined typeof 'a' ...

  4. js安全类型检测

    背景: 都知道js内置的类型检测,大多数情况下是不太可靠的,例如:  typeof  . instanceof typeof 返回一个未经计算的操作数的类型, 可以发现所有对象都是返回object  ...

  5. js数组类型判断与数据类型判断回顾

    判断一个对象是否是数组方法有多种: 一.Array.isArray()函数 在ECMAScript5中可以通过Array.isArray()来做这件事: Array.isArray({}); //fa ...

  6. 检测js对象是不是数组类型?

    面试时候被人问如何检测一个未知变量是不是数组类型,丢脸啊,老祖宗的脸都丢没了,这都不会,回家啃书本去吧!!! var a = [];方法一:Array.isArray([])  //true type ...

  7. 《JS权威指南学习总结--7.10 数组类型》

    内容要点: 一.数组类型 判断它是否为数组通常非常有用.在ES5中,可以使用Array.isArray()函数来做这件事情: Array.isArray([]); //=>true Array. ...

  8. JS 类型检测

    typeof 适合函数对象和基本类型的判断 typeof 100instanceof 适合判断对象类型 obj instanceof Object 基于原型链判断操作符,若做操作符不是对象,则会直接返 ...

  9. js -【 数组】判断一个变量是数组类型的几种方法

    怎么判断一个数组是数组呢? 其实这个也是一个常考的题目.依稀记得我为数不多的面试经过中都被问道过. 方案一: instanceof variable instanceof Array 解决思路: 使用 ...

随机推荐

  1. Shell脚本_备份/etc数据

    vim backup_etc.sh chmod 755 backup_etc.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  2. AOP 学习笔记

    代理是一个设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象. 好处:可以在目标对象实现的基础上,增强额外的功能操作. Cglib 代理,也叫作 子类代理. JDK的动态代理有一个限制, ...

  3. 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue

    介绍背水一战 Windows 10 之 绑定 与 Element 绑定 与 Indexer 绑定 TargetNullValue - 当绑定数据为 null 时显示的值 FallbackValue - ...

  4. 最新版CocoaPods的使用与安装-以导入ReactiveCocoa框架为例

    一.什么是CocoaPods?前言: 思考如何引入一个第三方框架. 例如: 百度地图SDK.友盟.ShareSDK. 信鸽推送等.从github或某处下载第三方SDK工程中导入所需要的SDK的文件 . ...

  5. 【C++实现python字符串函数库】strip、lstrip、rstrip方法

    [C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...

  6. UOJ149 【NOIP2015】子串

    本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! [问题描述]有两个仅包含小写英文字母的字符串 A ...

  7. 使用dnsmasq来提升CentOS上网速度

    1. 安装dnsmasq dnsmasq的官方网址是:http://www.thekelleys.org.uk/dnsmasq/doc.html.利用里面的下载链接下载dnsmasq-2.72.tar ...

  8. C++ 之const Member Functions

    Extraction from C++ primer 5th Edition 7.1.2 The purpose of the const that follows the parameter lis ...

  9. Spider爬虫清洗数据(re方法)

    import re s0 = 'BOY and GIRL' s1 = re.sub(r'BOY|GIRL', 'HUMAN', s0) print s1 # HUMAN and HUMAN 替换方法.

  10. appium+java+junit demo运行

    对java熟悉一些,所以想用java把appium给做起来.今天用myeclipse给环境和Demo弄了一下,网上没有一篇全套资料的. 各块环境的搭建: 1.安装appium客户端,省略下载和安装步骤 ...