10 道 JavaScript 考题,测测你多了解这个古怪的语言

2024年4月12日

💎 加入 E+ 成長計畫 與超過 350+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

最近 Product Hunt 上有个获得当日排名第二的小产品,是一个名叫 JavaScript Quiz 的网站。该网站会随机出 10 题 JavaScript 的题目,来检验你对这门语言的理解程度。每次拿到的可能是不同题目,以下是我们在玩的时候遇到的题目。除了解答,这边也附上说明。推荐大家也去玩玩。

第一题

console.log(018 - 015);

第二题

console.log(typeof typeof 1)

第三题

console.log(0.1 + 0.2 == 0.3)

第四题

const numbers = [33, 2, 8];
numbers.sort();
console.log(numbers[1])

第五题

console.log(false == '0');

第六题

let array = [1, 2, 3];
array[6] = 9;
console.log(array[5]);

第七题

console.log(typeof NaN);

第八题

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());

第九题

const isTrue = true == [];
const isFalse = true == ![];
console.log(isTrue + isFalse);

第十题

console.log("This is a string." instanceof String);

解答

  • 第一题 5
  • 第二题 string
  • 第三题 false
  • 第四题 33
  • 第五题 true
  • 第六题 undefined
  • 第七题 number
  • 第八题 'banana'
  • 第九题 0
  • 第十题 false

详细解说

第一题

console.log(018 - 015); 之所以是 5,是因为在 JavaScript 当中,数字前面如果有 0,就会变成八进制,而不是十进制。换句话说,只有 0 到 7 是合理的数字,018 没办法被八进制表达,所以会被当成十进制的 18;而 015 在八进制是 13,所以会变成 18 - 13 因此是 5

第二题

console.log(typeof typeof 1) 可以拆成两段来看,先看 typeof 1 会得到 'number' 字串,而 typeof 'number' 因为是看一个字串的型别,所以会是 string

第三题

console.log(0.1 + 0.2 == 0.3) 会是 false 的原因,详细可以看 在 JavaScript 中 0.1 + 0.2 会是多少?为什么?如何避免相关问题?

第四题

如果这题选 8,代表忽略 Array.sortcompareFn 如果没有传入,预设会在排序时,把值先转成字串,所以用字串排出来会是 ["2", "33", "8"];。关于 compareFn 可以看 JavaScript 中的 sort 传入 (a,b) => b - a 会是升序还是降序?为什么呢?

第五题

console.log(false == '0') 会印出 true 不是因为 false'0' 相等,而是在 JavaScript 当中的 == 在比较时会做型别转换,所以在比较时变成 Number(false)Number('0') 的比较,而这两个都会被转成数字 0,所以被判断为相等。要避免这问题,可以用 ===Object.is,详细可见 在 JavaScript 当中,==、=== 与 Object.is()的区别 一文。

第六题

之所以是 undefined 是因为虽然在 6 的位置加上,但因为在 345 的位置并没有赋予值,所以 5 的位置会是 undefined

[1, 2, 3, undefined, undefined, undefined, 9]

第七题

在 JavaScript 中的 NaNnumber 型别。要如何理解为何 NaNnumber 型别呢? 想像一下假如今天我们要用 parseFloat 来处理 number 的型别的值,假如一般数字等显然没问题,但假如是非数字传入该怎么办? 这时有一个非数字又是数字型别的 NaN ,就能用来概括代表。

第八题

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase()); 会印出 'b' + 'a' 是字串相加,直观会印出 'ba'。然而 'ba' + + 'a' 因为中间的 + + 让 JavaScript 无法处理,所以会变成 NaN,所以整个会变成 'baNaNa',然后最后的 toLowerCase 会把大写都变小写,所以得到 'banana'

第九题

这题可以先看 const isTrue = true == [];,虽然变数叫做 isTrue,但其实 true == [] 会是 false 因为这两个不同型别,会被转换,实际上这两个比较是 Number(true)Number([]) 比,而它们分别是 10

接着看 const isFalse = true == ![]; ,因为这边 ![] 会是 false,所以跟上面的比较不一样,是直接比同型别,所以是 true == false 会得到 false

因此印出的会是 console.log(false + false) 会被转换型别成为 console.log(Number(false) + Number(false)) 所以会是 console.log(0 + 0) 也就得到 0

第十题

console.log("This is a string." instanceof String); 直观可能会觉得是 true,但实际会得到 false,这题也是我们自己在做的时候答错的一题。之所以是 false,是因为 "This is a string." 是 JavaScript 原始值,所以不是 String 物件的实例。

如果是 new String("This is a string.") instanceof String 才会回传 true

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們