一篇文章搞定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 浮点数运算 精度问题
Oct 06 Javascript
json字符串之间的相互转换示例代码
Aug 21 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
Apr 06 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
Dec 24 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 Javascript
详解mpvue开发微信小程序基础知识
Sep 23 Javascript
JavaScript实现Excel表格效果
Feb 07 Javascript
详解JS ES6编码规范
May 07 Javascript
javascript拖曳互换div的位置实现示例
Jun 28 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
php获取当前月与上个月月初及月末时间戳的方法
2016/12/05 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
typescript配置alias的详细步骤
2020/08/12 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python补齐字符串长度的实例
2018/11/15 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
python numpy中cumsum的用法详解
2019/10/17 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Python csv文件记录流程代码解析
2020/07/16 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
机电工程专业应届生求职信
2013/10/03 职场文书
实习介绍信范文
2015/05/05 职场文书
盲山观后感
2015/06/11 职场文书
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库
win7配置本地ftp服务器的图文教程
2022/08/05 Servers