Js 类型方面的神坑
2016-09-20 17:39
218 查看
你有没有遇见过本来好好的一个数组结果 typeof 出来是个 object 的情况,你有没有遇到过非要写个 typeof x === "undefined" 判断未赋值的情况...
人生呀,就是这么丰富多彩,喜怒无常!
(在此暂不探究 instanceof 判断类型 de 这种方法,因为博主是傻逼...觉得我写得不好可以看看 此文,关于 js 类型)
先来看几个好玩的
明明一个是 object 一个是 string,怎么就 true 了。(一脸懵逼 ರ_ರ)
当然 === 的时候就是 false 了,所以周遭才会推荐使用 === 而不是 == 的说
等等,结果和类型都一样,怎么和上面的栗子又不一样了呢,(二脸懵逼 ರ_ರ)
神奇的 undefined 要来了...
基本可以总结为,1. typeof 出来的是个字符串; 2. 未赋值的变量是可以 == null 的(当然 === 不行); 3. 未定义的变量会报错,但 typeof 该变量显示 "undefined"。
这样来看,那就很模糊了,特别是在我需要知道它是未定义(那就 var 一个),还是未赋值(如果 var 了那就麻烦大了)。所以咱还是先把所有变量提前定义好吧,别无它法。
还有一个神奇的 null...
同样的,null == undefined 可以(=== 不行);typeof null 却是个 "object"。(百脸懵逼 ರ_ರ)
------------------------------------------------------------------------------------------------------------------------ 分割线
骚年,你渴望力量吗,来试下公司老大哥写的这种方法吧
虽然不能区分 null 和 undefined,但这样我已经知足了,毕竟真要区分了其实反而麻烦了,
倒是可以在 obj == "undefined" 的判断中再加上一条 obj === void 0 来确定这是 undefined 而不是 null。
上述程序的具体使用,你试试就知道了。
此外,插播一个我没搞懂的问题
测试性能发现,后者比前者还要慢很多,表示不太明白,理论上前者比后者还多一个循环呀,还请各位大神指教
人生呀,就是这么丰富多彩,喜怒无常!
(在此暂不探究 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中将日期类型转换成字符串型格式
- JS 客户端验证文件类型,获取图片信息
- js的Object类型
- JS寻找子父结点上的类型
- js的Array类型
- js数据类型转换 (附一个截取浮点数并四舍五入的实例)
- 利用js来判断浏览器类型(ie,firefox)
- js中数据类型判断
- JSON-RPC-Java学习之类型映射及js客户端调用
- 检测浏览器类型的js
- js数据类型转换
- Js-客户端判断上传文件的类型
- JS实现复选框全选问题 按类型分类CheckBox
- 快速上手,使用 JS 配合XML-RPC(JSP)实现AJAX类型应用
- IE+JS: 上传之前检测图片文件大小及类型
- JS 控制RadioButtonList 获得上传文件类型后选中
- js 检测图片类型 和大小 _Yan
- JS收集:图片上传_限制格式、类型、尺寸
- Javascript入门学习第二篇 js类型第1/2页