[关闭]
@wy 2018-09-07T21:27:45.000000Z 字数 1894 阅读 533

2018-09-07面试题整理

面试题


1. eval是做什么的

作用:会将传入的字符串当做 JavaScript 代码进行执行
语法:eval(string)
说明:string是有效 JavaScript 代码。
安全问题: 当使用不可信任来源的代码时,谨慎使用 eval 解析。
缺点:
1. 可读性差
2. 不利于调试
3. 增加性能消耗
4. 破坏执行作用域

补充说明:

  1. 在以前不能解析JSON字符串的年代,使用eval可以把后端传来的JSON字符串转成对象:
  1. let s = '({"b":20,a:90})'
  2. console.log(eval(s));

现在使用JSON.parse代替。

  1. 破坏执行作用域
  1. var a = 10; // 全局变量
  2. let js = 'var a = 10000; console.log(a);'
  3. function test(){
  4. var b = 30;
  5. eval(js); // 执行后在全局重新定义了变量a
  6. eval('var b = 50;'); // 执行后覆盖局部的变量b
  7. console.log(b); // 输出为50
  8. }
  9. test();
  10. console.log(a); // 结果为10000

执行代码后并不是在局部定义变量,而是在全局定义了变量 a
执行代码后在局部重新定义了b变量,把局部变量覆盖了。

2. 如果手动写动画,你认为最小间隔是多久,为什么?

多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms = 16.7ms

3. ["1","2","3"].map(parseInt)答案是多少?

首先需要了解parseInt的完整用法:
作用:解析一个字符串参数,并返回一个指定基数的十进制的整数
语法:parseInt(string, radix);
说明:radix一个介于2和36之间的整数,标示string字符串的基数。默认这个基数是10

例如:
parseInt('100', 10); 结果为:100
意思是把100通过基数10转成10进制的数字,结果还是100
数字100,从右到左从低位到高位,位置从0开始,依次乘上10为基数的次方,然后加上总和:
1*10^2 + 0*10^1 + 0*10^0 = 100 + 0 + 0 = 100;

parseInt('100', 2); 结果为:4
意思是把1000通过基数2转成10进制的数字,如下操作,把数字转成10进制:
数字100,从右到左从低位到高位,位置从0开始,依次乘上2为基数的次方,然后加上总和:
1*2^2 + 0*2^1 + 0*2^0 = 4 + 0 + 0 = 4;

parseInt('100', 3); 结果为:9
意思是把1000通过基数3转成10进制的数字,如下操作,把数字转成10进制:
数字100,从右到左从低位到高位,位置从0开始,依次乘上3为基数的次方,然后加上总和:
1*3^2 + 0*3^1 + 0*3^0 = 6 + 3 + 0 = 9;

一直到基数为36都成立。。。

但是要注意,传入的数字每一位不能大于等于基数,否则返回NaN,例如:

parseInt('200', 2); 结果为:NaN
parseInt('301', 3); 结果为:NaN

再说map方法的使用,主要是map回调函数的使用

  1. [1,2,3].map((item,index) => {
  2. 这个回调函数接收的是每一项item,和下标index
  3. })

回到题再来看一下,["1","2","3"].map(parseInt)

使用map循环数组,传入parseInt,此时parseInt会接受两个参数,每一项和下标,就类似这样:

["1","2","3"].map(function parseInt(item,index){
...
})

具体到调用parseInt接收的参数:

  1. parseInt('1',0) // 基数不能为0,直接返回前面数字 结果为1
  2. parseInt('2',1) // 基数为1,前面数字位数有大于1的,结果为NaN
  3. parseInt('3',2) // 基数为2,前面数字位数有大于2的,结果为NaN

map返回值是数组,所以最终结果为: [1,NaN,NaN]

4. 如果把HTML5看做是一个平台,那它构建的模块有哪些?

参考:http://witcher42.github.io/2014/06/03/open-web-platform/

5. ES6新特性

函数默认参数
模板字符串
扩展运算符...
解构赋值
箭头函数 =>
Promise对象解决异步回调
块级作用域的let和const
类class,继承extend
模块化es6 module

参考:http://es6.ruanyifeng.com/

6. flash和ajax各自的优点,如何取舍?

flash被浏览器抛弃了,只用ajax。(自行回答,没赶上用flash的时代)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注