JavaScript中的时间戳
关于 JavaScript 的时间圈:
1. 时间圈的使用场景,比如开播中有倒计时功能,如一分钟倒计时、六十分钟倒计时等,在前面的方法无法直接计算时就需要借助时间圈,时间圈是毫秒数,这是一种特殊计算时间的方式,是从 1970 年 1 月 1 日凌晨 0 点 0 分 0 秒到当前时间的毫秒数。
2. 计算方式是将来的时间圈减去现在的时间圈等于剩余的毫秒数,再将剩余毫秒数转换为剩余时间的年、月、分、秒,即倒计时时间。
3. 如何获得时间圈有三种方式:
1. 第一种方式是 getTime,这个方法必须先实例化才能拿到。
2. 第二种是加“+new Date”。
3. 第三种是 getNow,这种方法只能得到当前的时间圈,而前两种可以返回指定的时间圈,第三种不能返回指定的时间圈。
4. 来尝试一下,第一种选 getTime,首先进行实例化,拿到当前的时间,在 JavaScript 中输入“this.time”,打开浏览器,会显示一串数字,这是从 1970 年 1 月 1 日零点零分零秒到现在的毫秒数。
5. 第二种方式是 JavaScriptdata,JavaScript 的方式不需要实例化,只需在实例化前面加一个“+”,CTRLCTRL,直接保存后打开浏览器看,和第一种一样,这就是当前的时间。
6. 第三种是 JavaScripttime3,先实例化,完成后“ctrl+log”直接输入“time3”后保存,打开浏览器看这三个的时间圈,当前的时间圈都是一样的,每次刷新都不一样。
day11:前端面试题(js)
这里来解析一道题目 [] == ![] // -> true ,下面是这个表达式为何为 true 的步骤
===用于判断两者类型和值是否相同。 在开发中,对于后端返回的 code,可以通过 ==去判断
前者存储在栈上,后者存储在堆上
众所周知 JS 是门非阻塞单线程语言,因为在最初 JS 就是为了和浏览器交互而诞生的。如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点),当然可以引入读写锁解决这个问题。
- JS 在执行的过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到 Task(有多种 task) 队列中。一旦执行栈为空,Event Loop 就会从 Task 队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说 JS 中的异步还是同步行为
- 以上代码虽然 setTimeout 延时为 0,其实还是异步。这是因为 HTML5 标准规定这个函数第二个参数不得小于 4 毫秒,不足会自动增加。所以 setTimeout还是会在 script end 之后打印。
- 不同的任务源会被分配到不同的 Task队列中,任务源可以分为 微任务(microtask) 和 宏任务(macrotask)。在 ES6 规范中,microtask 称为 jobs,macrotask 称为 task。
- 以上代码虽然 setTimeout 写在 Promise 之前,但是因为 Promise 属于微任务而 setTimeout属于宏任务,所以会有以上的打印。
- 微任务包括 process.nextTick ,promise ,Object.observe,MutationObserver
- 宏任务包括 script , setTimeout ,setInterval,setImmediate ,I/O ,UI renderin
很多人有个误区,认为微任务快于宏任务,其实是错误的。因为宏任务中包括了 script ,浏览器会先执行一个宏任务,接下来有异步代码的话就先执行微任务
所以正确的一次 Event loop 顺序是这样的
- 执行同步代码,这属于宏任务
- 执行栈为空,查询是否有微任务需要执行
- 执行所有微任务
- 必要的话渲染 UI
- 然后开始下一轮 Event loop,执行宏任务中的异步代码
通过上述的 Event loop 顺序可知,如果宏任务中的异步代码有大量的计算并且需要操作 DOM 的话,为了更快的 界面响应,我们可以把操作 DOM 放入微任务中
JS 是单线程的,所以 setTimeout 的误差其实是无法被完全解决的,原因有很多,可能是回调中的,有可能是浏览器中的各种事件导致。这也是为什么页面开久了,定时器会不准的原因,当然我们可以通过一定的办法去减少这个误差。
如果想将一个多维数组彻底的降维,可以这样实现
这个问题通常可以通过 JSON.parse(JSON.stringify(object)) 来解决
但是该方法也是有局限性的:
- 会忽略 undefined
- 会忽略 symbol
- 不能序列化函数
- 不能解决循环引用的对象
在遇到函数、 undefined 或者 symbol 的时候,该对象也不能正常的序列化
但是在通常情况下,复杂数据都是可以序列化的,所以这个函数可以解决大部分问题,并且该函数是内置函数中处理深拷贝性能最快的。当然如果你的数据中含有以上三种情况下,可以使用 lodash 的深拷贝函数
typeof 对于基本类型,除了 null都可以显示正确的类型
typeof 对于对象,除了函数都会显示 object
对于 null 来说,虽然它是基本类型,但是会显示 object,这是一个存在很久了的 Bug
instanceof 可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。