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 ...
随机推荐
- 【Unity】Update()和FixedUpdate()
Update()每帧调用,FixedUpdate()以指定频率被调用. 可以在 Edit -> project settings -> Time -> Fixed Timestep ...
- Flex(flash)检测摄像头的3种状态(是否被占用,没安装摄像头,正常)
在视频程序的编写过程中,我们经常要使用摄像头,在使用摄像头前有必要对摄像头的现有状态做个检测: 1.被占用 2.没安装摄像头 3.正常 camera=Camera.getCamera(); ...
- idea常用快捷键
十大Intellij IDEA快捷键 2015-01-16 21:31 122307人阅读 评论(38) 收藏 举报 本文章已收录于: .embody { padding: 10px 10px 10p ...
- 转:[版本控管]TortoiseSVN 使用,抓出兇手,使用 Blame 查看每一行最後修改的人是誰
类似的官方的使用手段有: https://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-dug-blame.html from: http:/ ...
- Fragment的startActivityForResult详细解决方案
由于要用到Fragment中startActivityForResult,所以一开始就直接用activity.startActivityForResult(intent, 0);发现这样用首先会跳转到 ...
- 【转】TestFlight APP测试(IOS如何让上架前给其他人测试)
原文网址:http://blog.csdn.net/dexin5195/article/details/43966571 大家都知道, 以前iOS项目要测试只需要上传到testflightapp.co ...
- QuartzCore笔记
Quartz Core 图层编程 一.添加 Quartz Core 框架 要使用 Quartz Core 框架,你需要将其添加到你的工程中 . 然后 #import <Quartz Core/Q ...
- JAVA CDI 学习(3) - @Produces及@Disposes
上一节学习了注入Bean的生命周期,今天再来看看另一个话题: Bean的生产(@Produces)及销毁(@Disposes),这有点象设计模式中的工厂模式.在正式学习这个之前,先来看一个场景: 基于 ...
- 【java】企业级分布式搜索平台Solr视频教程
课程背景为了满足高可用.可扩展并容错的分布式搜索引擎.Solr是一个高性能,采用Java5开发, 基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现 ...
- sql 2012 提示列名无效 但可以执行问题
笔者目前使用Ctrl+Shift+R可以解决这个问题,因为智能感知的问题,需要重新整理一下intellisense.有其他方法,请园友共享一下,谢谢. VS2012及13都有用到智能感知,而在sql里 ...