BAT及各大互联网公司2020前端笔试面试题

Stella981
• 阅读 443

1.请你谈谈Cookie的优缺点

优点:极高的扩展性和可用性

  1. 数据持久性。
  2. 不需要任何服务器资源。 Cookie 存储在客户端并在发送后由服务器读取。
  3. 可配置到期规则。 控制 cookie 的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的 cookie 。
  4. 简单性。 基于文本的轻量结构。
  5. 通过良好的编程,控制保存在 cookie 中的 session 对象的大小。
  6. 通过加密和安全传输技术( SSL ),减少 cookie 被破解的可能性。
  7. 只在 cookie 中存放不敏感数据,即使被盗也不会有重大损失。

缺点:

  1. Cookie 数量和长度的限制 。 数量:每个域的 cookie 总数有限。 a) IE6 或更低版本最多 20 个 cookie b) IE7 和之后的版本最后可以有 50 个 cookie c) Firefox 最多 50 个 cookie d) chrome 和 Safari 没有做硬性限制 长度:每个 cookie 长度不超过 4KB ( 4096B ),否则会被截掉。
  2. 潜在的安全风险 。 Cookie 可能被拦截、篡改。如果 cookie 被拦截,就有可能取得所有的 session 信息。
  3. 用户配置为禁用 。有些用户禁用了浏览器或客户端设备接受 cookie 的能力,因此限制了这一功能。
  4. 有些状态不可能保存在客户端 。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。

2.Array.prototype.slice.call(arr,2)方法的作用是:

利用Array原型上的slice方法,使用call函数的第一个参数,让这个方法中的this指向arr,并传递参数2,实际上等于arr.slice(2),即从下标为2开始截取到末尾。

3.JavaScript的数据类型都有什么?

基本数据类型:String,Boolean,Number,Undefined, Null

引用数据类型:Object(Array,Date,RegExp,Function)

那么问题来了,如何判断某变量是否为数组数据类型?

方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法,故有时会失效 方法二.obj instanceof Array 在某些IE版本中不正确 方法三.方法一二皆有漏洞,在ECMA Script5中定义了新方法Array.isArray(), 保证其兼容性,最好的方法如下:

if(typeof Array.isArray==="undefined")
{
  Array.isArray = function(arg){
        return Object.prototype.toString.call(arg)==="[object Array]"
    }; 
}

4.简单说一下浏览器本地存储是怎样的

总的来说,浏览器存储分为以下几种: 1、Cookie存储,明文,大小限制4k等 2、localStorage,持久化存储方式之一,不用在两端之间传输,且限制大小为10M 3、sessionStorage,会话级存储方式,浏览器关闭立即数据丢失 4、indexDb,浏览器端的数据库

5.原型链:

原型链是由原型对象组成,每个对象都有 proto 属性,指向了创建该对象的构造函数的原型,proto 将对象连接起来组成了原型链。是一个用来实现继承和共享属性的有限的对象链。

属性查找机制: 当查找对象的属性时,如果实例对象自身不存在该属性,则沿着原型链往上一级查找,找到时则输出,不存在时,则继续沿着原型链往上一级查找,直至最顶级的原型对象Object.prototype,如还是没找到,则输出 undefined;

属性修改机制: 只会修改实例对象本身的属性,如果不存在,则进行添加该属性,如果需要修改原型的属性时,则可以用: b.prototype.x = 2;但是这样会造成所有继承于该对象的实例的属性发生改变。

6.变量对象

变量对象,是执行上下文中的一部分,可以抽象为一种 数据作用域,其实也可以理解为就是一个简单的对象,它存储着该执行上下文中的所有 变量和函数声明(不包含函数表达式)。 活动对象 (AO): 当变量对象所处的上下文为 active EC 时,称为活动对象。

7.作用域链

我们知道,我们可以在执行上下文中访问到父级甚至全局的变量,这便是作用域链的功劳。作用域链可以理解为一组对象列表,包含 父级和自身的变量对象,因此我们便能通过作用域链访问到父级里声明的变量或者函数。 由两部分组成:

  • [[scope]]属性: 指向父级变量对象和作用域链,也就是包含了父级的[[scope]]和AO
  • AO: 自身活动对象 如此 [[scopr]]包含[[scope]],便自上而下形成一条 链式作用域。

8.闭包

闭包属于一种特殊的作用域,称为 静态作用域。它的定义可以理解为: 父函数被销毁 的情况下,返回出的子函数的[[scope]]中仍然保留着父级的单变量对象和作用域链,因此可以继续访问到父级的变量对象,这样的函数称为闭包。 闭包会产生一个很经典的问题: 多个子函数的[[scope]]都是同时指向父级,是完全共享的。因此当父级的变量对象被修改时,所有子函数都受到影响。 解决: 变量可以通过 函数参数的形式 传入,避免使用默认的[[scope]]向上查找 使用setTimeout包裹,通过第三个参数传入 使用 块级作用域,让变量成为自己上下文的属性,避免共享

9. script 引入方式:

html 静态