ItIron2021
Javascript
昨天我们探讨了undefined、null & not defined的基本差异,今天我们继续透过其他的题目进一步了解变数型别相关的问题吧!
请问下方程序码输出结果为何
let bar = true;
console.log(bar + 0);
console.log(bar + 'xyz');
console.log(bar + true);
console.log(bar + false);
老样子来张全新的防雷图~思考完再往下卷动吧!
最终的输出结果为
1
truexyz
2
1
这就是javascript中让人又爱又恨的其中一个地方,强制转型(coercion),简单说就是在某些情况下(变数间的比较、运算子或是条件式等使用等),javascript会透过自己的一套方法将变数转为它想要的型态再做处理,举个常见的例子,你在实务中可能看过类似以下的程序码
if (list.length) {
console.log('你的名单不是空的,真是太好了,你不是边缘人呢!')
} else {
console.log('可怜的家伙,连朋友都没有,这个口香糖拿去吃吧!')
}
上述的程序码就是一个善用强制转型的典型例子,条件式内的expression会被强制转为boolean值,藉由这样可以少些一些程序码! 不过当你不了解这类的转型规则时,你很容易像今天的题目一样慌了手脚。强制转型是绝对有完整的规则的,有兴趣的可以去探究一下背後的原理,MDN也有提供一张表格让你知道在比较时是怎麽做转型再比较的。
现在你知道规则是有的,我们再回头看一下题目吧! 当变数间用+运算子处理时,便会触发强制转型,毕竟它必须先知道是要连接还是加总嘛!你当然可以深究其原理再处理这道题目,不过实际上我个人的经验是这样的
再次强调,背後是真的有一套规则在的,有兴趣的自行探究,会关系到底层如何用valueOf去一个一个处理转型,但有了以上的基本原则就足够你应付多数的面试题目了,照以上的原则分析这次的问题吧!
console.log(true + 0); // 只有布林&数字,转数字处理,1 + 0 = 1
console.log(true + 'xyz'); // 有字串,用字串连接处理,'true' + 'xyz' = 'truexyz'
console.log(true + true); // 只有布林,转数字处理,1 + 1 = 1
console.log(true + false); // 只有布林,转数字处理,1 + 0 = 1
当然,最好的办法还是去好好了解底层是怎麽运作的,但以上原则面对jr的面试与实务已经完全足够了,真的慌了手脚的话就猜都转字串吧? 不过这边要特别注意不同的资料型别转字串的方法稍微有点不一样,举个例子来说
[] + {}
遇到这种让你手足无措的,你知道要猜转字串再连接,问题是....这两玩意转字串是什麽鬼阿!
转字串会透过toString方法去做转型,但挂在Array & Object下的toString却不完全一样,有兴趣的朋友可以自行研究一下,总之Object的toString方法会给比较多资讯,以上方的例子来说,空阵列呼叫本身的toString方法会回传空字串,而空物件呼叫本身的toString方法则会回传[object Object],最终输出结果为以下
[] + {} => '' + '[object Object]' => '[object Object]'
强制转型(coercion)
本文章同步发布於个人部落格,有兴趣的朋友也可以来逛逛~!
>>: [Day10] - Docker Compose 设定及操作介绍
这次要来细讲回圈了 上次说到回圈有分成:1. for回圈,2. while回圈以及3. do whi...
环境设定: 先去 https://developer.android.com/studio 下载An...
昨天我们耗尽洪荒之力, 终於用 terraform 配置好整个基础设施, 今天我们将继续环境操作, ...
前言 这个演讲蛮general的,也适合任何leader来看看。如果你觉得team里面的人都不太爱...
这个暑假就像开头第一篇说的,应该是大部分人度过最长的一个暑假,我原本也没什麽目标,打算好好休养生息,...