156期
1. POST请求的 Content-Type 常见的有哪几种?
2. JavaScript 中如何取消请求?
3. 实现一个批量请求函数,要求能够限制并发量?
上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布
也可以小程序刷题,已收录500+面试题及答案
155期问题及答案
1. 什么是策略模式?
策略模式(Strategy Pattern)是一种行为设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换。该模式允许算法的变化独立于使用算法的客户。策略模式的关键是有一个策略接口,它定义了算法或行为的骨架,具体的实现则分布在实现了该接口的策略类中。客户端代码只需针对策略接口编程,从而能够轻松切换不同的策略实现。
以下是使用TypeScript实现的策略模式示例:
假设我们有一个文本校对系统,需要对上传的文本进行不同语言的拼写检查,我们可以为每种语言实现一个具体的拼写检查策略。
首先定义策略接口:
// 策略接口定义了算法族的公共操作
interface SpellCheckerStrategy {
checkSpelling(text: string): void;
}
然后实现具体策略类:
// 英语拼写检查策略
class EnglishSpellCheckerStrategy implements SpellCheckerStrategy {
checkSpelling(text: string): void {
console.log('Checking English spelling for:', text);
// 实现具体的英语拼写检查逻辑
}
}
// 法语拼写检查策略
class FrenchSpellCheckerStrategy implements SpellCheckerStrategy {
checkSpelling(text: string): void {
console.log('Vérification de l’orthographe française pour:', text);
// 实现具体的法语拼写检查逻辑
}
}
// 德语拼写检查策略
class GermanSpellCheckerStrategy implements SpellCheckerStrategy {
checkSpelling(text: string): void {
console.log('Überprüfung der deutschen Rechtschreibung für:', text);
// 实现具体的德语拼写检查逻辑
}
}
创建上下文环境类:
// Context 类负责使用策略接口,客户端与这个类进行交互以使用算法
class TextEditor {
private strategy: SpellCheckerStrategy;
constructor(strategy: SpellCheckerStrategy) {
this.strategy = strategy;
}
setSpellCheckerStrategy(strategy: SpellCheckerStrategy) {
this.strategy = strategy;
}
checkSpelling(text: string) {
this.strategy.checkSpelling(text);
}
}
最后,在客户端代码中使用:
// 客户端代码
function main() {
const editor = new TextEditor(new EnglishSpellCheckerStrategy());
editor.checkSpelling('Hello World'); // 输出: Checking English spelling for: Hello World
editor.setSpellCheckerStrategy(new FrenchSpellCheckerStrategy());
editor.checkSpelling('Bonjour le monde'); // 输出: Vérification de l’orthographe française pour: Bonjour le monde
editor.setSpellCheckerStrategy(new GermanSpellCheckerStrategy());
editor.checkSpelling('Hallo Welt'); // 输出: Überprüfung der deutschen Rechtschreibung für: Hallo Welt
}
main();
在上述例子中,TextEditor
类充当上下文环境的角色,它持有一个 SpellCheckerStrategy
接口的引用,可以通过 setSpellCheckerStrategy
方法动态地改变拼写检查的策略。这样,当拼写检查的需求发生变化时,只需要引入一个新的策略实现类,并通过 TextEditor
的 setSpellCheckerStrategy
方法设置即可,无需改动现有的代码结构,符合开闭原则。 继续前面的TypeScript策略模式示例,现在我们假设需要对策略模式进一步进行扩展,比如添加一个新的拼写检查策略用于西班牙语。扩展策略模式非常简单,不需要修改上下文环境类TextEditor
或策略接口SpellCheckerStrategy
,只需要添加一个新的策略实现类即可。
首先,实现西班牙语拼写检查策略类:
// 西班牙语拼写检查策略
class SpanishSpellCheckerStrategy implements SpellCheckerStrategy {
checkSpelling(text: string): void {
console.log('Comprobación de ortografía en español para:', text);
// 实现具体的西班牙语拼写检查逻辑
}
}
然后,在客户端代码中使用新的策略:
// 客户端代码
function main() {
const editor = new TextEditor(new EnglishSpellCheckerStrategy());
// ...
// 切换到西班牙语拼写检查策略
editor.setSpellCheckerStrategy(new SpanishSpellCheckerStrategy());
editor.checkSpelling('Hola Mundo'); // 输出: Comprobación de ortografía en español para: Hola Mundo
}
main();
正如你所看到的,我们有很大的灵活性去添加新的策略。客户端代码可以自由切换使用不同的拼写检查策略,而不需要知道每一种策略的内部实现,也不会影响到现有的策略实现。这就是策略模式的魅力:它支持开闭原则并鼓励将变化的部分封装成策略,进而使得系统易于扩展和维护。
总结一下,策略模式利用组合(而非继承)的方式,将算法的定义从算法的使用中抽离出来,定义一系列算法,并让它们可以互换。这样,可以独立地改变客户端和算法,它们之间的耦合度低,增加新的算法或改变现有算法对其他部分的影响小。策略模式非常适用于有多种类似行为或算法的系统,并且希望在运行时能动态地切换算法的场景。
2. TS中extend有什么作用,有哪些用途?
在TypeScript中,extends
关键词用于类的继承或类型扩展。
类继承:
使用 extends
关键词,可以创建一个类的子类(派生类),子类继承了基类(父类)的属性和方法。这允许在现有类的基础上构造新的类,从而实现代码复用和继承的层次结构。
class Animal {
move(distance: number = 0) {
console.log(`Animal moved ${distance}m.`);
}
}
class Dog extends Animal {
bark() {
console.log('Woof! Woof!');
}
}
const dog = new Dog();
dog.bark(); // 输出: Woof! Woof!
dog.move(10); // 输出: Animal moved 10m.
上面的例子中,Dog
类通过 extends
关键词继承了 Animal
类,因此它具有 Animal
的 move
方法和自己的 bark
方法。
接口继承:
同样地,extends
在类型系统中用于接口。一个接口可以通过 extends
关键词继承另一个接口,这允许你从一个或多个基础接口中复制成员,并且创建新的接口。
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
let square = {} as Square;
square.color = 'blue';
square.sideLength = 10;
在这里,Square
接口继承了 Shape
接口,因此它具有 color
属性,同时也添加了自己的属性 sideLength
。
类型扩展:
在 TypeScript 的高级类型中,extends
还可以用在条件类型中,用于在类型级别上实现类型的条件选择。
type Check<T> = T extends string ? boolean : number;
type Type1 = Check<string>; // 类型为 boolean
type Type2 = Check<number>; // 类型为 number
在上面的例子中,Check
类型检查泛型 T
是否继承自 string
类型,如果是,则将类型设置为 boolean
,否则为 number
。
使用 extends
关键词可以实现复杂的类型操作,这是 TypeScript 中类型系统的强大功能之一,它为开发人员提供了创建可复用和灵活的类型体系的能力。
3. sass有哪些内置函数?有什么作用?
scss(Sassy CSS)是Sass(Syntactically Awesome Stylesheets)的一种格式,它是一款强大的CSS预处理器,提供了丰富的语法和功能,包括变量、嵌套、混合(mixins)、导入以及内置函数等。scss内置函数允许开发者执行各种任务,例如颜色操作、字符串处理、数字计算等。以下是一些常用的scss内置函数及其作用:
颜色函数(Color Functions)
lighten($color, $amount)
: 使颜色变亮。darken($color, $amount)
: 使颜色变暗。saturate($color, $amount)
: 增加颜色的饱和度。desaturate($color, $amount)
: 减少颜色的饱和度。adjust-hue($color, $degrees)
: 调整颜色的色相。opacity($color)
: 获取颜色的透明度值。rgba($color, $alpha)
: 改变颜色的透明度。mix($color1, $color2, [$weight])
: 混合两种颜色。complement($color)
: 获取颜色的补色。
数字函数(Number Functions)
percentage($value)
: 把不带单位的数转换为百分比值。round($value)
: 把数值四舍五入到最接近的整数。ceil($value)
: 把数值向上取整到最接近的整数。floor($value)
: 把数值向下取整到最接近的整数。abs($value)
: 返回数值的绝对值。min($numbers...)
: 返回几个数值中的最小值。max($numbers...)
: 返回几个数值中的最大值。
字符串函数(String Functions)
unquote($string)
: 移除字符串中的引号。quote($string)
: 给字符串添加引号。str-length($string)
: 返回字符串的长度。str-insert($string, $insert, $index)
: 在指定的索引处向字符串插入另一个字符串。str-index($string, $substring)
: 返回子字符串在字符串中的起始索引。str-slice($string, $start-at, [$end-at])
: 从字符串中提取部分字符串。to-upper-case($string)
: 将字符串转换为大写。to-lower-case($string)
: 将字符串转换为小写。
列表函数(List Functions)
length($list)
: 返回列表的长度(项的数量)。nth($list, $n)
: 返回列表中指定位置的项。set-nth($list, $n, $value)
: 在列表中设置指定位置的项的值。join($list1, $list2, [$separator])
: 把两个列表合并在一起。append($list, $value, [$separator])
: 向列表尾部添加一个项。index($list, $value)
: 返回值在列表中的位置索引。list-separator($list)
: 返回列表的分隔符。
地图函数(Map Functions)
map-get($map, $key)
: 根据键从地图中返回值。map-merge($map1, $map2)
: 把两个地图合并成一个新地图。map-remove($map, $key)
: 从地图中删除键(以及对应的值)。map-keys($map)
: 返回地图中所有键组成的列表。map-values($map)
: 返回地图中所有值组成的列表。map-has-key($map, $key)
: 检查地图中是否存在指定的键。
功能和杂项函数(Miscellaneous Functions)
if($condition, $if-true, $if-false)
: 根据条件返回不同的值。unique-id()
: 生成一个唯一的CSS标识符。type-of($value)
: 返回值的数据类型。unit($number)
: 返回数值的单位。unitless($number)
: 检查数值是否不带单位。comparable($number1, $number2)
: 检查两个数值是否可以相互加减。
以上是scss中一部分常用的内置函数。需要注意的是,scss内置函数还包括其他函数和更多细节,这些函数为开发者处理CSS中的复杂问题提供了极大的便利。因此,查阅官方文档以获取完整列表和每个函数的详细信息是一个好主意。在实际项目中,经常会用到这些函数来创建动态、可维护和可扩展的样式。
我要提问
如果你遇到有趣的面试题,或者有想知道的前端面试题,可以在下面的小程序提问,收到问题后会在第一时间为你解答。
我要出题
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。