每日3题25下面代码执行后,控制台输出什么?让a={i:0,[Symbol.toPrimitive]:()=>++a.i,};控制台日志(a==1&&a==2&&a==3);26变量a为什么会被GC?函数测试(){vara=1;returnfunction(){eval("")}}test();27下面代码执行后,控制台输出什么?console.log([2,1,0].reduce(Math.pow));console.log([].reduce(Math.pow));公众号【我今天也来写bug】,更靠前-end面试题答案及分析25//答案:正确//Symbol.toPrimitive是一个内置的Symbol值,//它作为一个对象的函数值属性存在,当一个对象被转换为对应的原始值//如果该函数存在,将调用它。让a={i:0,[Symbol.toPrimitive]:()=>++a.i,};控制台日志(a==1&&a==2&&a==3);//==将触发类型转换,我们定义了Symbol.toPrimitive方法//所以a==1触发方法返回1,a.i变为1,所以a==1为真,//同样a==2和a==3都是true26//答:否//检查eval函数//因为eval会欺骗词法作用域,比如functiontest(){eval("vara=1")},创建一个variablea//JS引擎不确定eval是否有a的引用,所以没有做安全优化。//同样,trycatch和with也会有同样的问题//不推荐使用eval和withfunctiontest(){vara=1;返回函数(){eval("");};}测试();27//答案:1报错//探索reduce方法的使用//reduce接受两个参数:回调函数和初始值//如果没有提供初始值,则使用数组的第一个元素作为初始值,回调函数从数组的第二个元素开始调用//提供初始值,然后回调从数组的第一个元素开始调用//回调函数接受4个参数:previousValue,currentValue,currentIndex,array(即遍历的数组)console.log([2,1,0].reduce(Math.pow));//执行步骤如下:初始值:2//输入参数第一次回调调用:previousValue=2,currentValue=1,Math.pow只接受2个参数,结果为2^1=2//第二次回调调用的输入参数:previousValue=2,currentValue=0,Math.pow只接受2个参数,结果为2^0=1console.log([].reduce(Math.pow));//如果数组为空且没有初值提供了,reduce直接报错
