当前位置:   article > 正文

代码知识点_alapi接口

alapi接口

JS&基础知识篇:

1、事件流  

分为捕获型、冒泡型,addEventListener的第三个参数,为true是捕获型,为false是冒泡型(即默认不写是冒泡型)

常用的事件:click、mouseover(支持冒泡)、mouseout(支持冒泡)、mouseenter(不支持冒泡)、mouseleave(不支持冒泡)、blur(失焦支持冒泡)、focus(聚焦支持冒泡)、keyup(释放键盘)、keydown(按住键盘)、resize。

详见:JavaScript事件类型 - Wayne-Zhu - 博客园

event对象:target(事件触发的dom对象)、currentTarget(监听事件的dom对象)、stopPropagation(阻止冒泡)、preventDefault(阻止默认事件)

兼容写法:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

event.stopPropagation其实是阻止事件的传播,并不是仅仅只是阻止冒泡,他连捕获事件也会阻止的

event.stopImmediatePropagation是在stopPropagation的基础上,把当前节点的同类事件也给阻止


document.getElementById('app').addEventListener('click', (e) => {

  // 如果是e.stopPropagation()的话,下面会执行
  e.stopImmediatePropagation()
  console.log(e.currentTarget.tagName)
})


document.getElementById('app').addEventListener('click', (e) => {

  // 这里不会执行
  console.log(e.currentTarget.tagName)
})

document.getElementById('app').addEventListener('custom', () => {});

document.getElementById('app').dispatchEvent('custom', 'aaa')

2、原型链

每一个function方法都有一个prototype,每一个由方法new出来的对象都有一个_proto_,然后function的prototype和对象的_proto_是相等的,可以利用这个特性实现js的继承

A.prototype = new B();

Function和Object的关系

Function和Object都是构造函数,他们都是Function的实例对象,即Function.__proto__ === Function.prototoye

Object.__proto__ === Function.prototype

Object instanceof Function === true           Function instanceof Object === true


3、面向对象

封装(函数封装)、继承(原型链继承)、多态(arguments参数多态)


4、内存泄漏

闭包、遗忘的定时器、dom引用


5、call bind apply

  1. function test(a, b, c) {
  2. console.log(a, b, c);
  3. }
  4. Function.prototype.bindNew = function() {
  5. var self = this
  6. var params = arguments
  7. var context = params[0]
  8. var args = Array.prototype.slice.call(params, 1)
  9. return (...rest) => {
  10. self.apply(context, args.concat(rest))
  11. }
  12. }
  13. test.bindNew(window, 1, 2)(3);


6、闭包

在外部获取函数体内部变量的值,就叫闭包

  1. function test() {
  2. var num = 1;
  3. return function() {
  4. return num;
  5. }
  6. }
  7. var data = test()();
  8. console.log(data);
  9. //输出5个5
  10. for (var i = 0; i < 5;i++) {
  11. setTimeout(() => {
  12. console.log(i)
  13. }, 100)
  14. }
  15. 通过闭包可以解决问题,输出01234
  16. for (var i = 0; i < 5;i++) {
  17. (function(a){
  18. setTimeout(() => {
  19. console.log(a)
  20. }, 100)
  21. })(i)
  22. }
  23. 通过let也可以解决,输出01234
  24. for (let i = 0; i < 5;i++) {
  25. setTimeout(() => {
  26. console.log(i)
  27. }, 100)
  28. }
  29. setTimeout的第三个参数,可以给第一个参数的方法传递参数,也可以做到输出01234
  30. for (var i = 0; i < 5;i++) {
  31. setTimeout((a) => {
  32. console.log(a)
  33. }, 100, i)
  34. }

7、伪类 伪元素

  1. 伪类:
  2. :link
  3. :visited
  4. :hover
  5. :active
  6. :first-child
  7. :first-of-type
  8. :last-child
  9. :last-of-type
  10. 伪元素:
  11. ::before
  12. ::after
  13. .xxx:first-child和.xxx:first-of-type 的区别?
  14. (https://www.jianshu.com/p/b6981849ab3b)
  15. :first-child匹配的是某个父元素的第一个子节点的class是否为xxx,如果不是,就没有
  16. :first-of-type匹配的是某个父元素的第一个class为xxx的子节点(父元素的第二个子节点为xxx也能匹配到)
  17. 为什么要清除浮动?
  18. 因为子元素是浮动,就脱离了文档流,父元素的高度就会出现异常,如果这个时候给父元素设置背景色或者边框什么的样式的话,就和想象中不一致,这个时候就必须要用清除浮动来撑开父元素的高度
  19. 清除浮动:
  20. <!DOCTYPE html>
  21. <html lang="en">
  22. <head>
  23. <meta charset="UTF-8">
  24. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  25. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  26. <title>Document</title>
  27. </head>
  28. <style>
  29. html,
  30. body {
  31. width: 100%;
  32. height: 100%;
  33. position: relative;
  34. }
  35. .clearfix {
  36. zoom: 1;
  37. }
  38. .clearfix:after {
  39. display: block;
  40. clear: both;
  41. content: "";
  42. }
  43. .left {
  44. width: 100px;
  45. height: 100px;
  46. background-color: red;
  47. float: left;
  48. }
  49. .right {
  50. width: 100px;
  51. height: 100px;
  52. background-color: black;
  53. float: right;
  54. }
  55. </style>
  56. <body>
  57. <div class="clearfix">
  58. <div class="left"></div>
  59. <div class="right"></div>
  60. </div>
  61. </body>
  62. </html>

8、深浅拷贝

  1. 值引用(为了解决下面这个问题,就出现了深浅拷贝):
  2. var obj1 = { a: 1 };
  3. var obj2 = obj1 ;
  4. obj2.b = 2;
  5. console.log(obj1);
  6. console.log(obj2);
  7. 深拷贝:
  8. lodash的cloneDeep
  9. for in 循环可以循环一个对象的原型链的属性,Object.keys就拿不到原型链里的属性
  10. for in 通过hasOwnProperty可以判断是否是自己的属性,而不是原型链的属性
  11. 浅拷贝:
  12. var obj1 = { a: 1 };
  13. var obj2 = $.extend({}, obj1); // 或者用var obj2 = Object.assign({}, obj1)
  14. obj2.b = 2;
  15. console.log(obj1);
  16. console.log(obj2);
  17. 浅拷贝有一个问题就是,多层次会有问题,多层次直接覆盖对象,不会进行合并
  18. var a = {a:1, b: {c:1, d:2}}
  19. var b = {a:2, b: {c:2, e:3}}
  20. var c = Object.assign(a, b) // 或者var c = $.extend(a, b)
  21. console.log(a) // 输出 {a:2, b: {c:2, e:3}}
  22. console.log(c) // 输出 {a:2, b: {c:2, e:3}}
  23. console.log(a === c) // 输出 true
  24. a.b.c = 4
  25. console.log(a) // 输出 {a:2, b: {c:4, e:3}}
  26. console.log(c) // 输出 {a:2, b: {c:4, e:3}}
  27. 这个时候的浅拷贝,实际b还是个指针形式,a改变了还是c会被改变
  28. 用lodash的merge方法,可以实现想要的merge
  29. var a = {a:1, b: {c:1, d:2}}
  30. var b = {a:2, b: {c:2, e:3}}
  31. var c = _.merge(a, b)
  32. console.log(c) // {a:2, b: {c:2, d:2, e:3}}
  33. console.log(a) // {a:2, b: {c:2, d:2, e:3}}
  34. 深拷贝的循环引用使用 weakMap 做缓存,遇到value在weakMap中,就不做深拷贝,直接用 weakMap 中的值


9、盒子模型

margin、border、padding、content

  1. box-sizing: border-box; // IE盒子 width=content+padding+border
  2. box-sizing: content-box; // W3C标准盒子 width=content

10、flex布局的注意事项(flex布局的注意事项_初漾的博客-CSDN博客
11、从输入 URL 到页面加载完成的过程中都发生了什么事情?(从输入URL到页面加载完成的过程中都发生了什么事情? - SegmentFault 思否

网络 | 前端进阶之道

  1. 1、DNS解析域名获取到IP
  2. 2、客户端和服务端建立连接(三次握手)
  3. 3、客户端向服务端发起请求
  4. 4、服务端根据不同请求返回不同的状态码和对应数据给客户端(200,304缓存,404,500等)
  5. 5、客户端拿到数据之后开始解析,根据HTML生成DOM树,CSS文件生成CSSOM树,然后由这2个树生成一个渲染树对页面进行渲染
  6. 图片资源如果是display:none,也会发网络请求

DNS解析域名过程

  1. 1、浏览器查看缓存是否有该域名的访问记录,有的话返回IP
  2. 2、本机查询hosts文件中是否有该域名的配置,有的话返回IP
  3. 3、路由器查询缓存中是否有该域名的访问记录,有的话返回IP
  4. 4、再到ISP(互联网服务提供商)DNS缓存中查询该域名的IP,有的话返回IP
  5. 5、到全球仅有的13个根域名服务器群中查询,有的话返回IP
  6. 6、顶级域名服务器中查询,有的话返回IP

递归解析:一直透传

迭代解析:先查询浏览器缓存是否有记录,如果没有,就返回,然后再到hosts文件中查询是否有记录,没有就再返回。。

12、GET请求和POST请求的区别
13、doctype有什么作用?
14、跨域问题  srcipt标签src跨域 POSTMESSAGE access-control-allow-origin

  1. 1、form表单可以跨域,因为form表单提交之后,是收不到响应的,浏览器认为这样是安全的。
  2. 2、浏览器的同源策略,限制的是不能从其他域拿到数据,但是它并不阻止你向其他域发请求
  3. 3、form表单提交会带cookie,比如<form action="https://www.baidu.com/"></form>就会带上
  4. baidu.com的cookie,但是baidu.com如果限制了samesite的cookie,是不会带的,form表单提交是可以做csrf攻击的
  5. 4、ajax和fetch跨域的时候默认是不会携带cookie的,如果要携带的话,fetch可以增加credentials参数(same-origin默认值、include携带、omit不携带),ajax可以增加withCredentials参数(true携带、false不携带),但是samesite的cookie一样是不会带的。另外在增加了credentials和withCredentials参数之后,后端设置Access-Control-Allow-Origin不能为*,只能为指定的域名,且后端必须设置 Access-Control-Allow-Credentials: true

CORS——跨域请求那些事儿 - 云享 - 博客园
15、AMD和CMD、CommonJS和ESModule区别

  1. AMD依赖前置,CMD依赖就近。AMD依赖加载完再往下运行,CMD由上往下,边加载依赖,边运行
  2. 1、CommonJS是被加载的时候运行,ESModule是编译的时候运行
  3. 2、CommonJS输出的是值的浅拷贝,ESModule输出的是引用
  4. 3、CommonJS第一次require模块的时候会运行整个文件并输出,后面再次require就会从内存中取值


16、为什么利用多个域名来存储网站资源会更有效?(为什么用多个域名来存储网站资源会更有效 - (f)VV>
17、浏览器兼容性问题
18、H5 Android IOS兼容性问题

19、rem布局(rem布局实现不同分辨率移动终端的自适应、整体缩放_irokay的博客-CSDN博客)   

移动端基础知识概述与适配(前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配 - 掘金

移动端视口

视口总结 - 掘金

移动端兼容性问题(移动端适配及PC端适配心得总结体会(一) (可能比较全 - 掘金)  (移动端适配及PC端适配心得总结体会(二) (可能比较全 - 掘金

设计稿是750px的,以iphone6为准,iphone6设备是750px宽,它上面的html字体大小是75px,然后设计稿中为375px宽的按钮,就是5rem,公式是rem = (设计稿上的像素 / 75) * 1rem;就是1rem=75px

  1. H5和客户端通信 => JSBridge
  2. 1、客户端调用H5,客户端可以通过代码调用webview里面的window下的方法,将需要传递的数据通过参数传给H5
  3. 2、H5调用客户端,客户端会在webview中注册一个方法放在window下,然后H5调用window下的这个方法,就可以将数据传递给客户端

20、H5 iphoneX适配问题(iPhoneX适配方案_enoyao的博客-CSDN博客_iphonex分辨率)

  1. @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {
  2. .container{
  3. padding: constant(safe-area-inset-top) 0 constant(safe-area-inset-bottom) 0;
  4. padding: env(safe-area-inset-top) 0 env(safe-area-inset-bottom) 0;
  5. }
  6. .prepare{
  7. padding-top: pxToRem(75px);
  8. padding-bottom: pxToRem(75px);
  9. .btn{
  10. margin-top: pxToRem(44px);
  11. }
  12. }
  13. .balance-con{
  14. margin-bottom: constant(safe-area-inset-bottom);
  15. margin-bottom: env(safe-area-inset-bottom);
  16. }
  17. .invite-code{
  18. bottom: 0 0 constant(safe-area-inset-bottom) 0;
  19. bottom: 0 0 env(safe-area-inset-bottom) 0;
  20. }
  21. .service{
  22. bottom: constant(safe-area-inset-bottom);
  23. }
  24. }


21、H5 点击穿透 滚动穿透

  1. 点击穿透:
  2. touch事件分为touchstart、touchend,touch和click中间相隔300ms
  3. 为什么有300ms延迟:是因为移动端要有双击缩放的需求,就用了300ms的延迟
  4. 遮盖的元素绑定touch事件,
  5. 被遮盖的元素绑定click事件,就会有点击穿透,被遮盖的元素也会触发click事件
  6. 解决方法:
  7. 1、在遮盖元素延时350ms再隐藏
  8. 2、遮盖元素绑定touchend事件,在事件中让被遮盖元素增加一个样式pointer-events:none;
  9. 去除300ms的途径:
  10. 1、meta设置禁用缩放
  11. 2、FastClick的实现原理是在检测到touchend事件的时候,会通过DOM自定义事件立即出发模拟一个click事件,并把浏览器在300ms之后的click事件阻止掉
  12. 滚动穿透:
  13. 弹出框是fixed,然后再弹出啊框滑动的时候,会让页面滑动
  14. 解决方法:
  15. 如果弹出框内部不需要滑动:
  16. $('.mask').on('touchmove', (e)=> {
  17. e.preventDefault();
  18. })
  19. 阻止默认事件,能阻止页面滑动
  20. 如果弹出框内部需要滑动
  21. 在弹出框出现的时候,设置$('html,body').css('overflow', 'hidden');
  22. 在弹出框消失的时候,设置$('html,body').css('overflow', 'auto');


22、微信小程序
23、使用 CSS 预处理器(如less、sass、suitcss)的优缺点有哪些?
24、React Redux
25、promise (经常在请求jsonp配置文件的时候用,就是写一个promise,他的内部是一个异步获取数据的过程,获取成功resolve,失败reject,然后promise.then分别处理成功和失败的回调)

  1. var promise = new Promise((resolve, reject) => {
  2. if (true) {
  3. setTimeout(() => {
  4. resolve(1);
  5. });
  6. } else {
  7. setTimeout(() => {
  8. reject(0);
  9. });
  10. }
  11. });
  12. promise.then((res) => {
  13. console.log(res);
  14. });


26、cookie、session

  1. cookie的作用:
  2.     1.可以在客户端上保存用户数据,起到简单的缓存和用户身份识别等作用。
  3.     2.保存用户的登陆状态,用户进行登陆,成功登陆后,服务器生成特定的cookie返回给客户端,客户端下次访问该域名下的任何页面,将该cookie的信息发送给服务器,服务器经过检验,来判断用户是否登陆。
  4.     3.记录用户的行为。  
  5.     
  6. cookie弊端:
  7.     1.增加流量消耗,每次请求都需要带上cookie信息。
  8.     2.安全性隐患,cookie使用明文传输。如果cookie被人拦截了,那人就可以取得所有的session信息。
  9.     3.Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉


27、前端模块加载,webpack
28、es6
29、婚礼微信小程序
30、ant desigh Pro
31、垂直居中
32、层级上下文
33、箭头函数和普通函数区别  箭头函数与普通函数的区别 - biubiu小希希 - 博客园

  1. 1、箭头函数不能用new
  2. 2、箭头函数this指向是上下文,构造函数this指向生成的对象,其他的函数this指向是调用函数的对象
  3. 3、箭头函数没有prototype
  4. 4、箭头函数没有arguments,取而代之的是rest参数
  5. const func = (...rest) => {
  6. console.log(rest); // [1,2,3]
  7. }
  8. func(1,2,3);


34、new干了啥(https://www.cnblogs.com/faith3/p/6209741.html )

  1. var obj = new AAA();
  2. 等同于
  3. var obj = {};
  4. obj._proto_ = AAA.prototype;
  5. AAA.call(obj);
  6. (1) 创建一个新对象;
  7. (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
  8. (3) 执行构造函数中的代码(为这个新对象添加属性) ;
  9. (4) 返回新对象。
  10. 实现new的功能
  11. function SelfNew() {
  12. var params = Array.prototype.slice.call(arguments, 1)
  13. var func = arguments[0]
  14. var obj = {}
  15. obj.__proto__ = func.prototype
  16. var result = func.apply(obj, params)
  17. if (typeof result === 'object' && result !== null) {
  18. return result
  19. } else {
  20. return obj
  21. }
  22. }
  23. function A(a, b) {
  24. this.a = a
  25. this.b = b
  26. return 1
  27. }
  28. var a = SelfNew(A, 1, 2)
  29. console.log(a)
  30. console.log(new A(1,2))
  31. 构造函数如果return了基础数据类型,就对new出来的对象无影响,
  32. 如果return了复杂数据类型,就是return的那个对象
  33. function A() {
  34. this.name = 'name'
  35. this.sex = 'male'
  36. return 1
  37. }
  38. function B() {
  39. this.name = 'name'
  40. this.sex = 'male'
  41. return {}
  42. }
  43. var a = new A()
  44. var b = new B()
  45. console.log(a) // {name: 'name', sex: 'male}
  46. console.log(b) // {}
  47. new.target可以判断一个函数是否是以构造函数的形式被调用的
  48. function Person(name) {
  49. if (new.target !== undefined) {
  50. this.name = name;
  51. } else {
  52. throw new Error('必须使用 new 命令生成实例');
  53. }
  54. }
  55. // 另一种写法
  56. function Person(name) {
  57. if (new.target === Person) {
  58. this.name = name;
  59. } else {
  60. throw new Error('必须使用 new 命令生成实例');
  61. }
  62. }


35、作用域链  javascript学习中自己对作用域和作用域链理解 - 萧诺 - 博客园 

个人理解:从里到外的作用域形成的链

分为全局作用域和函数作用域,然后函数内部可以通过作用域链去访问到他的父函数乃至全局作用域下的一些变量。

  1. var a = 1;
  2. function A() {
  3. var b = 2;
  4. function B() {
  5. var c = 3;
  6. console.log(a); //1
  7. console.log(b); //2
  8. }
  9. }
  10. 函数B可以通过作用域链,访问到父函数A环境下里的变量b,也可以访问到全局环境的变量a

首先先来了解什么是作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合

换句话说,作用域决定了代码区块中变量和其他资源的可见性 我们一般将作用域分成:

  • 全局作用域:任何不在函数中或是大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问

  • 函数作用域:函数作用域也叫局部作用域,如果一个变量是在函数内部声明的它就在一个函数作用域下面。这些变量只能在函数内部访问,不能在函数以外去访问

  • 块级作用域:ES6引入了letconst关键字,和var关键字不同,在大括号中使用letconst声明的变量存在于块级作用域中。在大括号之外不能访问这些变量

什么是作用域链:当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域

如果在全局作用域里仍然找不到该变量,它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错

36、作用域 JS中的块级作用域,var、let、const三者的区别_hot_cool的博客-CSDN博客_块级作用域

  1. 1var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
  2. 2let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
  3. 3const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
  4. 为什么要有let和块级作用域??
  5. 函数作用域会有这样的现象,函数内部的同名变量会覆盖外层的变量,块级作用域就不会有这样的问题,let创建的变量会出现块级作用域,let声明的变量不会出现变量提升,不能重名,因为会出现暂时性死区


37、jQuery.fn = jQuery.prototype
38、进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
39、线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
40、同步就是得到结果才会返回,异步没得到结果就返回
41、并发是一个CPU执行多个程序,并行是多个CPU执行多个程序
42、阻塞就是调用返回结果之前,线程会挂起,这时候就是阻塞,非阻塞就是调用结果返回之前,不会阻塞当前线程
43、null undefined String Number Boolean Object Symbol   typeof '11' == String

  1. == 会做类型转换
  2. === 不会做类型转换
  3. Object.is会在===的基础上,特殊处理了NaN,0,-0的情况
  4. NaN === NaN // false
  5. 0 === -0 // true
  6. Object.is(NaN,NaN) // true
  7. Object.is(0,-0) // false
  8. 为什么typeof可以检测类型?
  9. js在底层存储变量的时候会在变量的机器码的低位1-3位存储其类型信息(000:对象,010:浮点数,100:字符串,110:布尔,1:整数),但是null所有机器码均为0,直接被当做了对象来看待


var a = new String('11');  a instanceof String == true

null表示没有对象,即此处不应该有值。undefined表示缺少值,即此处应该有值,但没有定义

44、web前端性能优化   更快速将你的页面展示给用户[前端优化篇] - wingkun - 博客园

1、图片预加载,请求懒加载

2、工程化压缩合并js、css文件,减少文件请求数量

3、用多个域名存放文件

4、本地缓存localstorage

5、css动画替换js动画,H5播放器替换flash播放器

6、webpack图片压缩插件,路由拆分代码,按需加载

  1. 请求优化
  2.   图片延迟加载
  3.   ajax局部加载数据
  4.   预加载
  5. 资源优化
  6.   资源压缩(uglify-js,clean-css)
  7.   资源合并
  8.   自动化构建(gulp)
  9.   图片合并csssprite
  10.   iconfont
  11.   引用优化
  12.   单独域名存放资源
  13. 缓存
  14.   Cache-Control缓存策略
  15.   离线存储
  16.   本地存储localStorage
  17. 其它的
  18.   css3替换js动画
  19.   替换flash
  20.   结语


45、xss(XSS攻击原理及防御措施 - 很好玩 - 博客园

  1. xss是跨站脚本,在输入的地方写htmljs,然后服务端接受到了,在其他客户端会收到这串脚本,就会执行
  2. Html
  3. encode防止xssjs-xss库防止xss

46、csrf(CSRF攻击原理及防御 - 很好玩 - 博客园)(https://www.v2ex.com/t/516357

  1. csrf是跨站请求攻击,恶意用户通过某种途径拿到了正常用户的cookie,然后通过cookie去模拟正常用户去发送一些恶意请求
  2. 验证 HTTP Referer 字段,判断来源
  3. Token防止csrf,尽量不要在cookie中暴露用户隐私信息
  4. same-site字段防止第三方网站
  5. 举例:
  6. 比如你登录了一个银行网站A,银行网站A里面有个请求是更新你的账户数据的,然后这个时候你进入了一个危险网站B,这个危险网站B里面会调用银行网站A里面的这个更新数据的接口,那么你就会发出一个银行网站A的更新数据的请求,并且会带上银行网站Acookie,这个时候就是csrf
  7. token,就可以在调用这个接口的时候,让你带不上这个token,带不上token服务端就不会进行更新操作了
  8. 问题:如果token被盗用了怎么办?
  9. token 不是用来做用户信息加密的,而是和 session 一样用来做身份鉴别的,至于信道安全性还是需要用 https 保证

47、变量提升和函数提升(JavaScript 声明提升 | 菜鸟教程

  1. JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
  2. JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。

48、Array数组方法(js数组方法大全 - 流sand - 博客园

  1. slice(): 第一个参数是开始位置(第一个从0开始),第二个参数(可省)是结束位置,
  2. 如果没有第二个参数,默认就是最后一个位置,但不包括结束位置的项,为负数就加上数组长度进行转换。
  3. 源数组不会改变。
  4. var arr = [1,3,5,7,9,11];
  5. var arrCopy = arr.slice(1);
  6. var arrCopy2 = arr.slice(1,4);
  7. var arrCopy3 = arr.slice(1,-2);
  8. var arrCopy4 = arr.slice(-4,-1);
  9. console.log(arr); //[1, 3, 5, 7, 9, 11](原数组没变)
  10. console.log(arrCopy); //[3, 5, 7, 9, 11]
  11. console.log(arrCopy2); //[3, 5, 7]
  12. console.log(arrCopy3); //[3, 5, 7]
  13. console.log(arrCopy4); //[5, 7, 9]
  14. splice():
  15. 2个参数代表删除,第一个参数是开始位置(第一个从0开始),第二个参数是要删除的个数(传0代表不删除),源数组会改变。
  16. 3个参数(或者更多参数)代表删除后再插入,第一个参数是开始位置(第一个从0开始),第二个参数是要删除的个数(传0代表不删除),第三个参数为插入的值。
  17. var arr = [1,3,5,7,9,11];
  18. var arrRemoved = arr.splice(0,2);
  19. console.log(arr); //[5, 7, 9, 11]
  20. console.log(arrRemoved); //[1, 3]
  21. var arrRemoved2 = arr.splice(2,0,4,6);
  22. console.log(arr); // [5, 7, 4, 6, 9, 11]
  23. console.log(arrRemoved2); // []
  24. var arrRemoved3 = arr.splice(1,1,2,4);
  25. console.log(arr); // [5, 2, 4, 4, 6, 9, 11]
  26. console.log(arrRemoved3); //[7]

49、JS运行机制(彻底搞懂JavaScript事件循环 - 掘金

场景题:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/590245

推荐阅读
相关标签
  

闽ICP备14008679号