全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

一篇文章搞定JavaScript类型转换(面试常见)

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

题如下:

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小时内与您取得联系。