校招笔记

189 阅读5分钟

前端校招面试题持续更新...

个人博客网站欢迎交流:萤火之森:https://blog.xkongkeji.com

css 盒子模型

  • W3C 的标准盒模型

    在标准的盒子模型中,width 指 content 部分的宽度

  • IE 的盒模型

    在 IE 盒子模型中,width 表示 content+padding+border 这三个部分的宽度

  • box-sizing 的使用

box-sizing: content-box 是W3C盒子模型
box-sizing: border-box 是IE盒子模型

固定宽高元素的水平垂直居中

  • position:absolute、50%和 margin:-px
  • position:fixed、0 和 margin:auto
.container {
   position:fixed;
   top:0;
   right:0;
   bottom:0;
   left:0;
   margin:auto;
}
  • position:absolute、0 和 margin:auto
  • position:absolute、50%和 translate
.container {
  position: relative;
}
.inner {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
  • css3 flex

跨域,常用方案

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。

  • 通过 jsonp 跨域(只支持 get、利用 script 无同源限制,以函数参数形式获取返回值)

    首先说一下 jsonp 的原理,例如我们平时写 html 的时候常常会使用

    这种方式去取放在另外服务器上的静态资源,这个是不受同源策略所限制的,所以我们利用这一点可以解决跨域的问题。
    在www.a.com域名写下如下代码,去请求www.b.com域名的数据
    var script = document.creatElement('script');
    script.type = 'text/javascript';
    script.src = 'http://www.b.com/getdata?callback=demo';
    function demo(res){
      console.log(res);
    }
    
  • nginx 代理跨域

server{
    # 监听8080端口
    listen 8080;
    # 域名是localhost
    server_name localhost;
    #凡是localhost:8080/api这个样子的,都转发到真正的服务端地址http://www.b.com:8080
    location ^~ /api {
        proxy_pass http://www.b.com:8080;
    }
}

补充:进行带有身份凭证的 CORS 请求

1)、默认情况下的跨域请求都是不会把 cookie 发送给服务器的,在需要发送的情况下,如果是 xhr,那么需要设置 xhr.withCredentials=true,

(2)、如果是采用 fetch 获取的话,那么需要在 request 里面设置 credentials:'include',

(3)、但是如果服务器在预请求的时候没返回 Access-Control-Allow-Crenditials:true 的话,那么在实际请求的时候,cookie 是不会被发送给服务器端的,要特别注意对于简单的 get 请求,不会有预请求的过程,

http 缓存,强缓存/协商缓存

HTTP Cache 是我们开发中接触最多的缓存,它分为强缓存和协商缓存。

  • 强缓存:直接从本地副本比对读取,不去请求服务器,返回的状态码是 200。

    强缓存主要包括 expires 和 cache-control。

  • 协商缓存:会去服务器比对,若没改变才直接读取本地缓存,返回的状态码是 304。

    协商缓存主要包括 last-modified 和 etag

  • 当 Cache-Control 设置为 max-age=xx 并且同时设置 Expires 时,Cache-Control 的优先级更高

  • 当 ETag 和 Last-Modified 同时存在时,服务器先会检查 ETag,然后再检查 Last-Modified,最终决定返回 304 还是 200

箭头函数和普通函数的区别

  • 箭头函数是匿名函数,不能作为构造函数,不能使用 new
  • 箭头函数不能绑定 arguments
  • 箭头函数没有原型属性
  • 箭头函数的 this 永远指向其上下文的 this,没有办改变其指向, 普通函数的 this 指向调用它的对象
  • 箭头函数不绑定 this,会捕获其所在的上下文的 this 值,作为自己的 this 值

JS 如何终止 forEach 循环 break 报错,return 跳不出循环

  • forEach 大概是没有办法中断了,我们可以采用其它的办法来实现循环

    终止 forEach 可以使用 try catch 内部抛出错误,catch 捕获错误。

    let arr = [1, 2, 3]
    try {
      arr.forEach(item => {
        if (item === 2) {
          throw('循环终止')
        }
        console.log(item)
      })
    } catch(e) {
      console.log('e: ', e)
    }
    
  • Array.prototype.some

    当 return true 的时候,会终止遍历

  • Array.prototype.every

    当 return false 的时候,会终止遍历

for in 和 for of 的区别

  • for in 遍历的是对象的下标并且会遍历原型链,
  • for of 遍历对象的值

null typeof 为什么是 Object

  • js 初版,使用的是 32 位系统,为了性能考虑使用低位存储了变量的类型信息
  • (二进制)000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object

判断这个对象是数组的方法

  • Array.isArray()
  • instanceof
  • Object.prototype.toString().call()

怎样实现跨域 AJAX 请求发送 Cookie

  • 第一步: 服务器必须在 Response Header 中设置:

    Access-Control-Allow-Credentials: true

  • 第二步: 客户端发起请求时需要将

    xhr.withCredentials 设为: true;

CommonJS 模块与 ES6 模块的区别

  • 因为 CommonJS 的 require 语法是同步的,所以就导致了 CommonJS 模块规范只适合用在服务端,而 ES6 模块无论是在浏览器端还是服务端都是可以使用的,但是在服务端中,还需要遵循一些特殊的规则才能使用 ;
  • CommonJS 模块输出的是一个值的拷贝,而 ES6 模块输出的是值的引用;
  • CommonJS 模块是运行时加载,而 ES6 模块是编译时输出接口,使得对 JS 的模块进行静态分析成为了可能;
  • 因为两个模块加载机制的不同,所以在对待循环加载的时候,它们会有不同的表现。CommonJS 遇到循环依赖的时候,只会输出已经执行的部分,后续的输出或者变化,是不会影响已经输出的变量。而 ES6 模块相反,使用 import 加载一个变量,变量不会被缓存,真正取值的时候就能取到最终的值;
  • 关于模块顶层的 this 指向问题,在 CommonJS 顶层,this 指向当前模块;而在 ES6 模块中,this 指向 undefined;
  • 关于两个模块互相引用的问题,在 ES6 模块当中,是支持加载 CommonJS 模块的。但是反过来,CommonJS 并不能 requireES6 模块,在 NodeJS 中,两种模块方案是分开处理的。

设置 0.5px 的边框线(将伪元素宽高设置为父元素的 200%,然后通过 scale 缩放 50%)

.element {
  position: relative;
  &::before {
    top: 0;
    left: 0;
    z-index: 1;
    content: '';
    width: 200%;
    height: 200%;
    display: block;
    position: absolute;
    pointer-events: none;
    transform-origin: 0 0;
    box-sizing: border-box;
    transform: scale(.5, .5);
    border: 1px solid #ccc;
  }
}