Promise 核心
- Promise 概括来说是对异步的执行结果的描述对象。(这句话的理解很重要)
- Promise 规范中规定了,promise 的状态只有3种:
- pending
- fulfilled
- rejected
Promise 的状态一旦改变则不会再改变。
Promise 规范中还规定了 Promise 中必须有 then 方法,这个方法也是实现异步的链式操作的基本。
写出下列程序运行结果并做出解释:
1 | setTimeout(function(){ |
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。
String类型和 Symbol 类型的属性都会被拷贝。
在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。
Object.assign 不会在那些source对象值为 null
或 undefined
的时候抛出错误。
针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝
;如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝
的。
js实现几种常见排序算法。
冒泡排序:
1 | const arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]; |
JS 7 种基本数据类型(原始类型),即 (Undefined、Null、Boolean、Number 、String) + (Symbol、BigInt)和 3种引用数据类型:对象(Object)、数组(Array)、函数(Function)。
基本类型值:指的是保存在栈内存中的简单数据段。
引用类型值:指的是那些保存在堆内存中的对象。变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值。
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值; BigInt即是第七种基本类型,V8引擎v6.7 默认启用对 BigInt 的支持。
HeroChildComponent 有两个输入型属性,它们通常带@Input 装饰器。
component-interaction/src/app/hero-child.component.ts
import { Component, Input } from '@angular/core';
import { Hero } from './hero';
@Component({
selector: 'app-hero-child',
template: `
<h3>{{hero.name}} says:</h3>
<p>I, {{hero.name}}, am at your service, {{masterName}}.</p>
`
})
export class HeroChildComponent {
@Input() hero: Hero;
@Input('master') masterName: string;
}
第二个 @Input 为子组件的属性名 masterName 指定一个别名 master(译者注:不推荐为起别名,请参见风格指南).
父组件 HeroParentComponent 把子组件的 HeroChildComponent 放到 *ngFor 循环器中,把自己的 master 字符串属性绑定到子组件的 master 别名上,并把每个循环的 hero 实例绑定到子组件的 hero 属性。
component-interaction/src/app/hero-parent.component.ts
import { Component } from '@angular/core';
import { HEROES } from './hero';
@Component({
selector: 'app-hero-parent',
template: `
<h2>{{master}} controls {{heroes.length}} heroes</h2>
<app-hero-child *ngFor="let hero of heroes"
[hero]="hero"
[master]="master">
</app-hero-child>
`
})
export class HeroParentComponent {
heroes = HEROES;
master = 'Master';
}
为什么用pre-commit 加 tslint(jshint,eslint原理都类似),因为在项目中我们会经常忘记主动的去做代码检查,虽然结合webpack各种构建工具下,存在*slint报错,项目会跑不起来。但在某些情况下,可能会因为着急,或者其他原因,没有去观察项目运行的情况就仓促提交。团队开发的情景下,可能会成为别人的麻烦。而pre-commit tslint解决的需求既是:拒绝向仓库提交错误代码。
在配置tslint pre commit之前,首先需要了解git hooks,正如它的名字所示,这是一个关于git 操作的钩子,比如我们想要在做远程仓库推送时,那就会触发pre-push这个钩子,然后在这个钩子中写下自己想做的事。git hooks的配置就在项目.git文件夹下面的hooks文件夹中。
在写相关的钩子函数时,需要注意的是,将钩子后面的sample后缀去掉,代码才会生效。
比如,本文中用到的pre-commit这个钩子。
更多关于git hooks的介绍,请参考:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
下面介绍如何配置: