题目1

1
2
3
4
5
6
7
8
以下哪些表达式的值为0?(多选)
A: (()=>{}).length

B: 1 & 2

C: +[]

D: [1,2,-3].reduce((a, b) => a - b, 0)
  • 答案

    • A,B,C,D
  • 解析

    • A: 获取的是形参的个数(不是实参)

      1
      2
      3
      4
      5
      如果是((a)=> {}).length,形参有一个所以函数的length为1
      如果是((a,b)=> {}).length,形参有两个所以函数的length为2
      假如:function aaa(){}
      aaa(1,2);
      console.log(aaa.length) ;//值为0,因为形参个数是0,所以函数的length为0
    • B: & 与运算, (二进制下)二者都是1最终结果才为1,否则就为0

      1
      2
      3
      1的二进制表示  0001
      2的二进制表示 0010
      1&2结果是 0000 ,转成10进制也就是0
    • C: +[ ] 隐式类型转换。 +会让 [ ] 隐式转换成Number,转换过程如下

      1
      因为 [ ] 是对象,所以 toPrimitive->valueOf->toString为  '' ,Number('')得0
    • D: reduce用于求和

      1
      2
      3
      4
      5
      6
      7
      // 代码简写
      [1,2,-3].reduce((a, b) => a - b, 0)

      // 代码详细
      [1,2,-3].reduce((prev, cur)=>{
      return a-b;
      },0)

      reduce的使用

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      【功能】: 求和
      【参数】: callback参数
      1. total(若为赋值,则默认为0)
      2. currentItem
      3. currentIndex
      4. arr(数组所属数组对象)
      【返回值】:根据callback的返回值决定total的值
      【示例】:
      var sum = result.reduce(function(prev, cur) {
      console.log(prev) // 0
      console.log(cur) // {name:'小明',score:88}
      return cur.score + prev;
      }, 0);
      console.log('总数是' + sum)

题目2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
下列代码存在几个变量没有被回收?( )
var i = 1;
var i = 2;
var add = function() {
var i = 0;
return function()
{
i++;
console.log(i);
}
}();
add();
A: 0
B: 1
C: 2
D: 3
  • 答案

    • D
  • 解析

    • 不会被回收的

      • 全局变量i不会被回收
      • 全局变量add不会被回收
      • 闭包引用的局部变量i不会被回收
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      var i = 1;
      var i = 2; //二个var ,一个被覆盖了,没有新建,只是覆盖,因此只有一个全局变量i不会被回收

      // add 也是全局变量,不回收
      var add = function() {
      // var 是函数作用域
      var i = 0;
      return function()
      {
      //闭包保持引用,因此这个也不会被回收
      i++;
      console.log(i);
      }
      }();

题目3

1
2
3
4
5
6
7
8
9
10
11
以下代码执行后,array的结果是?
var array=[-1,1,3,4,6,10];
array.sort((a,b)=>Math.abs(a-3)-Math.abs(b-3));
A: [10,-1,6,1,4,3]

B: [10,6,4,3,1,-1]

C: [3,4,1,6,-1,10]

D: [-1,1,3,4,6,10]

  • 答案

    • C
  • 解析

    • (a,b)=>Math.abs(a-3)-Math.abs(b-3);

      箭头函数表示:当Math.abs(a-3)>Math.abs(b-3)时,a放在b后面,Math.abs(a-3)<Math.abs(b-3)时,不交换位置,也就是说数组中的每一项减去3的绝对值越大越靠后。这里主要考的是对sort()方法的掌握.

    • 我个人也不是很懂,只知道 array.sort((a,b)=>a-b)是升序 array.sort((a,b)=>b-a)是降序

    • 获取这个是一个技巧吧,真正理解sort还是挺复杂的

      • 先将数组每一个值 -3再取绝对值,然后得[4,2,0,1,3,7]
      • [4,2,0,1,3,7] 依次对应数组 [-1,1,3,4,6,10]
      • 又因为是 Math.abs(a-3) - Math.abs(b-3);所以数组中的每一项减去3的绝对值越大越靠后,排序后的为[0,1,2,3,4,7],所以最终结果就为**[3,4,1,6,-1,10]**
    • 具体可看

题目4

1
2
3
4
5
6
7
8
9
el是一个id="id1"的div元素,以下哪行代码会执行失败
A: el.className='aaa'

B: el.tagName='p'

C: el.innerHTML=''

D: el.id='id2'

  • 答案
    • B
  • 解析
    • A: className 属性设置或返回元素的 class 属性。获取属性值:HTMLElementObject.className;设置属性值:HTMLElementObject.className=classname
    • B: tagName属性返回元素的标签名。HTML 返回 tagName 属性的值是大写的比如div标签返回tagName为 DIV
    • C: innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML。HTMLElementObject.innerHTML=text
    • id 属性设置或者返回元素的 id。HTMLElementObject.id=id