Js 类型方面的神坑
你有没有遇见过本来好好的一个数组结果 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 类型方面的神坑的更多相关文章
- JS类型(1)_JS学习笔记(2016.10.02)
js类型 js中的数据类型有undefined,boolean,number,string,null,object等6种,前5种为原始类型(基本类型),基本类型的访问是按值访问的,就是说你可以操作保存 ...
- js 类型之间的相互转化
设置元素对象属性 var img = document.querySelector("img") img.setAttribute("src","ht ...
- JS类型转换规则详解
JS类型转换规则详解 一.总结 一句话总结:JS强制类型转换中的类型名强制类型转换和其它语言不同,是类型类的构造方法,Number(mix) 一句话总结(JS类型本质):因为js是弱类型语言,所以它相 ...
- js类型比较
比较数据类型做比较的三种方法typeofinstanceofObject.prototype.toString.call() javascript七大类型 javascript的数据类型分为两类:原始 ...
- JS类型判断&原型链
JS类型检测主要有四种 1.typeof Obj 2.L instanceof R 3.Object.prototype.toString.call/apply(); 4.Obj.constructo ...
- JS类型(2)_JS学习笔记(2016.10.02)
undefined undefined是全局对象(window)的一个特殊属性,其值是未定义的.但 typeof undefined 返回 'undefined' . 虽然undefined是有特殊含 ...
- js类型判断及鸭式辨型
目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...
- 常用js类型相互转换
数字转换为字符串 var a=200.21;document.write(a.toString(10)); 结果为:200.21以十进制转换 document.write(a.toFixed(3)) ...
- 类型和原生函数及类型转换(二:终结js类型判断)
typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...
随机推荐
- request:getParameter和getAttribute区别
getParameter 是用来接受用post个get方法传递过来的参数的.getAttribute 必须先setAttribute.(1)request.getParameter() 取得是通过容器 ...
- gstreamer 10.5版本发布啦
- Android 缓存详解目录
1.http://www.cnblogs.com/lzrabbit/p/3734850.html 2.
- oracle em手动配置
转载自:http://www.cnblogs.com/sopost/archive/2010/08/14/2190098.html 用emca配置em emca是一个命令提示符,使用格式和方法在命令提 ...
- JavaScript入门:004—JS凝视的写法和基本运算符
JS的凝视JS中加凝视和寻常写C#代码是几乎相同的.有//和/* */这两种.单行凝视使用双斜杠比如. <script type="text/javascript"> ...
- 【BZOJ2298】[HAOI2011]problem a DP
[BZOJ2298][HAOI2011]problem a Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相 ...
- 【BZOJ2213】[Poi2011]Difference DP
[BZOJ2213][Poi2011]Difference Description A word consisting of lower-case letters of the English alp ...
- jquery遍历json与数组方法总结
来自:http://www.php100.com/html/program/jquery/2013/0905/5927.html 先我们来参考each() 方法,each()规定为每个匹配元素规定运行 ...
- 转:使用awk命令获取文本的某一行,某一列
1.打印文件的第一列(域) : awk '{print $1}' filename2.打印文件的前两列(域) : awk '{print ...
- ./bin/console server:run Surprise! There are no commands defined in the "server" namespace.
Let's start the built-in web server: ./bin/console server:run Surprise! There are no commands defi ...