介绍
跨域
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
解决方案
- jsonp
- cors (跨域资源共享)
- postMessage
- document.domain + iframe
- window.name + iframe
- location.hash + iframe
- http-proxy (nodejs 中间件代理跨域)
- nginx (代理跨域)
- 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
数组中一万个数据,访问第一个和最后一个效率会有什么差异,为什么
没有差异,因为数组是一块线性连续的内存,可以通过寻址公式一步取出对应的成员,这跟成员的位置没有关系.