Skip to content

常见面试题

1、跨域

TIP

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 实施的安全限制

(1)同源策略

同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。

(2)同源策略限制行为

  • Cookie、LocalStorage 和 IndexDB 无法读取
  • DOM 和 Js 对象无法获得
  • AJAX 请求不能发送

(3)跨域场景

js
// 不跨域,同一域名,不同文件或路径,允许通信
http://www.domain.com/a.js
http://www.domain.com/b.js
http://www.domain.com/lab/c.js

// 跨域,同一域名,不同端口,不允许通信
http://www.domain.com:8000/a.js
http://www.domain.com/b.js

// 跨域,同一域名,不同协议,不允许通信
http://www.domain.com/a.js
https://www.domain.com/b.js

// 跨域,域名和域名对应相同ip,不允许通信
http://www.domain.com/a.js
http://192.168.4.12/b.js

// 跨域,主域相同,子域不同,不允许通信
http://www.domain.com/a.js
http://x.domain.com/b.js
http://domain.com/c.js

// 跨域,不同域名,不允许通信
http://www.domain1.com/a.js
http://www.domain2.com/b.js

(4)解决方案

  1. jsonp
  2. cors (跨域资源共享)
  3. postMessage
  4. document.domain + iframe
  5. window.name + iframe
  6. location.hash + iframe
  7. http-proxy (nodejs 中间件代理跨域)
  8. nginx (代理跨域)
  9. webSocket (协议跨域)

2、forEach for in for of 的差异

forEach 专门用来循环数组,可以直接取到元素,同时也可以取到 index 值 存在局限性,不能 continue 跳过或者 break 终止循环,没有返回值,不能 return

for...in 一般循环遍历的都是对象的属性,遍历对象本身的所有可枚举属性,以及对象从其构造函数原型中继承的属性, 输出结果 key 会变成字符串类型

for of 是 ES6 新引入的特性。修复了 ES5 中 for in 的不足,允许遍历 Arrays(数组)、Strings(字符串)、Maps(映射)、Sets(集合)等可迭代的数据结构 for of 支持 return, 只能遍历数组不能遍历对象(遍历对象需要通过和 Object.keys()搭配使用) 输出结果为 value

3、数组中一万个数据,访问第一个和最后一个效率会有什么差异,为什么

没有差异,因为数组是一块线性连续的内存,可以通过寻址公式一步取出对应的成员,这跟成员的位置没有关系.

Released under the MIT License.