HTML5学堂:每天一道题,强壮程序员!今日主要涉及昨日题目的解答,以及一道涉及二进制的题目。
昨日真题题目如下,最终输出的结果是多少?
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5学堂 - H5course</title>
<link rel="stylesheet" href="reset.css">
</head>
<body>
<script>
console.log([] + [] + "foo".split(""));
</script>
</body>
</html>
本题目的答案是:f,o,o。
答案解析:本题目主要涉及类型转换、数组、字符串。
先来分析一下[] + []结果为多少?是""。明明是两个数组对象相加,为何变成了一个字符串?
一起先来看看下面的例子:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5学堂 - H5course</title>
<link rel="stylesheet" href="reset.css">
</head>
<body>
<script>
// 重写数组里面toString方法
Array.prototype.toString = function() {
return "你调用我了";
}
console.log([] + []);
</script>
</body>
</html>
结果:你调用我了你调用我了。为啥不是""?因为我们重写了这样一个方法 —— toString。对于网页解析来说,当 + 操作符操作的是对象时,对象会自动调用自己内部toString方法(toString作为一个对象的自带原型方法而存在),toString方法用于将一个值转换为字符串类型的值。
在[] + []的运算过程中,由于使用到了+号,两个数组对象均调用了自己自带的toString()方法,将[]转换成了字符串,一个空字符串加一个空字符串,自然还是一个空的字符串了。
再来分析一下"foo".split(""),这个的意思是将字符串分割成字符串数组,为["f", "o", "o"]。
最后一步来了,[] + [] + "foo".split("")简化完之后是"" + ["f", "o", "o"],这时候 + 左侧是字符串,右侧是数组对象,数组对象依旧会调用自身的原型方法,将数组转换为字符串。
相关知识的支撑,是我们对一个对象的自带原型方法的了解。这道题如果弄明白了,大概也就能够明白,为何能够使用 + '' 或 * 1进行隐式数据类型的转换了。
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5学堂 - H5course</title>
<link rel="stylesheet" href="reset.css">
</head>
<body>
<script>
console.log(5&3);
</script>
</body>
</html>
关于每日代码练习题的答案和解析,我们会在明日文章当中,发布相关答案以及基本原理。