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是一个一元 ...
随机推荐
- apache2+svn Cannot load modules/mod_dav_svn.so into server: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3
按照svn里的readme文件安装配置apache2与svn后, 启动apache2服务的时候 出现下面的问题 Cannot load C:/Program Files/Apache Software ...
- poj 3469(网络流模版)
题目链接:http://poj.org/problem?id=3469 思路:终于把网络流的模版测试好了,在Dinic和Sap之间还是选择了Sap,事实证明Sap确实比Dinic效率高,在此贴出自己的 ...
- react手记(componentWillMount,componentDidMount等)
生命周期componentWillMount 组件出现前 就是dom还没有渲染到html文档里面componentDidMount 组件渲染完成 已经出现在dom文档里可以再各个周期实现特定的操作 生 ...
- awk特征相同行的合并
[root@linux-node1 ~]# cat test.txt hisk01 hisk02 hisk03 hisk04 hisk05 hisk06 hisk07 hisk08 [root@lin ...
- PHP 如何成长 (收藏自:http://www.cnblogs.com/try-better-tomorrow/p/6964036.html)
原文题目为<php程序员学C/C++>,不过我觉得说是提升自己比较合适. 身边有几个做PHP开发的朋友,因为面试,也接触到不少的PHP工程师,他们常疑虑自己将来在技术上的成长与发展,我常给 ...
- Android无线测试之—UiAutomator UiSelector API介绍之三
节点关系介绍 每一个布局文件都是一个严格的层次结构布局文件,只有对层次结构非常的了解,才能更好的搜索定位我们需要的主键元素 一.XML文档节点关系介绍 备注:查看节点关系主要使用UiAutomatro ...
- fzu2181(点的双连通分量+求奇环)
求出每个点双连通分量,如果在一个点双连通分量中有奇环,则这个分量每个点都在一个奇环中. 关键是要知道怎么求点双连通分量以及点双连通的性质. fzu2181 http://acm.fzu.edu.cn ...
- Java工程师面试题整理[社招篇]
http://blog.csdn.net/jackfrued/article/details/44921941 1.面向对象的特征有哪些方面?2.访问修饰符public,private,protect ...
- docker openvas
https://hub.docker.com/r/mikesplain/openvas/ Requirements DockerPorts available: 443, 9390, 9391 Usa ...
- 问题:Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder.
创建AVD时,发现创建不成功,报错“Unable to find a 'userdata.img' file for ABIarmeabi to copy into the AVD folder.” ...