在强类型语言,数组类型检测是非常容易的事情(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. 初探psutil

    系统性能信息模块psutil 1,psutil简介 psutil是一个跨平台能够轻松获取系统的进程和系统利用率,主要应用在系统监控,分析和限制系统资源以及进程管理.它实现了很多系统管理的命令,如ps, ...

  2. HTML常用标签与表格标签

    超链接标签: <a href="超链接地址" target="_blank">超链接的文字</a> _blank或new是在新网页中打开 ...

  3. Java字符串面试(二)

    先看下面2个程序 public static void main(String[] args) { String a = "a1"; String b = "a" ...

  4. jQuery中data()方法用法实例

    语法结构一: 复制代码代码如下: $(selector).data(name,value) 参数列表: 参数 描述 name 存储的数据名称. value 将要存储的任意数据. 实例代码: 复制代码代 ...

  5. 【USACO 1.4】Arithmetic Progressions

    /* TASK: ariprog LANG:C++ URL:http://train.usaco.org/usacoprob2?a=PA9lOcZrdWq&S=ariprog SOLVE:平方 ...

  6. 纯代码自定义不等高cell

    数据模型.plist解析这里就不过多赘述. 错误思路之一: 通过在heightForRowAtIndexPath:方法中调用cellForRowAtIndexPath:拿到cell,再拿到cell的子 ...

  7. [日常训练]常州集训day8

    T1 Description 给定一个长度为$n$的正整数序列$a$.可以将序列分成若干段,定义第$i$段的权值$x_i$为这一段中所有数的最大值,特殊地,$x_0=0$.求$\sum_{i=1}^{ ...

  8. Leetcode 74 and 240. Search a 2D matrix I and II

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  9. python反射

    python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...

  10. 加州大学伯克利分校Stat2.3x Inference 统计推断学习笔记: Section 5 Window to a Wider World

    Stat2.3x Inference(统计推断)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...