はじめに
以下のクイズのコードの実行結果をそれぞれ考えてみてください。
一番最後にスライドもあります。
Q1
console.log(018 - 015);
解答
5
解説
JavaScript では、先頭に 0 が付いた数字は8進数とみなされます。
しかし、018は無効な8進数なので、10進数とみなされる。015は8進数となり、13となります。
ゆえに、018-015 = 18-13 = 5となります。
Q2
const isTrue = true == [];
const isFalse = true == ![];
console.log ( isTrue + isFalse);
解答
0
解説
まず、1行目を解説します。trueと[]は型が違うので、数値へと変換されます。Number(true)とNumber([])が最初に評価されて、それぞれ1、0となります。1==0となるので const isTrue = falseとなります。
2行目も同様かと思うのですが、trueと![]は両方ともブール値なので、数字に変換されません。また、[]はtrueと解釈されるので、![]はfalseになります。
ゆえに、const isFalse = true == falseとなり、const isFalse = falseとなります。
以上から最後の行console.log ( isTrue + isFalse);はconsole.log ( false + false);となる。 falseが数値に変化され、console.log (0 + 0);
したがって、0が答えとなる。
Q3
console.log(3 > 2 > 1);
解答
false
解説
まず、3 > 2がtrueと評価されます。
次にtrue > 1ですが、>演算子の場合は両方数値型に変換されます。
Number(true) > Number(1) => 1 > 1となるので答えはfalseになります。
Q4
console.log(typeof typeof 1);
解答
string
解説
最初にtypeof 1が評価され、numberとなります。
typeof 'number'は string となるので、string が出力されます。
Q5
console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
解答
banana
解説
'ba' + + 'a'は 'ba' + NaNになります。
+ 'a' の + はプレフィックス演算子となり、Number('a')と等しいです。
ゆえに以下のように評価されます。
'b' + 'a' -> 'ba'
'ba' + + 'a' -> 'ba' + NaN -> 'baNaN'
'baNaN' + 'a' -> 'baNaNa'
'baNaNa'.toLowerCase() -> 'banana'
Q6
console.log(typeof NaN);
解答
number
解説
NaNの型は number (数値型) です。
Q7
console.log(0.1 + 0.2 == 0.3);
解答
false
解説
0.1 + 0.2は 0.30000000000000004 となります。
なので、console.log(0.30000000000000004 == 0.3); となり、答えは falseとなります。
Q8
const numbers = [33, 2, 8];
numbers.sort();
console.log(numbers[1])
解答
33
解説
JavaScript では以下のような配列も可能である。
const array = ["1", true, 55, 1.421, "foo", {}];
Array.prototype.sortでは、配列を一度stringにしてからソートする。
上記の問題の場合だと、ソート時に["33", "2", "8"];とみなされる。
string だと 2 → 3 → 8 の順になるのでnumbers.sort()は["2", "33", "8"]となる。よって、答えは33となる。
スライド
元ネタ
さて8問中何問解けましたか?
もし全問解けたらコメントください!(何もないけど)