跳到主要内容

· 阅读需 21 分钟
熊滔

我们在使用互联网交换数据时,数据需要经过各种各样的网络设备才能到达通信双方,如果数据在传输的过程中经过某些恶意用户的设备,就有可能导致信息被窃取。所以如果想安全的使用互联网,了解必须的安全技术是不可或缺的。

安全问题

我们首先了解一下在通信的过程中会遇到什么样的安全问题。

窃听

A 向 B 发送的信息可能会在传输的过程中被 X 偷看,这就是窃听。

· 阅读需 8 分钟
熊滔

在高中的时候我有这么一个思考,灵感源于一道物理题目

一个小球从高度为 hh 的地方下落,落在地面上接着弹起,但是由于与地面碰撞造成能量损失,使得每次弹起的高度只有之前高度的 1/41/4

这道题目看起来是没有什么问题,当时我的想法是每次球的高度都会变为原来的 1/41/4,所以球是会一直这样弹下去的,就像是庄子说的

一尺之棰,日取其半,万世不竭。

所以在这里我得到一个结论,小球会一直运动下去,所以小球的运动时间为无穷大。

· 阅读需 25 分钟
熊滔

Promise 的使用

回调地狱

首先我们了解一下 Promise 出现的背景,假设有下面的程序

let name = getUserNameById(id);
let score = getScoreByName(name);
let scholarship = getScholarshipByScore(score);
console.log(scholarship);

这个程序首先根据 id 去获取名字,接着根据拿到的名字取获得分数,最后根据分数去获取奖学金,最后打印出奖学金。但是这个程序真的能达到预期的效果吗? 答案是不能,因为 JavaScript 是异步的,对于一般的耗时操作并不会立即执行,而是将函数保存在一个队列中,直到代码执行完毕,才会拿出队列中的函数执行。所以上面的函数都不会被立即执行,所以当然没有返回值,所以上面的 name, score, scholarship 都是 undefined

为了解决这种情况,我们一般会使用回调函数的形式,等我们根据 id 拿到 name 之后,将 name 传入回调函数,这样就可以保证"同步"的效果,所以我们将上面的代码修改如下

getUserNameById(id, function (name) {
getScoreByName(name, function (score) {
getScholarshipByScore(score, function (scholarship) {
console.log(scholarship);
});
});
});

· 阅读需 36 分钟
熊滔

介绍

TypeScript是什么

TypeScript 是什么? 引用官方的定义

TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any browser. Any host. Any OS. Open source.

简单翻译就是

TypeScriptJavaScript 的超集,并且可以被编译成 JavaScript。它可以运行在任何浏览器,任何主机,任何操作系统上。并且它是开源的。

看到这里你可能对 TypeScript 还是没有什么感觉,其实在我看来 TypeScript 是对 JavaScript 做了各种限制,这里说的限制并不是贬义的意思,因为 JavaScript 实在是太灵活了,很多的问题只有在运行的时候才会暴露出来,比如对于函数,即使定义时要求传两个参数,但是在使用时却可以传入任意的参数,所以你无法限制使用该函数的用户传入正确的参数,如果碰到不仔细看 API 文档的用户,鬼知道它使用的时候会传入什么,出了问题说不定会甩锅你兼容性做的不好。而 TypeScript 则限制了这一点,在使用时传入的参数必须与定义传入的相同,并且有提示每个参数的作用,用户使用该函数时必须按规定的来。

· 阅读需 28 分钟
熊滔

在字符串的处理中,我们经常要进行字符串的匹配,校验等等操作。比如校验字符串的格式是否符合邮箱,电话号码的格式,校验密码是否符合要求,密码中是否包含数字和字母等等;又或者匹配得到某种规则的字符串。这一些操作如果使用常规的方法进行字符串操作,会花费较大的代价,包括时间和精力。

正则表达式是用来表达字符串的规则,它可以检验字符串是否符合某个特定的规则,或者匹配字符串中符合规则的字符,在一般的使用中,正则表达式一般用来匹配字符串中的字符或者字符串中特定的位置。

正则对象

JavaScript 正则对象的创建有两种常见的方法,一是使用 RegExp 构造函数进行创建,二是使用字面量的方法进行创建,如下

let regex1 = new RegExp('hello', 'g');
let regex2 = /hello/g;

其中 hello 表示字符串的规则,用来匹配字符串中的"hello"g 表示进行全局匹配(global),像这样的标志还有两个,m 表示进行多行匹配(multiline),i 表示忽略大小写(ignoreCase),这三个标志互不冲突,可以同时使用,如

let regex = /hello/igm;