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


Posted in Javascript onJanuary 21, 2017

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

题如下:

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类型转换(面试常见),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 高效运行代码分析
Mar 18 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 Javascript
2010年最佳jQuery插件整理
Dec 06 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
Oct 12 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
jQuery模拟新浪微博首页滚动效果的方法
Mar 11 Javascript
jQuery蓝色风格滑动导航栏代码分享
Aug 19 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
May 17 Javascript
小程序实现留言板
Nov 02 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
Dec 09 Javascript
vue页面更新patch的实现示例
Mar 25 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 #Javascript
Mongoose学习全面理解(推荐)
Jan 21 #Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 #Javascript
vue实现添加标签demo示例代码
Jan 21 #Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 #Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 #Javascript
Bootstrap框架安装使用详解
Jan 21 #Javascript
You might like
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
jQuery 学习 几种常用方法
2009/06/11 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
关于jquery css的使用介绍
2013/04/18 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
详解Django中异步任务之django-celery
2020/11/05 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
医药个人求职信范文
2014/01/29 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
老同学聚会感言
2014/02/23 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
三峡人家导游词
2015/01/31 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL