全网整合营销服务商

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

免费咨询热线: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手写代码无敌秘籍(推荐)  # 转化为  # 转换为  # 报错  # 看其  # 再来  # 结果是  # 小编  # 都是  # 变成了  # 面试题  # 是个  # 是一种  # 会有  # 让你  # 都不  # 在此  # 求值  # 但我  # 给大家  # 弹出 


相关文章: 网站代码制作软件有哪些,如何生成自己网站的代码?  建站之星导航菜单设置与功能模块配置全攻略  存储型VPS适合搭建中小型网站吗?  网站专业制作公司有哪些,做一个公司网站要多少钱?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何基于云服务器快速搭建网站及云盘系统?  PHP 500报错的快速解决方法  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何获取PHP WAP自助建站系统源码?  如何有效防御Web建站篡改攻击?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何在腾讯云服务器快速搭建个人网站?  如何撰写建站申请书?关键要点有哪些?  如何在IIS中配置站点IP、端口及主机头?  如何快速生成ASP一键建站模板并优化安全性?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  怎么将XML数据可视化 D3.js加载XML  宝塔面板创建网站无法访问?如何快速排查修复?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  平台云上自助建站如何快速打造专业网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  全景视频制作网站有哪些,全景图怎么做成网页?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  免费视频制作网站,更新又快又好的免费电影网站?  如何快速搭建响应式可视化网站?  如何在IIS7上新建站点并设置安全权限?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何高效利用亚马逊云主机搭建企业网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何在宝塔面板中修改默认建站目录?  建站之星Pro快速搭建教程:模板选择与功能配置指南  高端建站三要素:定制模板、企业官网与响应式设计优化  相册网站制作软件,图片上的网址怎么复制?  定制建站哪家更专业可靠?推荐榜单揭晓  海南网站制作公司有哪些,海口网是哪家的?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  如何在万网主机上快速搭建网站?  如何通过商城免费建站系统源码自定义网站主题?  如何通过NAT技术实现内网高效建站?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  如何选择美橙互联多站合一建站方案?  如何选择高效可靠的多用户建站源码资源?  如何快速搭建高效WAP手机网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  建站主机解析:虚拟主机配置与服务器选择指南  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何快速搭建安全的FTP站点?  如何通过PHP快速构建高效问答网站功能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。