为啥要说这个东西?一道面试题就给我去说它的动机。

题如下:
var bool = new Boolean(false);
if (bool) {
alert('true');
} else {
alert('false');
}
运行结果是true!!!
其实啥类型转换啊,操作符优先级啊,这些东西都是最最基本的。犀牛书上有详细的介绍。但我很少去翻犀牛书的前5章。。。
比如说优先级那块儿,很多书都教育我们,“不用去背诵优先级顺序,不确定的话,加括号就行了。“平常我们写代码时也确实这么做的。
但现实是啥呢?面试时会出这种题,让你来做。。。真不知道这种题的意义是啥。。。
抱怨到此为止,本文尝试来解决类型转换问题,争取把《JS权威指南》49页那个表背下来。
都有哪些东西是假值?
共6个:
0或+0、-0,NaN "" false undefined null
上面的顺序是按照基本类型来排列的。
除此之外的一律不是!!哪怕是如下形式:
Infinity
'0'、'false'、" "(空格字符)
任何引用类型:[],{},function(){}
if (a && b)的正确理解方式是:a && b进行表达式求值后,然后再转换为Boolean类型。
&&是种短路语法,求值后不一定是个Boolean类型,更不是两边转化布尔值再运算。
比如 2&&3 的结果是3,不是true。
所以if(a && b),我们平常理解的那种,"如果a和b同时为真的话",是一种错误的描述方式。
其他基本类型转化为字符串,基本和预期的一样:
console.log("" + null); // "null"
console.log("" + undefined); // "undefined"
console.log("" + false); // "false"
console.log("" + true); // "true"
console.log("" + 0); // "0"
console.log("" + NaN); // "NaN"
console.log("" + Infinity); // "Infinity"
其他基本类型转化为数字,需要特殊记忆:
console.log(+null); // 0 console.log(+undefined); // NaN console.log(+false); // 0 console.log(+true); // 1 console.log(+""); // 0 console.log(+'1'); // 1 console.log(+'1x'); // NaN
其中null,空字符是0,undefined是NaN。
以上,基本类型转换都说明白了。
下面来看看引用类型转换为基本类型。
引用类型转换为布尔,始终为true
引用类型转换为字符串
1.优先调用toString方法(如果有),看其返回结果是否是原始类型,如果是,转化为字符串,返回。
2.否则,调用valueOf方法(如果有),看其返回结果是否是原始类型,如果是,转化为字符串,返回。
3.其他报错。
引用类型转化为数字
1.优先调用valueOf方法(如果有),看其返回结果是否是基本类型,如果是,转化为数字,返回。
2.否则,调用toString方法(如果有),看其返回结果是否是基本类型,如果是,转化为数字,返回。
3.其他报错。
首先我们看看常见引用类型toString和valueOf返回什么?
var a = {};
console.dir(a.toString()); // "[object Object]"
console.dir(a.valueOf()); // 对象本身
var b = [1, 2, 3];
console.dir(b.toString()); // "1,2,3"
console.dir(b.valueOf()); // 对象本身
var c = [[1],[2]];
console.dir(c.toString()); // "1,2"
console.dir(c.valueOf()); // 对象本身
var d = function() {return 2};
console.dir(d.toString()); // "function() {return 2}"
console.dir(d.valueOf()); // 对象本身
因此对应的转换为字符串和数字的情形是:
var a = {};
console.dir(a + ""); // "[object Object]"
console.dir(+a); // NaN
var b = [1, 2, 3];
console.dir(b + ""); // "1,2,3"
console.dir(+b); // NaN
var c = [[1],[2]];
console.dir(c + ""); // "1,2"
console.dir(+c); // NaN
var d = function() {return 2};
console.dir(d + ""); // "function () {return 2}"
console.dir(+d); // NaN
再来个报错的情形:
var a = {};
a.toString = function() {return {};}
console.log("" + a); // 报错
console.log(+a) // 报错
以上类型转换规律基本说完。
最后来说一下万恶的“==”
面试题如下:
var a = false;
var b = undefined;
if (a == b) {
alert('true');
} else {
alert('false');
}
本以为会弹出true的。天那!为啥是false?
哈哈。。。
双等号,如果两边类型不同,会有隐式转换发生。犀牛书75页总结如下:
1,null和undefined,相等。
2,数字和字符串,转化为数字再比较。
3,如果有true或false,转换为1或0,再比较。
4,如果有引用类型,优先调用valueOf。
5,其余都不相等。
因此有:
console.log(undefined == false); // false
console.log(null == false); // false
console.log(0 == false); // true
console.log(NaN == false); // false
console.log("" == false); // true
0 == false之所以为true根据第3条。
"" == false之所以为true根据第3条,变成了"" == 0,再根据第2条。
第4条再来一个例子:
console.log([[2]] == '2')
其上结果为true,原因如下:
[[2]]的valueOf是对象本身,不是基本类型。
尝试调用toString的结果是'2'。
因此变成了'2'和数字2的比较。根据第2条,相等。WTF!!
最后说句,使用"==="就没有这些问题了。
以上所述是小编给大家介绍的一篇文章搞定JavaScript类型转换(面试常见),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# js类型转换
# 13道关于JavaScript正则表达式的面试题
# 详解JS中的this、apply、call、bind(经典面试题)
# 关于javascript作用域的常见面试题分享
# 面试常见的js算法题
# 10道典型的JavaScript面试题
# 80%应聘者都不及格的JS面试题
# Javascript前端经典的面试题及答案
# JavaScript中最常见的三个面试题解析
# 总结几道关于Node.js的面试问题
# 「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
# 转化为
# 转换为
# 报错
# 看其
# 再来
# 结果是
# 小编
# 都是
# 变成了
# 面试题
# 是个
# 是一种
# 会有
# 让你
# 都不
# 在此
# 求值
# 但我
# 给大家
# 弹出
相关文章:
济南网站制作的价格,历城一职专官方网站?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何选择服务器才能高效搭建专属网站?
表情包在线制作网站免费,表情包怎么弄?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
浅析上传头像示例及其注意事项
建站之星×万网:智能建站系统+自助建站平台一键生成
如何快速搭建安全的FTP站点?
北京的网站制作公司有哪些,哪个视频网站最好?
大同网页,大同瑞慈医院官网?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何用AWS免费套餐快速搭建高效网站?
如何配置WinSCP新建站点的密钥验证步骤?
如何选择香港主机高效搭建外贸独立站?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
网站制作网站,深圳做网站哪家比较好?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星导航如何优化提升用户体验?
微信小程序 五星评分(包括半颗星评分)实例代码
如何使用Golang安装API文档生成工具_快速生成接口文档
制作网站的软件免费下载,免费制作app哪个平台好?
宝塔建站无法访问?如何排查配置与端口问题?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何通过多用户协作模板快速搭建高效企业网站?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何快速查询域名建站关键信息?
电商平台网站制作流程,电商网站如何制作?
如何在建站之星绑定自定义域名?
大型企业网站制作流程,做网站需要注册公司吗?
七夕网站制作视频,七夕大促活动怎么报名?
如何快速查询网址的建站时间与历史轨迹?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
活动邀请函制作网站有哪些,活动邀请函文案?
建站主机解析:虚拟主机配置与服务器选择指南
建站主机与虚拟主机有何区别?如何选择最优方案?
建站之星安装需要哪些步骤及注意事项?
重庆市网站制作公司,重庆招聘网站哪个好?
如何生成腾讯云建站专用兑换码?
网站制作价目表怎么做,珍爱网婚介费用多少?
如何在云主机上快速搭建网站?
如何在IIS7中新建站点?详细步骤解析
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
详解jQuery停止动画——stop()方法的使用
如何用免费手机建站系统零基础打造专业网站?
网站企业制作流程,用什么语言做企业网站比较好?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何快速上传自定义模板至建站之星?
*请认真填写需求信息,我们会在24小时内与您取得联系。