js类型转换的坑
JS的灵活
说好听是说JS灵活, 说不好听就是JS的坑太多, JS类型转换就是一个大坑, JS的类型包括了原始类型的[null, undefined, String ,Number, Boolean],以及对象类型的[function, object];
null, undefined, "", , -, NaN 转换成布尔值是false, 剩下的全转化为 ==>> true;
null, "", false, , [] 转换成数字是 ==>> ;
undefind, "One", 一个非数字值的数组:["a"], function(){} 转化成数字是 ==>> NaN;
true, 一个值为数字的数组:[] , 是数字的字符串:"",转换为数字是 ==>> 1;


其中null和undefined没有构造函数, 他们两个转化为对象的时候会报类型错误;
JS把对象转化成原始值
JS如果把对象转化成只付出 会调用对象的toString()方法,如果toString()方法返回的值是一个对象,那么会调用对象的valueOf()方法,把valueOf()的返回值转化成字符串, 如果该值还不是原始值就会报错;

对象转化成数字的时候会调用valueOf()方法, 如果该方法返回值非原始值, 那么回调用该对象的toString(), 把toString的返回值转化成数字, 如果toString()返回值还是非原始值,那么就会报错;

那么为什么第一个是NaN呢? 因为obj是一个空对象, (除了Date类型的对象的valueOf()返回的是数字以外, 所有的对象的valueOf()返回自己 , 神设定~。~),obj的valueOf()返回的是对象,所以他又调用toString()方法, toString()返回了字符串[object Object], [object Object]转化成数字就变成了NaN;
如果是对象类型转换成原始类型,只要把需要转化的对象放到原始类型的构造函数中进行解包,比如:
Number( {valueOf:function(){return }} ) // ==>>  1111
String( {toString:function(){return }} ) //==>>  "1111"
Boolean( {} )  // ==>> true
如果你觉得麻烦的话可以通过算术运算符进行快速转换:
    var obj = { toString : function() {return }};
    obj+"" ==>> "";
    var obj = { valueOf : function() {return }};
    +obj ==>> ;
JS把原始值转化成对象
要让原始类型转化成对象类型要将元素类型放到对象类型的构造函数中, 需要让构造函数包装;
console.log( typeof true ); //==>> boolean
console.log( typeof new Boolean( true ) ) //==>> object

参考表
表作为参考, 来自js权威指南, 看过书的应该都记得这表:
| 原始类型和对象类型 | 转换成String: | 转换成Number | 转换成Boolean | 转换成Object | 
|---|---|---|---|---|
| undefined | "undefined" | NaN | false | throws TypeError | 
| null | "null" | 0 | false | throws TypeError | 
| true | "true" | 1 | new Boolean(true) | |
| false | "false" | 0 | new Boolean(false) | |
| "" (empty string) | 0 | false | new String("");Object("") | |
| "1.2" (nonempty, numeric) | 1.2 | true | new String("1.2");Object("1.2") | |
| "one" (nonempty, non-numeric) | NaN | true | new String("one");Object("one") | |
| 0 | "0" | false | new Number(0);Object(0) | |
| -0 | "0" | false | new Number(-0);Object(-0) | |
| NaN | "undefined" | false | new Number(NaN);Object(NaN) | |
| Infinity | "Infinity" | true | new Number(Infinity);Object(Infinity) | |
| -Infinity | "-Infinity" | true | new Number(-Infinity);Object(-Infinity) | |
| 1 (finite, non-zero) | "1" | true | new Number(1);Object(1) | |
| {} (any object) | NaN | true | ||
| [] (empty array) | "" | 0 | true | |
| [9] (1 numeric elt) | "9" | 9 | true | |
| ['a'] (any other array) | use join() method | NaN | true | |
| function(){} (any function | "undefined" | NaN | true | 
js类型转换的坑的更多相关文章
- Node.js的那些坑——如何让异步并发方法同步顺序执行(for循环+异步操作)
		1 前言 nodejs的回调,有时候真的是让人又爱又恨的,当需要用for循环把数据依次存入数据库,但是如果使用正常的for循环,永远都是最后一次值的记录,根本不符合要求. 解决此方案有几种,例如闭包( ... 
- Nuxt.js的踩坑指南(常见问题汇总)
		本文会不定期更新在nuxt.js中遇到的问题进行汇总.转发请注明出处,尊重作者,谢谢! 强烈推荐作者文档版踩坑指南,点击跳转踩坑指南 在Nuxt的官方文档中,中文文档和英文文档都存在着不小的差异. 1 ... 
- js类型转换
		1.js中有六种基本类型,分别是object.number.string.Boolean.null.undefined,其中number.string.Boolean为基本类型,有时使用会强制转换成对 ... 
- js 类型转换学习
		类型转换分为显示转换和隐式转换 参考http://www.cnblogs.com/mizzle/archive/2011/08/12/2135885.html 先事件显示的 通过手动进行类型转换,Ja ... 
- js的一些坑,持续增加,学习js应该注意的问题
		大家来补充 1.变量类型模糊,容易出现问题; var a='1',b=1; a==b; //true a===b; //false 2.全局变量与函数内部变量同名时,在函数内部声明变量,声明位置虽然在 ... 
- JS 对象、HTML事件处理、JS 类型转换、Date
		1. JS 对象 <script> var Person = new Object(); Person.id = 1; Person.name = "Hello World&qu ... 
- 你可能忽略的js类型转换
		前言 相信刚开始了解js的时候,都会遇到 2 == '2',但 1+2 == 1+'2'为false的情况.这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及 ... 
- 一些angular/js/ts的坑和吐槽
		------20190318 ------------- 回头看,很多槽点已经随着升级改掉了 绑定string字面值到子组件@Input <app-overlay-static [name] ... 
- js 面试的坑
		JavaScript事件属性event.target <!DOCTYPE html> <html> <head> <meta charset="UT ... 
随机推荐
- 三维网格去噪算法(two-step framework)
			基于两步法的网格去噪算法顾名思义包含两个步骤:首先对网格表面的法向进行滤波,得到调整后的网格法向信息,然后根据调整后的法向更新顶点坐标位置,下面介绍三篇该类型的文章. [Sun et al. 2007 ... 
- 在Flex4中嵌入字体
			如果要使用的字体不是系统字体,可以把字体嵌入到Flash中,然后引用该字体.不过字体文件一般都比较大,慎重使用该功能. 官方例子 http://help.adobe.com/en_US/flex/us ... 
- Hibernate中saveOrUpdate()和merge()的区别
			this.getSession().merge(obj); this.getSession().saveOrUpdate(obj); saveOrUpdate(): saveOrUpdate()基本上 ... 
- JavaScript(DOM操作)(Window.document对象)
			一.找到元素: docunment.getElementById("id"): 根据id找,最多找一个: var a =docunment ... 
- Navigator 对象
			Navigator 对象 Navigator 对象包含有关浏览器的信息. 注意: 没有应用于 navigator 对象的公开标准,不过所有浏览器都支持该对象. Navigator 对象属性 属性 说明 ... 
- Use Cursor
			declare : CURSOR cursor_name IS select_statement ; open : OPEN cursor_name if the query returns no r ... 
- 监听grid行点击事件
- JavaScript中清空数组的三种方式
			方式1,splice ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 [],空数组,即被清 ... 
- linux:nohup 不生成 nohup.out的方法
			nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 & 关键在于最后的 >/dev/null 2>&1 部 ... 
- 2013级软件工程GitHub账号信息
			GitHub账号信息 序号 班级 学号 姓名 个人GitHub网址 1 信1301-1班 20122951 刘伟 https://github.com/weige8882 2 信1301-1班 201 ... 
