题目1

1
2
3
4
5
6
7
8
9
下列正确定义函数的是
A: function foo() {}

B: Function foo() {}

C: var foo = new Function() {}

D: var foo = new function() {}

  • 答案
    • A
  • 解析
    • B当中的 ‘Function’ 写错了,应该是 ‘function’
    • C当中应该是 var foo = new Function (参数1,参数2,……)
    • D同C一样,都是弄错了

题目2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
以下代码执行时不会在控制台输出错误信息的是:
A: let a = decodeURIComponent('%');
B:
var a;
a();
function a() {
console.log(a);
}
C:
Promise.reject(123).finally(a => {
console.log(a);
});
D:
var a = 1;
let a = 2;
console.log(a);

  • 答案

    • B
  • 解析

    • A: decodeURIComponent(字符串),对字符串进行解码,此时这里传入的字符串应该是使用encodeURI或者是encodeURIComponent编码后的字符串进行解码,直接传入%是一个没有编码的字符串( ‘%’ 编码后为 ‘ %25’ )

    • encodeURIComponentencodeURI不同的是

      • encodeURIComponent会对一些特殊字符进行编码

      • encodeURI不会对特殊字符进行编码

    • B: 函数提升和变量提升同时存在,函数提升优先级 高于 变量提升,所以变量a被函数所覆盖

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      console.log(foo); 
      var foo = 1 //变量提升
      console.log(foo)
      foo()
      function foo(){ //函数提升
      console.log('函数')
      }
      =========等价于=============>
      function foo(){ //提到顶端
      console.log('函数')
      }
      var foo
      console.log(foo) //输出foo这个函数,因为上面foo没有被赋值,foo还是原来的值
      foo = 1; //赋值不会提升,赋值后 foo就不再是函数类型了,而是number类型
      console.log(foo) //输出1
      foo() //这里会报错,因为foo不是函数了
    • C: 选项需要 .catch去补货 被 reject 的 Promise,才能不抛出错误

    • D: 选项因为 let 的 TDZ(“暂时性死区”),在 let 的作用域中无法重复声明,也无法在声明语句之前使用(没有变量提升)。简而言之,在 let 语句出现之前,都是无法使用该变量的(说通俗点就是——只要let所在定义域下(也就是在函数当中的 { } 当中),在let代码没有执行之前,如果这个时候有一段代码对let声明的变量名称进行了访问并且代码执行了( 比如console.log() ) ,那么就会发生报错!)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      补充一点。这种情况下是可以正常运行的:
      var a = 1;
      {
      //块级作用域
      let a = 2;
      }
      console.log(a);//输出1


      也看看下面这种情况
      let foo = () => {
      console.log(x);//输出x=10;
      x++;
      }
      let x = 10;
      foo();
      //结合上面说所的,分析下过程
      //就是只要let所在定义域下(也就是在函数当中的 `{ }` 当中)
      //在let代码没有执行之前
      //如果这个时候有一段代码对let声明的变量名称进行了访问
      //( 比如console.log() ) ,那么就会发生报错!

      //拆解 执行过程
      //第一步
      let foo = {...};//此时函数并没有执行,所以不存在对let变量进行访问并执行,所以不报错
      //第二步
      let x = 10;
      //第三步
      foo();

题目3

1
2
3
4
5
6
7
8
9
下列代码中,页面打开后能够弹出1的是?(多选)
A: <iframe src=”javascript: alert(1)”></iframe>

B: <img src=”” onerror=”alert(1)”/>

C: IE下<s style=”top:expression(alert(1))”></s>

D: <div onclick=”alert(1)”></div>

  • 答案
    • A,B,C
  • 解析
    • A:加载的时候会触发alert(1)代码
    • B:img当中的onerror,当图片不存在加载失败的时候会触发,此时这里src=“”,导致加载失败,所以触发alert(1)事件
    • C:在ie 7下会连续弹出, IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javascript表达式,CSS属性的值等于Javascript表达式计算的结果。在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。
    • D:onclick,单击div标签才会触发
1
2
3
4
5
6
7
8
当用户打开一个网页时,想一直停留在当前打开的页面,禁止页面前进和后退,以下正确的是(      )(多选)
A: window.history.forward(1);

B: window.history.back(1);

C: window.history.go(-1);

D: window.history.forward(-1);
  • 答案

    • A,D
  • 解析

    • 题目意思

      • 相当于URI当中输入了网站,比如说baidu.com,然后会发现只有后退没有前进按钮的操作,这种情况下从ABCD选

    • A:window.history.forward( 1 ) (forward不用传递参数,传入也会无效)前进一个页面,这里没办法前进,所以可以选

    • B:window.history.back( )(back不用传递参数,传入也会无效)后退一个页面,这里可以后退,但是题目要求禁止,所以不选

    • C:window.history.go(-1) 后退一个页面,这里可以后退,但是题目要求禁止,所以不选

      • window.history.go(delta);—-相对于当前页面你要去往历史页面的位置。负值表示向后移动,正值表示向前移动。因此,例如:history.go(2)向前移动两页,history.go(-2)则向后移动两页。如果未向该函数传参或delta相等于0,则该函数与调用location.reload()具有相同的效果。
    • D:window.history.forward( -1 ) 前进一个页面,这里没办法前进,所以可以选

题目4

1
2
3
4
5
6
7
8
9
10
如何遍历下面的 my_data 对象?
var my_data={a:'Ape', b:'Banana', c:'Citronella'};

A: for(var key in my_data) {}

B: foreach(my_data as key=>value) {}

C: for(var i=0;i<my_data.length;i++) {}

D: 全不选
  • 答案
    • A
  • 解析
    • A: 没有错,for...in语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。
      • for...in不应该用于迭代一个关注索引顺序的 Array。(Array用forEach或者for…of代替)
    • B: 大佬说是php的,php我不太懂
    • C: 对象没有.length属性,输出也是undefined(伪数组除外)