JavaScript 里的奇葩知识( 三 )

但是您可以用 use strict 严格模式来避免这一行为,这样 arguments 就只是个副本了 。
23void 是个固执的老头
void 0 === undefined          // truevoid 1 === undefined          // truevoid {} === undefined         // truevoid 'hello' === undefined    // truevoid void 0 === undefined     // true跟谁都不沾亲~~
24try/catch/finally 也有特定的执行顺序
function fn1() {  console.log('fn1');  return 1;}function fn2() {  console.log('fn2');  return 2;}function getData() {  try {    throw new Error('');  } catch (e) {    return fn1();  } finally {    return fn2();  }}console.log(getData());// 打印顺序: 'fn1', 'fn2', 2在 try/catch 代码块中,如果碰到 return xxyyzz; 关键词,那么 xxyyzz 会先执行并把值放在临时变量里,接着去执行 finally 代码块的内容后再返回该临时变量 。如果 finally 中也有 return aabbcc ,那么会立即返回新的数据 aabbcc  。
25是否存在这样的变量 x ,使得它等于多个数字?
const x = {  value: 0,  toString() {    return ++this.value;  }}x == 1 && x == 2 && x == 3;    // true通过隐式转换,这样不是什么难的事情 。
26clearTimeout 和 clearInterval 可以互换~~~~使用吗
var timeout = setTimeout(() => console.log(1), 1000);var interval = setInterval(() => console.log(2), 800);clearInterval(timeout);clearTimeout(interval);答案是:YES  。大部分浏览器都支持互相清理定时器,但是建议使用对应的清理函数 。
27下面的打印顺序是?
setTimeout(() => {  console.log(1);}, 0);new Promise((resolve) => {  console.log(2);  resolve();}).then(() => console.log(3));function callMe() {  console.log(4);}(async () => {  await callMe();  console.log(5);})();答案是:2, 4, 3, 5, 1
主线任务:2,4
微任务:3,5
宏任务:1
28null 是 object 类型,但又不是继承于 Object ,它更像一个历史遗留的 bug  。鉴于太多人在用这个特性,修复它反而会导致成千上万的程序出错 。
typeof null === 'object';              // trueObject.prototype.toString.call(null);  // [object Null]null instanceof Object;                // false
【JavaScript 里的奇葩知识】


推荐阅读