在强类型语言,数组类型检测是非常容易的事情(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. Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则

    一般我们在mvc开发过程中,都会碰到这样的问题.页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以Controller名命名的文件夹下.如果我们写到别处呢?那么肯 ...

  2. Shell配置_配置IP

    1.setup 打开图形化页面 a) 选择网络配置 b) 选择设置配置   c) 选择第一个网卡     2.启动网卡(第一个网卡)      vim /etc/sysconfig/network-s ...

  3. Jenkins_多项目构建(二):使用Maven聚集关系

        一.假设有四个Maven项目 1.soa-dub-parent:父项目 1 2 3 4 5 <modules>         <module>../soa-dub-f ...

  4. poj3233 矩阵等比数列求和 二分

    对于数列S(n) = a + a^2 + a^3 +....+ a^n; 可以用二分的思想进行下列的优化. if(n & 1) S(n) = a + a^2 + a^3 + ....... + ...

  5. js-读取系统时间

    转载 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.o ...

  6. Oracle触发器实例(网搜)

    触发器使用教程和命名规范 目  录触发器使用教程和命名规范 11,触发器简介 12,触发器示例 23,触发器语法和功能 34,例一:行级触发器之一 45,例二:行级触发器之二 46,例三:INSTEA ...

  7. 【poj3141】 Distant Galaxy

    http://poj.org/problem?id=3141 (题目链接) 题意 给出平面上n个点,找出一个矩形,使边界上包含尽量多的点. solution 不难发现,除非所有输入点都在同一行或同一列 ...

  8. Android成长日记-Fragment的生命周期与Activity通信

    1. public void onAttach(Activity activity) 当Fragment被添加到Activity时候会回调这个方法,并且这个方法只会被回调一次 2. public vo ...

  9. IAR使用记录

    1. Project-->Options... 更改器件:General-->Target-->Device 添加其它需包含的目录:C/C++ Compiler-->Prepr ...

  10. Python统计脚本行数(fileinput)

    __author__ = 'metasequoia' # -*- coding: utf-8 -*- import fileinput def Count(): count_num = 0 for l ...