はじめに
以下のクイズのコードの実行結果をそれぞれ考えてみてください。
一番最後にスライドもあります。
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問中何問解けましたか?
もし全問解けたらコメントください!(何もないけど)