问题
1、JS 为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢?
相关申引:
这段 setTimeout 代码什么意思? 我们一般说: 3 秒后,会执行 setTimeout 里的那个函数
1 | setTimeout(function () { |
javascript 里将任务分为同步任务和异步任务
按照这种分类方式:JS 的执行机制是:
首先判断 JS 是同步还是异步,同步就进入主线程,异步就进入 event table
异步任务在 event table 中注册函数,当满足触发条件后,被推入 event queue
同步任务进入主线程后一直执行,直到主线程空闲时,才会去 event queue 中查看是否有可执行的异步任务,如果有就推入主线程中
以上三步循环执行,这就是 event loop
macro-task(宏任务):包括整体代码 script,setTimeout,setInterval
micro-task(微任务):Promise,process.nextTick
按照这种分类方式:JS 的执行机制是
执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的【事件队列】里
当前宏任务执行完成后,会查看微任务的【事件队列】,并将里面全部的微任务依次执行完
是一个用来突出显示应用程序中潜在问题 的工具,StrictMode 不会渲染任何可见的 UI,它为其后代元素触发额外的检查和警告
注意:严格模式检查仅在开发模式下运行;它们不会影响生产构建。
StrictMode 目前有助于:
未来的 React 版本将添加更多额外功能。
Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案
1 | ReactDOM.createPortal(child, container); |
第一个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或 fragment。第二个参数(container)是一个 DOM 元素。
一个 portal 的典型用例是当父组件有 overflow: hidden 或 z-index 样式时,但你需要子组件能够在视觉上“跳出”其容器。例如,对话框、悬浮卡以及提示框
1 | import React from "react"; |
部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了一个新的概念 —— 错误边界
先上实际效果图
HTML
1 | <div class="parent"> |
CSS
1 | .parent { |
浏览器是我们 web 开发的伙伴,那么,你真的懂浏览器吗?接下来的文章就让我们一起来认识浏览器内核 webkit
一个浏览器应该包含的功能
HTML5 包含了一系列的标准,一共包含了 10 个大的类别
类别 | 具体规范 |
---|---|
离线(offline) | Application cache Local storage Indexed DB,在线/离线事件 |
连接(connectivity) | Web Sockets, Server-sent 事件 |
文件访问 (file access) | File API,File System,File Writer,ProgressEvents |
语义 | 各种新的元素,包括 Media,structural,国际化,Link relation,属性,form 类型,microdata 等方面 |
音频和视频 | HTML5 Video, Web Audio WebRTC,Video track 等 |
3D 和图形 | Canvas 2D, 3D CSS 变换, WebGL,SVG 等 |
展示 | CSS3 2D/3D 变换 ,转换(transition),WebFonts 等 |
性能 | Web Worker,HTTP caching 等 |
其他 | 触控和鼠标,Shadow DOM,CSS masking 等 |
在浏览器中,有一个最重要的模块,它主要的作用是将页面转变成可视化的图像结果
这就是浏览器内核,通常,它也被称为渲染引擎
目前主流的渲染引擎包括 Trident,Gecko,和 Webkit 他们分别是 IE,火狐和 Chrome 的内核(2013 年 Google 宣布了 Blink 内核,它其实是从 Webkit 复制出去的)
根据渲染引擎所提供的渲染网页的功能,它需要包含下图所示的众多功能模块。图上主要分为三层,最上层使用虚线框住的是渲染引擎所提供的功能
从图中大致可以看出,一个渲染引擎主要包括
HTML 解释器、CSS 解释器、布局和 JavaScript 引擎等
在了解了这些主要模块之后,下面介绍这些模块是如何一起工作完成网页的渲染过程,一般的,一个典型网页的渲染过程如下图所示
历史总是惊人的相似,当年发生在 KHTML 上的事情,也同样发生在 Webkit 项目上。2013 年 4 月,Google 宣布从 Webkit 复制出来并独立运作的 Blink 项目。
在实际的工作过程中我们往往会用到一些 git 命令,但是我们时长很难记住他们,这里就做下总结记录,便于以后快速查阅
git cherry-pick commitId
利用 git log 查看要合并的提交 commitId 然后
利用这个命令来合并
在历史的迭代中,我们有可能把一些文件加入 git 版本跟踪,但是发现不需要,那么我们应该怎么去除跟踪呢?
1 | git rm -r --cached . |
1 | git remote update origin --prune |
状态信息:deleted by us
出现场景:
状态信息:both added
在构建单页面应用时,我们需要用到路由,来决定不同的 URL 跳转到不同的页面,而 React 的思想是以组件化的形式来构建页面,所以 React Router 是根据不同的 URL 跳转到不同的组件。
对于绝大部分框架来说,路由都是静态的,react-router 在 pre-v4 之前也是静态的,但是之后改为动态路由
动态路由是应用程序渲染时发生的路由
React Router 中有三种类型的组件
React Router 中有三种类型的组件: router components, route matching components,和 navigation components。你在 Web 应用程序中使用的所有组件都应该从 react-router-dom 中导入。import { BrowserRouter, Route, Link } from “react-router-dom”;
路由
每个 React Router 应用程序的核心应该是一个 router 组件。对于 Web 项目,react-router-dom 提供了
有两个路由匹配组件: <Route> 和 <Switch>
路由匹配是通过比较 <Route> 的 path 属性和 当前地址的 pathname 来实现的。当一个 <Route> 匹配成功时,它将渲染其内容,当它不匹配时就会渲染 null。没有路径的 <Route> 将始终被匹配。
你可以在任何你希望根据地址渲染内容的地方添加 <Route> 。列出多个可能的 <Route> 并排列出来往往很有意义。<Switch>用于将 <Route>分组
<Switch> 不是分组 <Route>所必须的,但他通常很有用。 一个 <Switch>会遍历其所有的子 <Route>元素,并仅渲染与当前地址匹配的第一个元素。这有助于多个路由的路径匹配相同的路径名,当动画在路由之间过渡,且没有路由与当前地址匹配(所以你可以渲染一个 “404” 组件)
你有三个属性 来给 <Route>渲染组件:component ,render ,children 。你可以查看 <Route> 文档 来了解它们的更多信息,但在这我们将重点关注 component 和 render 因为这几乎是你总会用到的两个
React Router 提供了一个<Link> 组件来在你的应用程序中创建链接。无论你在何处渲染一个 <Link> ,都会在应用程序的 HTML 中渲染锚 (<a>)
<NavLink>是一种特殊类型的 <Link> 当它的 to 属性与当前地址匹配时,可以将其定义为“活跃的”
当你想强制导航时,你可以渲染一个 <Redirect>。当一个 <Redirect> 渲染时,它将使用它的 to 属性进行定向
1、 . [] {}
提取属性与调用函数
2、 delete new typeof + - !
一元运算符
3、* / %
乘法,除法,求余
4、+ -
加法,减法
5、>= <= > <
不等式的运算符
6、 === !==
等式运算符
7、 &&
逻辑与
8、||
逻辑或
9、 ? :
三元运算符
typeof 运算符产生的值有 “number”,”string”,”boolean”,”undefiend”,”function” “object” ,如果运算数是一个数组或 null ,那么返回的是”object”
javascript 中有着和 java 相同的一套位运算符,
1 | & // and 按位与 |
javascript 中函数就是对象,对象是 名/值对的集合。并拥有一个连接到原型对象的隐藏连接。对象字面量产生的对象连接到 Object.prototype ,函数对象连接到 Function.prototype (该原型对象的本身连接到 Object.prototype)
每个函数在创建时会附加两个隐藏属性,函数的上下文和实现函数的代码
1 | Function.prototype.**proto** == Object.prototype |
每个函数在创建时也随配有一个 prototype 属性,该属性是一个拥有 constructor 属性,且值即为该函数的对象。
这和隐藏连接到 Function.prototype 完全不同。
函数的与众不同在于他们可以被调用
调用一个函数会暂停当前函数的执行,传递控制权和函数到新的函数。除了声明时定义的形式参数外,每个函数还附加接受两个参数。this 和 arguments 两个参数
在对象中调用自身属性的方法,
1 | var object = { |
最普遍调用函数的模式:
1 | function myfun(a,b){ |
如果在函数前面加一个 new 来调用,那么背地里将会创建一个连接到该函数的 prototype 成员的新对象,同时 this 将会被绑定到那个新对象上。
1 | var Quo =function(string){ |
因为 javaScript 是一门函数式的面向对象编程语言,因此函数也可以有方法,
apply 方法让我们构建一个参数数组传递给调用函数,它也允许我们选择 this 值。
1 | var array =[3,4]; |
当函数被调用时,会得到一个免费配送的参数。那就是 arguments 数组,函数可以通过 arguments 来访问所有它在被调用的时候传递给它的所有参数。包括那些没有在函数定义时分配给函数的参数。这使得编写一个无需指定参数个数的函数成为可能。
因为语言设计的错误,arguments 并不是一个真正的数组,他只是一个类似(array-like)数组的对象。它有一个 length 属性,但它没有任何数组的方法。
当一个函数被调用时,它从第一个语句开始执行,并在遇到关闭函数体的 } 时结束。然后函数把控制权交给调用该函数的程序。
return 语句用来使函数提前返回。当 return 被执行时,函数立即返回,而不去执行下面的语句
一个函数总会返回一个值,如果没有指定,则返回 undefined
如果函数在调用时在前面加上了一个 new 前缀。且返回值不是一个对象。则返回 this(该新对象)
javascript 提供了一套异常处理机制,异常是干扰程序正常执行的不寻常的事故。你的程序应该抛出一个异常
1 | var add function(a,b){ |
throw 语句中断函数的执行,它应该抛出一个 exception 对象,该对象包含一个用来识别类型的 name 属性和用来描述错误信息的 message 属性。亦可以添加其他属性。
该对象将被传递到一个 try 语句的 catch 从句,如果 try 代码中抛出了异常。控制权就回跳转带 catch 从句。
1 | try{ |