壹题汇总每日五题 | 2021.08.25 待学

229 阅读2分钟

第 65 题: a.b.c.d 和 a['b']['c']['d'],哪个性能更高?

【待学】

弄懂AST,两种方式如何寻址

第 66 题:ES6 代码转成 ES5 代码的实现思路是什么?

【待学】

通过babel等工具语法转换,本质是以AST为桥梁;通过Babel-polyfill修复不存在的API

第 72 题: 为什么普通 for 循环的性能远远高于 forEach 的性能,请解释其中的原因

【待学】

量级不同比较结果不同

  • for 循环没有任何额外的函数调用栈和上下文;
  • forEach函数签名实际上是

array.forEach(function(currentValue, index, arr), thisValue)

它不是普通的 for 循环的语法糖,还有诸多参数和上下文需要在执行的时候考虑进来,可能拖慢性能;

第 75 题:数组里面有10万个数据,取第一个元素和第10万个元素的时间相差多少

相同?

数组元素的存储方式并不是连续的,而是哈希映射关系。数组实际是对象,都是用 key 精确查找哈希表的过程。

第 76 题:输出以下代码运行结果

// example 1
var a={}, b='123', c=123;  
a[b]='b';
a[c]='c';  
console.log(a[b]);  

---------------------
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');  
a[b]='b';
a[c]='c';  
console.log(a[b]); 

---------------------
// example 3
var a={}, b={key:'123'}, c={key:'456'};  
a[b]='b';
a[c]='c';  
console.log(a[b]);  

'b' Symbol('123') 'b' 【错误】
c b c 【正确】

  • 对象的键名只能是字符串和 Symbol 类型。
  • 其他类型的键名会被转换成字符串类型。
  • 对象转字符串默认会调用 toString 方法。
// example 1
var a={}, b='123', c=123; 
// b被转换成'123'。
a[b]='b'; 
// c被转换成'123','c'覆盖掉'b'。
a[c]='c';  
console.log(a[b]);  //输出'c'。

---------------------
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');  
// a[Symbol('123')] = 'b'
a[b]='b';
// a[Symbol('123')] = 'c',symbol不会被覆盖
a[c]='c';  
console.log(a[b]);  //'b'

---------------------
// example 3
var a={}, b={key:'123'}, c={key:'456'};  
//对象类型会调用 toString 方法转换成字符串 [object Object]。
a[b]='b';
//c同样转换成字符串[object Object],其值覆盖掉'b'
a[c]='c';  
console.log(a[b]);  //'c'