快忘了的零散知识点

以防万一记录一下,页面整体变灰效果代码

html{
    -webkit-filter:grayscale(100%);
    -moz-filter:grayscale(100%);
    -ms-filter:grayscale(100%);
    -o-filter:grayscale(100%);
    filter:grayscale(100%);
    filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
    filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)
}

数组找出重复数字和次数,目前能想到的最优解

let data= [1,1,1,2,1,2,2,2,3,4,5,6,6,6]
let arr = data.sort()
let obj = {}
for(var i = 0; i < arr.length; i++) {
    let key = arr[i]
    // if else 判断
    // if(obj[key] == undefined) {
    //     obj[key] = 1
    // } else {
    //     obj[key]++
    // }
    // 三元运算符判断
    obj[key] == undefined ? obj[key] = 1 : obj[key]++
}
console.log(obj);//出现得最多排第一个,{1: 4, 2: 4, 3: 1, 4: 1, 5: 1, 6: 3}

数组排序

[[1,2,3],[3],[3,3,2,2,1]].sort((a,b)=>{
    //return a.length - b.length;//升序,长度最短的在第一个
    return b.length - a.length;//降序,长度最长的在第一个
})

// 语法:array.sort(fun);参数fun可选。规定排序顺序。必须是函数。
// 注:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。

// 如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
// 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
// 若 a 等于b,则返回 0。
// 若 a 大于 b,则返回一个大于 0 的值。
// 简单点就是:比较函数两个参数a和b,返回a-b 升序,返回b-a 降序

js打乱数组顺序

arr.sort((a, b)=>{ return Math.random() > 0.5 ? -1 : 1; });

自定义的数组/对象方法(放在原型链上的)

对象/数组.方法实现方式=>对象/数组.prototype.方法名=function(){

/*在这里面,this指向调用这个方法的对象/数组,说得直白点,this就是调用这个方法的对象/数组*/

}

大数据页面采用setInterval,websocket以及requestAnimationFrame更新数据的差异

通过setInterval每隔一段时间调用一次请求更新数据,清除用clearInterval,弊端:可能出现内存泄露,导致浏览器崩溃的问题

建立websocket长连接进行通信,让后端负责更新数据,弊端:数据量较大时socket链接会自动断开

websocket在vue中的使用

<template>
  <div></div>
</template>

<script>
export default {
  data() {
    return {
      audio: null,
      socket: null,
      timeout: 30 * 1000,
      heartBeatTimer: null,
      reconnectTimer: null
    }
  },
  methods: {
    initWebSocket() {
      this.createWebSocket();
      this.reconnectTimer = window.setInterval(() => {
        if (this.socket.readyState === 3) {
          this.stopHeartBeat();
          this.createWebSocket();
        }
      }, 60000)
    },
    stopHeartBeat() {
      this.heartBeatTimer = setInterval(() => {
        this.socket.send('hello server!');
      }, this.timeout);
    },
    startHeartBeat() {
      clearInterval(this.heartBeatTimer);
      this.heartBeatTimer = null;
    },
    createWebSocket() {
      const host = window.location.host;
      this.socket = new WebSocket(`wss://${host}/websocket`);
      this.socket.onopen = this.onopen;
      this.socket.onmessage = this.onmessage;
      this.socket.onclose = this.onclose;
      this.socket.onerror = this.onerror;
    },
    //用于指定连接成功后的回调函数。
    onopen(event) {
      this.startHeartBeat();
    },
    //用于指定当从服务器接受到信息时的回调函数。
    onmessage(event) {
      let self = this;
      let message = JSON.parse(event.data);
      if (message.type == 'sessionId') {
        //save sessionId
      } else {
        self.audio.play();
        //做业务处理
      }
    },
    //用于指定连接关闭后的回调函数。
    onclose(event) {
      console.log('成功关闭链接', event);
    },
    //用于指定连接失败后的回调函数。
    onerror(event) {
      console.log('链接出错', event);
    }
  },
  created() {
    this.audio = new Audio(require('./assets/audio/audio.mp3'));
  },
  mounted() {
    this.initWebSocket();
  },
  beforeDestroy() {
    this.socket.close();
    clearInterval(this.heartBeatTimer);
    clearInterval(this.reconnectTimer);
    this.heartBeatTimer = null;
    this.reconnectTimer = null;
  }
}
</script>

requestAnimationFrame 比起 setTimeout、setInterval的优势主要有两点:

1、requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。

2、在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量(直白点就是离开使用了requestAnimationFrame的页面,requestAnimationFrame就会暂停,和小程序中的onShow,onHide一样)。

清除requestAnimationFrame用cancelAnimationFrame

下面时具体的使用案例代码

    //当前执行时间
    var nowTime = 0;
    //记录每次动画执行结束的时间
    var lastTime = Date.now();
    //我们自己定义的动画时间差值
    var diffTime = 1000;//1秒
    //我们自己定义的动画结束时间
    var endTime = 5000;//5秒
    //记录动画执行结束的时间
    var lastEndTime = Date.now();
    //记录动画执行时间
    var newAnimation=null

    function render() {
        const date = new Date();
        let time = date.toLocaleString('zh'); 
        console.log('执行的内容,打印当前时间:',time )
    }

    //requestAnimationFrame效果
    (function animloop() {
        //记录当前时间
        nowTime = Date.now()
        // 当前时间-上次执行时间如果大于diffTime,那么执行动画,并更新上次执行时间
        if(nowTime-lastTime > diffTime){
            lastTime = nowTime
            render();
        }
        if(nowTime-lastEndTime > endTime){
            lastEndTime = nowTime
            console.log('执行的内容,结束了')
            return
        }
        newAnimation=requestAnimationFrame(animloop);

    })()

    //执行过程中结束动画
    //cancelAnimationFrame(newAnimation);

cookies、session、sessionStorage和localStorage

cookies:存储于浏览器端的数据。可以设置 cookies 的Max-Age或者Expires到期时间,如果不设置时间,则在浏览器关闭窗口的时候会消失。

session:存储于服务器端的数据。session 存储特定用户会话所需的属性和配置信息。

cookies 和 session 的区别在于:

http协议是无状态协议,缺少记忆能力,如果处理请求需要之前的信息,就必须重传,因此cookie用来传递处理请求需要的信息,用来储存信息。
cookies 数据存放在客户的浏览器上,session 数据存放在服务器上。
cookies 可能会被黑客利用作数据欺骗。重要信息储存在session。
session 如果在生效期内量过大,会占用服务器性能。
单个 cookies 保存的数据不能超过 4 K,很多浏览器限制一个站点保存最多 20 个 cookies。

sessionStorage:生命周期存在于标签页或窗口,用于本地存储一个会话(session)中的数据,这些数据会随着窗口或者标签页的关闭而被清空。

localStorage:生命周期是永久的,除非用户主动清除浏览器上存储的 localStorage 信息,否则它将会永久存在。

sessionStorage 和 localStorage 操作方法:setItem、getItem 、removeItem和clear

共同点

localStorage和sessionStorage和cookie共同点

同域(同源策略)限制:同源策略:请求与响应的 协议、域名、端口都相同时同源,否则为 跨源/跨域;
存储的内容都会转为字符串格式
都有存储大小限制
localStorage和sessionStorage共同点

API相同
存储大小限制一样基本类似
无个数限制


区别

localStorage和sessionStorage的存储数据是5MB,而cookies是4k

localStorage

没有有效期,除非删除,否则一直存在
同域下页面共享,同一个域名的所有标签页都可以访问
支持 storage 事件


sessionStorage

浏览器关闭,自动销毁
页面(单独一个标签页下,同一个域名)私有,即使在别的标签页打开同一个地址也不存在
不支持 storage 事件


cookies

浏览器也会在每次请求的时候主动组织所有域下的cookie到请求头 cookie 中,发送给服务器端
浏览器会主动存储接收到的 set-cookie 头信息的值
可以设置 http-only 属性为 true 来禁止客户端代码(js)修改该值
可以设置有效期 (如果不设置,默认浏览器关闭自动销毁)(不同浏览器有所不同)
同域下个数有限制,最好不要超过50个(不同浏览器有所不同)
单个cookie内容大小有限制(比会话、本地存储小),最好不要超过4000字节(不同浏览器有所不同)

cookie不受端口的限制,localStorage和sessionStorage必须全部一致

http://xxx.xx.x.xxx:8080 http://xxx.xx.x.xxx:9201

如果上面两个地址使用了cookie,那么cookies会被覆盖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值