你有没有遇见过本来好好的一个数组结果 typeof 出来是个 object 的情况,你有没有遇到过非要写个 typeof x === "undefined" 判断未赋值的情况...

人生呀,就是这么丰富多彩,喜怒无常!

(在此暂不探究 instanceof 判断类型 de 这种方法,因为博主是傻逼...觉得我写得不好可以看看此文,关于 js 类型)

先来看几个好玩的

typeof new String("x");   // object
"x" == new String("x"); // true

明明一个是 object 一个是 string,怎么就 true 了。(一脸懵逼 ರ_ರ)

当然 === 的时候就是 false 了,所以周遭才会推荐使用 === 而不是 == 的说

[] == new Array();    // false
{} == new Object(); // false

等等,结果和类型都一样,怎么和上面的栗子又不一样了呢,(二脸懵逼 ರ_ರ)

神奇的 undefined 要来了...

var x;                       // undefined
typeof x; // "undefined"
x == null; // true
y; y == undefined; y == null // 报错
typeof y; // "undefined"
var a = undefined;
typeof a; // "undefined"

基本可以总结为,1. typeof 出来的是个字符串; 2. 未赋值的变量是可以 == null 的(当然 === 不行); 3. 未定义的变量会报错,但 typeof 该变量显示 "undefined"。

这样来看,那就很模糊了,特别是在我需要知道它是未定义(那就 var 一个),还是未赋值(如果 var 了那就麻烦大了)。所以咱还是先把所有变量提前定义好吧,别无它法。

还有一个神奇的 null...

var x = null;
x == undefined; // true
typeof x; // "object"

同样的,null == undefined 可以(=== 不行);typeof null 却是个 "object"。(百脸懵逼 ರ_ರ)

------------------------------------------------------------------------------------------------------------------------  分割线

骚年,你渴望力量吗,来试下公司老大哥写的这种方法吧

function TypeOf(obj) {
if (obj == undefined) { return "undefined"; }
var r = ["Object","Array","Function","String","Number","Boolean","RegExp","Date","Error"];
for(var i in r) {
if (!(obj.constructor.toString().indexOf(r[i]) < 0)) return r[i].toLowerCase();
}
}

虽然不能区分 null 和 undefined,但这样我已经知足了,毕竟真要区分了其实反而麻烦了,

倒是可以在 obj == "undefined" 的判断中再加上一条 obj === void 0 来确定这是 undefined 而不是 null。

上述程序的具体使用,你试试就知道了。

此外,插播一个我没搞懂的问题

function typeOf(obj) {
if (obj == undefined) {return "undefined";}
if (!(obj.constructor.toString().indexOf("Object") < 0)) {
return "object";
} else if (!(obj.constructor.toString().indexOf("Array") < 0)) {
return "array";
} else if (!(obj.constructor.toString().indexOf("Function") < 0)) {
return "function";
} else if (!(obj.constructor.toString().indexOf("String") < 0)) {
return "string";
} else if (!(obj.constructor.toString().indexOf("Number") < 0)) {
return "number";
} else if (!(obj.constructor.toString().indexOf("Boolean") < 0)) {
return "boolean";
} else if (!(obj.constructor.toString().indexOf("RegExp") < 0)) {
return "regexp";
} else if (!(obj.constructor.toString().indexOf("Date") < 0)) {
return "date";
} else if (!(obj.constructor.toString().indexOf("Function") < 0)) {
return "function";
}
}

测试性能发现,后者比前者还要慢很多,表示不太明白,理论上前者比后者还多一个循环呀,还请各位大神指教

最新文章

  1. mysql比较时间大小unix_timestamp
  2. oracle xmltype导入并解析Excel数据 (五)中间表数据入库
  3. rhel7报错整理
  4. hdu 5492
  5. JavaWeb总结--Servlet 工作原理解析
  6. Hadoop配置文件解析
  7. 浏览器获取ip地址
  8. android 反编译 逆向工具整理
  9. HDU2019JAVA
  10. 删除windows7保留分区
  11. URAL 6089 Nine
  12. 学学简单的-------------javaScript基础
  13. Putty中的pscp和psftp的简明用法
  14. oo第一次作业
  15. 从运维的角度理解Iaas、Paas、Saas云计算
  16. Python+Excel+Unittest+HTMLTestRunner实现数据驱动接口自动化测试(二)
  17. 数据分组、统计 case when then else end
  18. Node json
  19. 基于链路的OSPFMD5口令认证
  20. tornado请求头/状态码/接口 笔记

热门文章

  1. Scrapy爬虫入门系列4抓取豆瓣Top250电影数据
  2. marquee标签跑马灯连续无空白播放效果 纯CSS(chrome opera有效)
  3. Mybatis 逆向工程 自动生成代码
  4. CSDN学院 免费技术答疑公开课,本周四场即将开播~~~
  5. iOS --发送手机验证码收不到手机验证码
  6. Linux下汇编语言------计算n的阶乘
  7. Android开发者必知的5个开源库
  8. 48、ViewFlow ---- 滑动广告页
  9. Android实现splash
  10. Anker—工作学习笔记