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 ...
随机推荐
- javaSE ---OOP总结
面向对象编程(Object Oriented Programming,OOP)是当前最主流的编程范式之一,Java是一门纯面向对象的编程语言.我们常说C++是一门面向对象的编程语言,C++是C语言的一 ...
- u3d单词学习plane
plane n.水平: 平面: 飞机: 木工刨
- Winform窗体基本属性
窗体是程序与用户交互的可视界面,窗体也是对象,窗体类定义了生成窗体的模版,实例化一个窗体类就产生了一个窗体..NET框架类库的System.Windows.Forms命名空间中定义的Form类是所有窗 ...
- Jmeter :多个jmeter如何参数化获取不同的CSV文件
如何为不同的jmeter engine建立不同的csv文件: 1.如果需要多个jmeter engine 去读取不同的csv文件,可以使用一个变量去区分 ${__P(InstanceID)}, in ...
- noip2013 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- pullRefresh组件配置
mui.init({ pullRefresh:{ container: '#contanier', indicators:false, up:{ height:200, contentinit: '' ...
- http协议(五)web服务器
1.http1.1规范允许一台http服务器搭建多个web站点... 比如提供web托管服务的供应商,可以用一台服务器为多为客户服务,也可以以每位客户持有的域名运行各自不同的网站,这里利用了虚拟服务器 ...
- Linux shell中的符号
.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用. 括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空 ...
- Theano2.1.2-基础知识之第一步:代数
来自:http://deeplearning.net/software/theano/tutorial/adding.html Baby Steps - Algebra 一.两个标量相加 在学习the ...
- ALinq Dynamic 使用指南——代码的获取与编译
1.下载代码 ALinq Dynamic 项目托管在 CodePlex 网站,你可以使用浏览器下载压缩包,或者通过 SVN 获取. 项目网址:http://esql.codeplex.com/ 压缩包 ...