你有没有遇见过本来好好的一个数组结果 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";
}
}

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

Js 类型方面的神坑的更多相关文章

  1. JS类型(1)_JS学习笔记(2016.10.02)

    js类型 js中的数据类型有undefined,boolean,number,string,null,object等6种,前5种为原始类型(基本类型),基本类型的访问是按值访问的,就是说你可以操作保存 ...

  2. js 类型之间的相互转化

    设置元素对象属性 var img = document.querySelector("img") img.setAttribute("src","ht ...

  3. JS类型转换规则详解

    JS类型转换规则详解 一.总结 一句话总结:JS强制类型转换中的类型名强制类型转换和其它语言不同,是类型类的构造方法,Number(mix) 一句话总结(JS类型本质):因为js是弱类型语言,所以它相 ...

  4. js类型比较

    比较数据类型做比较的三种方法typeofinstanceofObject.prototype.toString.call() javascript七大类型 javascript的数据类型分为两类:原始 ...

  5. JS类型判断&原型链

    JS类型检测主要有四种 1.typeof Obj 2.L instanceof R 3.Object.prototype.toString.call/apply(); 4.Obj.constructo ...

  6. JS类型(2)_JS学习笔记(2016.10.02)

    undefined undefined是全局对象(window)的一个特殊属性,其值是未定义的.但 typeof undefined 返回 'undefined' . 虽然undefined是有特殊含 ...

  7. js类型判断及鸭式辨型

    目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...

  8. 常用js类型相互转换

    数字转换为字符串 var a=200.21;document.write(a.toString(10));  结果为:200.21以十进制转换 document.write(a.toFixed(3)) ...

  9. 类型和原生函数及类型转换(二:终结js类型判断)

    typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...

随机推荐

  1. 【Python + ATX基于uiaotumator2】之Android—APP自动化简易例子

    上代码: import uiautomator2 as u2 from time import sleep d = u2.connect_usb('608ad0fe') #打开小卖 # d(text= ...

  2. Response设置response header

    total : #常见状态码:服务器处理请求的结果状态 200 : 表示请求处理完成并完美返回; 302 : 表示请求需要进一步细化; 404 : 表示客户访问资源Not Found; 500 : 表 ...

  3. sessionstorage:本地临时存储

    HTML5 web存储有两个重要对象: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储(关闭窗口,存储的数据清空) 一般涉 ...

  4. X264参考手册

    艺搜简介 基本语法: x264 [options]-o outfile infile 注意与ffmpeg的输入输出文件位置恰好相反: ffmpeg[options][[infile options]- ...

  5. dynamic web project

  6. hadoop之WordCount源代码分析

    //近期在研究hadoop.第一个想要要開始研究的必然是wordcount程序了.看了<hadoop应用开发实战解说>结合自己的理解,对wordcount的源代码进行分析. <pre ...

  7. java 证书 .cer 和 .pfx

    作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形 ...

  8. C++ 矩阵计算库 :Eigen库

    Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page 下载http://bitbucket.org/eigen/eigen/get/3. ...

  9. Python_Selenium之鼠标右键

    Python_Selenium之鼠标右键 一.步骤: (以百度为例)获取百度网址 找到需要右键的元素(定位),xpath表达式为“//*[@id='lg']/img” 然后,右键选择“在新标签页中打开 ...

  10. nginx访问css js 图片等静态资源,报404或无法定向访问到

    配置完nginx,把php的项目放上去后,发现css,js和图片全部访问不到,一直重定向到根目录执行index.php,郁闷的在网上查了半天,原来不同后缀名的文件访问时都要在nginx.conf中声明 ...