介绍

跨域

TIP

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

同源策略

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

同源策略限制行为

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

跨域场景

// 不跨域,同一域名,不同文件或路径,允许通信
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

解决方案

  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 (协议跨域)

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

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

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