Results 13 comments of Diamondjcx

``` function runAsync1(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('异步任务1执行完成'); resolve('随便什么数据1'); }, 1000); }); return p; } function runAsync2(){ var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.log('异步任务2执行完成');...

1.JS的基本数据类型:Undefined、Null、Boolean、Number、String   Undefined类型只有一个值,即特殊的undefined,声明变量但是没有初始化,这个变量的值就是undefined   Null类型只有一个值null,表示一个空对象指针,正式使用typeof操作符检测null会返回object   Boolean有两个字面值:true和false   Number:用来表示整数和浮点数,还有一种特殊的值即NaN,这个数值用来表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)   String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号(")表示。 2.三大引用类型   Object类型   Array类型   Function类型 3.区别 存储空间:基本类型存在栈中,引用类型存在栈上 值传递:基本类型传递的是值,引用类型传递的是地址(引用) 作为函数的参数:基本类型传递的是值,引用类型传递得是地址 4.null是对象 指的是空指针。tryeof(null)object

语义化:   就是使用合理、正确的标签来展示内容,指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化),便于开发者阅读,维护和写出更优雅的代码的同时,让浏览器的爬虫和辅助技术更 好的解析。 语义化的优点:   易于用户阅读;样式丢失的时候能让页面呈现清晰的结构   有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重 方便其他设备解析,如盲人阅读器根据语义渲染网页 有利于开发和维护,   语义化更具可读性,   代码更好维护, 与CSS3关系更和谐 HTML5之前,DIV+CSS实际上就能很好渲染出一个web页面。HTML5已不仅仅满足于怎样将一个网页表现出来了,二是更加专注于网页的结构,更加务实地关注网页的内容。 为了区分不同的结构,我们往往给div设置不同的id,ID名称标记了这个DIV负责的区块,而HTML5则为这些不同的区块创造不同的标签。

参考以上各位大佬的总结 ### 单线程:所有任务都需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务不得不一直等着。 ### 任务队列:分为同步任务和异步任务。 同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务‘ 异步任务:不进入主线程,而进入“任务队列”的任务,只有“任务队列通知主线程,某个异步任 务可以执行了,该任务才会进入主线程执行。 (1)所有同步任务都在主线程上执行,形成一个执行栈。 (2)主线程之外,还存在一个“任务队列”。只要异步任务有了运行结果,就在“任务队列”之中放置一个事件 (3)一旦“执行栈”中的所有同步任务执行完毕,系统就会读取“任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。 (4)主线程不断重复上面的第三步。 ### 定时器 除了放置异步任务的时间,“任务队列”还可以放置定时事件,即指定某些代码在多少时间之后执行。 为什么使用setTimeout实现倒计时,而不是setInterval? setInterval指定的是“开始执行”之间的间隔,并不考虑每次任务指定本身所消耗的时间,因此实际上,两次执行之间的间隔会小于指定的时间。比如,setInterval指定妹100ms执行一次,每次执行需要5ms,那么第一次执行结束后95ms,第二次执行就会开始。如果某次执行耗时特别长,比如需要105ms,那么它结束后,下一次执行就会立即开始。 为了确保两次执行之间的固定的间隔,可以不用setIntetrval,二是每次执行结束后,使用setTimeout指定下一次执行的具体时间。 ### setTimeout倒计时为什么出现误差? setTimeout作为异步任务,在实现倒计时功能的时候,除了执行我们功能的实现代码,还会有主线程对任务队列的读取及执行等过程,这些过程也需要耗费一些时间,所以因为event loop的机制出现些许误差。

var 和 let都是用来定义变量的,而const 是用来定义常量的 - 1.变量提升: var声明的变量会被提升,let和const不会。let 和 const 存在暂时性死区, 凡是在声明之前使用这些变量就会报错; ``` consle.log(a) // 可以直接打印 var a = 10; =》 会直接提升为 var a ; a=10; consolelog(a); console.log(b) // 直接是报错,没有提升变量,没有定义,直接报错 let...

1.指定async属性 2.指定defer属性 defer要等到整个页面在内存中正常渲染结束,在window.onload之前执行 async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再进行渲染 如果有多个defer脚本,会按照顺序加载 如果多个async脚本,并不能保证加载顺序 3.利用XHR异步加载js内容并执行 4.动态创建script标签 5.iframe方式

== 会将左右两边的值转化成相同的原始类型,然后再去比较他们是否相等。 1. 如果a是一个对象Object,在执行a==的时候首先会执行valueOf方法,如果没有valueOf方法,会执行toString方法。 const a = { value: 0 } a.valueOf = function () { return this.value += 1 } console.log( a == 1 && a == 2 &&...

在前端开发的过程中,我们经常会需要绑定一些持续触发的事件,如 resize、scroll、mousemove 等等,但有些时候我们并不希望在事件持续触发的过程中那么频繁地去执行函数。 防抖函数分为非立即执行版和立即执行版。 非立即执行版 触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。(url) ``` function(url) debounce(func, wait) { let timeout; return function () { let context = this; let args = arguments; if...

综合 各位大佬 1. 利用 flat Array方法 ``` function flattenDeep(arr, deepLength) { return arr.flat(deepLength); } console.log(flattenDeep([1, [2, [3, [4]], 5]], 3)); ``` 2. 利用 reduce 和 concat 递归取出并连接 ``` function flattenDeep(arr){...

非严格模式下:函数中this调用:this-----》window 方法中this调用:this-----》当前对象(嗲用方法的对象) 构造函数中this调用:this------》该构造函数的实例对象 借用方法调用:改变this的指向 分析this的问题,需要明白两点:   1.分析this是属于哪个函数   2.分析该函数是以什么模式被调用的 只看函数是怎么被调用的,不管函数是怎么来的 严格模式中,函数调用模式内部的this为:undefined