如何判断JavaScript变量的类型(2)
作者:明达 来源:七月佑安 发布时间:2009-02-25 12:28:00
基本上完结了,我们还是没有彻底的消除object,一个典型的情况就是通过{}直接定义对象,那个名字我是不会获取了,谁要是知道一定要告诉我。再比较特殊的就是IE了,有N多对象无法判断实际类型,只能给出object,暂时没有头绪。
2月7日更新,发现原来的代码还是存在很多漏洞的,更新了一下,并转换为jQuery插件:
/*
(function($){
$.extend({
tof: function(val, description) {
var result, constructorName;
switch(val) {
case null: result = "Null"; break;
case undefined: result = "Undefined"; break;
default:
result = Object.prototype.toString.call(val).match(/^\[object\s(\w+)\]$/)[1];
if(typeof(Node) !== "undefined") {
if(val instanceof Node) {
if(typeof(val.nodeName) === "string") {
result = val.nodeName;
}
}
}
else {
if(typeof(val.nodeName) === "string") {
result = val.nodeName;
}
}
if(result === "Object") {
// can not access fireunit's constructor
try {
if(typeof(val.constructor) !== "undefined") {
constructorName = val.constructor.toString().match(/^\s*function\s(\w+)/);
if(constructorName !== null) {
result = constructorName[1];
}
}
} catch(err) {}
}
break;
}
return result.toLowerCase();
}
});
})(jQuery);
*/
这里需要提一下的是,在IE中,无论怎么判断,alert、confirm和prompt三个函数的类型都是object,而在其他所有浏览器中都是function。
在玉伯那里,有一个这样的例子,经过测试是可以判断出数组的:
/*
function SubArray() {}
SubArray.prototype = [];
jstest.add(new SubArray(), "array", "prototype is array");
*/
对于数值来说,通过字面量定义的肯定返回number,而对于用new Number来定义的,虽然typeof的值是object,其实使用的过程中都会自动调用valueOf,所以在这里也会返回number的。而对于那些定义在全局变量上,和数值相关的特殊属性,获取类型也是number:
/*
jstest.add(0, "number", "literal number 0");
jstest.add(1, "number", "literal number 1");
jstest.add("1", "string", "string \"1\"");
jstest.add(new Number(1.5), "number", "new Number(1.5)");
jstest.add((new Number(1.5)).valueOf(), "number", "(new Number(1.5)).valueOf()");
jstest.add((new Number(1.5)).toString(), "string", "(new Number(1.5)).toString()");
jstest.add(NaN, "number", "NaN - not a number");
jstest.add(Infinity, "number", "Infinity");
jstest.add(-Infinity, "number", "-Infinity");
*/
和布尔值相关的测试用例:
/*
jstest.add(true, "boolean", "literal boolean true");
jstest.add(false, "boolean", "literal boolean false");
jstest.add(new Boolean(true), "boolean", "new Boolean(true)");
*/
和浏览器的内置对象相关的测试用例:
/*
jstest.add(new Error(), "error", "new Error()");
jstest.add(new EvalError(), "error", "new EvalError()");
jstest.add(new Date(), "date", "new Date()");
jstest.add(/abc/, "regexp", "literal regular expression");
jstest.add(new RegExp("a?"), "regexp", "new RegExp()");
jstest.add([], "array", "array by []");
jstest.add(new Array(), "array", "array by new Array()");
jstest.add(Math, "math", "Math");
*/
DOM对象的测试用例:
/*
jstest.add(document.createElement("div"), "div", "HTML Element");
jstest.add(document, "#document", "document");
*/
自定义对象的测试用例:
/*
function TestClass(){};
jstest.add(new TestClass(), "testclass", "custom object, new TestClass()");
*/
2009年2月10日更新,上面的测试用例,测试的内容没有变,但已经单独提出来了,这两天整理出一篇来。
测试环境:
* Firefox 3.0.6
* Internet Explorer 7.0
* Safari 3.2
* Opera 9.63
* Chrome 1.0.154.48
参考资料:
* http://lucassmith.name/pub/typeof.html
* http://blog.360.yahoo.com/blog-TBPekxc1dLNy5DOloPfzVvFIVOWMB0li?p=916
* http://lifesinger.org/blog/?p=1109
* http://lifesinger.org/blog/?p=1130
* http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
写在最最后面的
现在的状态应该说只能算是第一个版本吧,应该还有很大的优化余地,最终的目标应该是一个非常增强的typeof,不止要能适应各个浏览器的各个版本,还要尽可能多的判断出各种对象。大家要有好的改进想法,记得告诉我哟。


猜你喜欢
- 两张表,A表中的记录B表中不一定有。左连接:关注左边,右边没有就为空。右连接:关注右边,左边没有就为空。内连接:返回交集例如:student
- 这是一个获取字符串中两个子串之间的子串,如从字符串www.aspxhome.com中获取coderbolg子串,就让这个PHP函数来实现吧,
- 今天为大家介绍几个Python“装逼”实例代码,python绘制樱花、玫瑰、圣诞树代码实例,主要使用了turtle库Python绘制樱花代码
- 如何导入数据数据可能有各种格式,虽然常见的是HDFS,但是因为在Python爬虫中数据库用的比较多的是MongoDB,所以这里会重点说说如何
- MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了
- 本文实例讲述了php+jQuery实现的 * 导航栏下拉菜单显示效果。分享给大家供大家参考,具体如下:首先看看效果图:1.数据配置文件 db.
- 《用户研究角度看设计》系列是淘宝的用户研究团队在可用性测试之后的点滴思考。在每次与淘宝用户的直接接触、观察用户的操作之后,作为体验分析师的我
- 先上一张效果图:以前用angularjs操作基本上都是要取到每个列表的id再循环判断是不是当前点击的列表来显示折叠。今天在这个项目 http
- mysql 索引详解:在mysql 中,索引可以分为两种类型 hash索引和 btree索引。 什么情况下可以用到B树索引?&nb
- 通过在File->setting->File and Code Templates设置模板代码,这样就可以在新建python文件
- 在项目中遇到后台数据还没有加载完毕,但是页面上调用了后台数据中的字段,这样就会报undefined。例如:一进入页面直接回显数据。我在cre
- 前言:其实很简单!举一个简单的例子!这是一个简单的显示时刻的温度折线图:from matplotlib import pyplot as p
- 如何使用pytorch加载并读取COCO数据集 环境配置基础知识:元祖、字典、数组利用PyTorch读取COCO数据集利用PyTorch读取
- CLI工程全局安装vue-clinpm install -g @vue/cli通过cli创建uni-app项目 vue creat
- 前言如果你对数据分析有一定的了解,那你一定听说过一些亲民好用的数据分析的工具,如Excel、Tableau、PowerBI等等等等,它们都是
- 因为mounted函数只会在html和模板渲染之后会加载一次,但是在子组件中只有第一次的数据显示是正常的,所以需要再增加一个updated函
- 刚刚想从数据库中的表EXPERT_DETAILS中检索出修改人Modifier(类型 VARCHAR2(20),可为空)为空的那些记录,因为
- 其实这个问题来源于笔者的横坐标太多了,然后生成的那个figure框框太小,导致坐标重叠,而输出的图片是需要批量保存的,总不能每次都拉长截图吧
- 以前见过一个很漂亮的网页提示信息,就是把鼠标放到网页的文字或者图片上面就会有提示的那种透明的,还带个箭头,很漂亮,不知道谁在哪见过没有,感谢
- fsockopen函数能够运用,首先要开启php.ini中的allow_url_open=on;fsockopen是对socket客户端代码