xdandsl
xdandsl
Promise.all([p1,p2,p3]) 以数组的形式传入每个promise实例,返回一个新的promise对象 每个实例的结果均为resolve时,将结果推入数组中,并resolve出来。 有一个实例的结果为reject时,就reject出来 Promise.all方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。 ```javascript Promise.all = promises => { return new Promise((resolve,reject) => { if(typeof promises[Symbol.iterator] != 'function' ){ reject('类型错误') } if(promises.length == 0){...
### 1,什么是BFC? 1)BFC(Block formatting context)直译为“块级格式化上下文”。BFC它是一个独立的渲染区域,只有Block-level box(块元素)参与,它规定了内部的Block-level box如何布局,并且与这个区域外部毫不相关。 2)可以理解成:创建了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素(里面怎么布局都不会影响外部),BFC仍属于文档中的普通流 3)不是所有的元素,模式都能产生BFC 。w3c规范:display属性为block, list-item ,table的元素,会产生BFC。 ### 2,BFC的原理是什么? 1)内部的Box会在垂直方向,一个接一个地放置。 2)Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠 3)每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。 4)BFC的区域不会与float box重叠。 5)BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。 6)计算BFC的高度时,浮动元素也参与计算 ### 3,如何创建BFC? 1)根元素 2)float属性不为none 3)position不为static和relative...
### 1,什么时候提出的? var是ES5提出的,let和const是ES6提出的。 ### 2,是否存在变量提升? var声明的变量存在变量提升(将变量提升到当前作用域的顶部)。即变量可以在声明之前调用,值为undefined。 let和const不存在变量提升。即它们所声明的变量一定要在声明后使用,否则报错。 ### 3,是否存在暂时性死区? let和const存在暂时性死区。即只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 **在代码块内,使用let命令声明变量之前,该变量都是不可用的。**这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。 总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。 ### 4,是否允许重复声明变量? var允许重复声明变量。let和const在同一作用域不允许重复声明变量。 ### 5,是否存在块级作用域? var不存在块级作用域。let和const存在块级作用域。 到底什么叫块级作用域呢, JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。 ### 6,是否能修改声明的变量?...
## 1,浅拷贝和深拷贝 何为拷贝:简易理解为重新复制一份数据。 浅拷贝和深拷贝主要针对引用类型数据而言。基本类型数据都是拷贝的栈内存中的值,改变拷贝后的值对原值不会产生影响。 > 浅拷贝: 产生新对象,如果被拷贝对象的属性中有引用类型的值,则拷贝的是数据在**堆内存中的地址值**,通过拷贝后得到的变量修改数据,**源对象中的数据发生改变**。 **即浅拷贝只复制对象的第一层属性。** ```javascript var obj2 = { name: '小明', age: 18, eat: [1,[2,3],[4,5,6]] } var obj3 = clone(obj2) obj3.name = '小明1' obj3.eat[1] = [1,1]...
```javascript //1,递归 function flattenDeep(arr){ let deepArr = [] arr.forEach(element => { if(Array.isArray(element)){ deepArr = deepArr.concat(flattenDeep(element)) }else{ deepArr.push(element) } }); return deepArr } console.log(flattenDeep([1,[2,3,[4,5]]])) //[ 1, 2, 3, 4, 5 ]...
(一)执行上下文 可以理解成,执行JavaScript代码的**一种环境**。(个人理解为任何事情的发生都是在一定环境下发生的,执行js代码也是一样,必然是在某种环境下进行。) 上下文分为以下3类: 1)全局执行上下文:指的是浏览器中的**全局对象window对象**,只有这一个。 在严格模式下,this值为undifined,非严格模式下,this值即为window对象。 执行代码时,最先执行全局执行上下文终的代码。 2)函数执行上下文:指当**调用函数时**创建的函数执行上下文环境。 多个函数调用会产生多个函数执行上下文。 3)eval执行上下文:执行eval函数会创建执行上下文。只不过严格模式执行eval函数,**不会作用于它的 外层作用域。** (二)执行上下文栈 可以理解成执行上下文栈是一个由**js引擎创建**的**存储函数调用的栈结构**,遵循 **先进后出**的原则。(用来管理执行上下文) 1)执行全局代码之前,将全局上下文压入栈底。 2)开始执行全局代码,如果有调用函数情况,依次创建函数执行上下文,并执行压栈操作。执行函数。如果函数执行完毕,则将函数上下文pop出栈,并等待垃圾回收,然后往下执行代码。 3)等全部代码执行完毕,栈中只剩下全局执行上下文。他会等到浏览器关闭时出栈。 (三)作用域 es5中:1)全局作用域 //最外层函数(全局函数)和在最外层函数外面定义的变量(声明一个变量)拥有全局作用域 // 所有末定义直接赋值的变量自动声明为拥有全局作用域 //所有window对象的属性拥有全局作用域 2)函数作用域。 //函数内部声明的变量只有在函数内部可以访问,全局作用域和上一层的函数作用域无法访问。 es6中:块级作用域。 //通过let和const来实现,声明的变量,其作用域都是块级。 (四)作用域链 用于查找某个变量。 函数中查找某个变量,如果当前作用域没有,就到其上一次作用域找,找到即返回,没有继续往上找,直到找到全局作用域,找到就返回,没有就报错。 var...
1,display为none 2,overflow为hidden 3,opacity为0(视觉上看不见元素,实际还存在) 4,将visibility设为hidden(占位隐藏) 5,transform: scale(0) (占位隐藏) 6,父元素height为0,再溢出隐藏overflow:hidden