5种交换变量的方法
前提:
let a = 12, b =34;
最基础 - 临时变量法
let t = a;
a = b;
b = t;
优点:简单好用、有普适性 缺点:会增加内存消耗
ES6 - 解构赋值法
[a, b] = [b, a];
优点:只需一行 缺点:需要浏览器支持ES6
算术运算法
a = a + b;
b = a - b;
a = a - b;
优点:巧妙,只利用简单的加法运算 缺点:可能会导致数据溢出
历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS
(CJS
) 和 AMD
两种。前者用于服务器,后者用于浏览器。
而 ES6
在语言标准的层面上,实现了模块功能,成为浏览器和服务器通用的模块解决方案。(ESM
、ES6模块
)
这里一共总结了 方法:
Set
splice()
去掉重复值indexOf
去重includes()
hasOwnProperty()
filter
Map
对象Lodash
、Ramda
测试用数组:
var arr = [
1, 1, 21, 21,0,
'true', 'false',true, false, 'false', true,
undefined, null, null, NaN, 'NaN', NaN, 'NaN', false, undefined,
0, 'a', 'a', 'true',
{'name': 'jim', 'age': 20},
{'age': 20, 'name': 'jim'},
{'name': 'kart', 'age': 21},
{'name': 'kart', 'age': 21},
{}, {}
];
以下翻译自官网:promisesaplus.com/
Promise
代表异步操作的最终结果。与 Promise
交互的主要方式是通过其 then
方法,该方法注册回调以接收 Promise
的最终值或 Promise
失败的原因。
该规范详细说明了 then
方法的行为,提供了一个可互操作的基础,所有符合 Promises/A+
的 Promise
实现都可以依赖该基础来提供。因此,规范应该被认为是非常稳定的。尽管 Promises/A+
组织可能偶尔会通过微小的向后兼容更改来修改此规范以解决新发现的极端情况,但只有在仔细考虑、讨论和测试后,我们才会集成大的或向后不兼容的更改。
最后,核心 Promises/A+
规范不涉及如何创建、履行或拒绝 Promise
,而是选择专注于提供可互操作的 then
方法。
promise
是具有 then
方法的对象或函数,其行为符合本规范。thenable
是定义 then
方法的对象或函数。value
是任何合法的 JavaScript
值(包括 undefined
、thenable
或 promise
)。exception
是使用 throw
语句抛出的值。reason
是一个值,表示一个 promise
被拒绝的原因。HTTP 是超文本传输协议,也就是
HyperText Transfer Protocol
。
HTTP的名字「超文本协议传输」,它可以拆成三个部分:
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
这种说法是不正确的。因为也可以是「服务器< -- >服务器」,所以采用两点之间的描述会更准确。
1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。200 OK
」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。204 No Content
」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。206 Partial Content
」是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。3xx
类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。301 Moved Permanently
」表示永久重定向,说明 请求的资源已经不存在了,需改用新的 URL 再次访问 。302 Found
」表示临时重定向,说明 请求的资源还在,但暂时需要用另一个 URL 来访问 。
301 和 302 都会在响应头里使用字段 Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。304 Not Modified
」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。400 Bad Request
」表示客户端请求的报文有错误,但只是个笼统的错误。403 Forbidden
」表示服务器禁止访问资源,并不是客户端的请求出错。404 Not Found
」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。500 Internal Server Error
」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
「501 Not Implemented
」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway
」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable
」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。© 2002 Rus Shuler @ Pomeroy IT Solutions, all rights reserved
互联网是如何工作的?这是个好问题!互联网已经开始爆炸性的增长,我们每个人似乎都不可能逃脱www.com
的轰炸,你会经常在电视上、收音机里和杂志上看到。由于互联网已经成为我们生活中很大的一部分,要最有效地使用这一新工具,需要对其有很好的理解。
本文解释了使 Internet 工作的底层基础设施和技术。它并没有很深入,但涵盖了足够的每个领域,以便对所涉及的概念有一个基本的了解。
因为 Internet
是一个全球计算机网络,连接到 Internet
的每台计算机都必须有一个唯一的地址。 Internet
地址的格式为 nnn.nnn.nnn.nnn
,其中 nnn
必须是 0 到 255 之间的数字。此地址称为 IP 地址
。 (IP
代表 Internet
协议)
下图说明了两台连接到 Internet
的计算机;您的 IP
地址为 1.2.3.4
的计算机和另一台 IP
地址为 5.6.7.8
的计算机。互联网被表示为介于两者之间的抽象对象。
如果您通过 Internet
服务提供商 (ISP
) 连接到 Internet
,通常会在拨入会话期间为您分配一个 临时 IP 地址 。如果您从局域网 (LAN
) 连接到 Internet
,您的计算机可能有一个永久 IP 地址,或者它可能从 DHCP
(动态主机配置协议)服务器获得一个临时地址。在任何情况下,如果您连接到 Internet
,您的计算机就有一个唯一的 IP 地址。
如果您使用的是 Microsoft Windows
或 linux
并且连接到 Internet
,那么有一个方便的程序可以查看 Internet
上的计算机是否 ”在线“ 。它被称为 ping
,名字可能来自旧潜艇声纳系统发出的声音。启动命令提,键入 ping www.yahoo.com
。 ping
程序将向指定的计算机发送 “ping”(实际上是 ICMP(Internet 控制消息协议)回显请求消息)。被 ping
的计算机将回复。 ping
程序将计算过期时间,直到回复返回(如果确实如此)。此外,如果您输入域名(即 www.yahoo.com
)而不是 IP
地址,ping
将解析域名并显示计算机的 IP
地址。稍后将详细介绍域名和地址解析。
因此,您的计算机已连接到 Internet
并具有唯一的ip地址。它如何与连接到 Internet
的其他计算机“对话”?此处应提供一个示例:
假设您的 IP
地址是 1.2.3.4
,并且您想向计算机 5.6.7.8
发送消息。您要发送的消息是“Hello computer 5.6.7.8!”。显然,必须通过将计算机连接到 Internet
的线路来传输消息。假设您已从家里拨入您的 ISP
,消息必须通过电话线传输。因此,消息从字母文本翻译成电子信号,通过 Internet
传输,然后再翻译回字母文本。这是如何实现的?通过使用协议栈
。每台计算机都需要一台在 Internet
上进行通信,并且它通常内置于计算机的操作系统(即 Windows
、Unix
等)中。由于使用了两种主要的通信协议,因此 Internet
上使用的协议栈被称为 TCP/IP
协议栈。 TCP/IP
堆栈如下所示:
协议层 | 解释 |
---|---|
应用程序协议 | 特定于应用程序(如 WWW、电子邮件、FTP 等)的协议层协议 |
传输控制协议层 | TCP 使用端口号将数据包定向到计算机上的特定应用程序。 |
互联网协议层 | IP 使用 IP 地址将数据包定向到特定计算机。 |
硬件层 | 将二进制数据包数据转换为网络信号并返回。(例如以太网网卡、电话线调制解调器等) |
在windows安装linux子系统的时候,可以选择语言,如果选的不是中文或不是自己想要的,后期可以通过命令行的方式进行修改:
首先,安装对应语言包:
sudo apt-get install language-pack-zh-hans
然后设置语言;注意,这里一定要加上sudo
,否则该文件是只读状态无法更改:
sudo vi /etc/default/locale
保存退出便完成设置。
测试:
ncal -b
# 输出
七月 2022
一 二 三 四 五 六 日
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
函数式编程提倡使用递归,而不是循环。递归在某些场合下更优雅、更简洁。
但是使用递归有时候会遇到一些问题,比如说栈溢出。
这里总结了几种解决栈溢出问题的几种解决方案,比如最有效的尾递归(tail call),以及不使用尾递归的其它两种方式。
在所有的类linux操作系统中,
cal
或者ncal
命令会在命令行打印出一个有格式的日历(阳历)。
默认情况下,即不给定任何参数的情况下,cal和ncal将会输入本月的日历,并突出显示当前的日期(在Ubuntu22.04LTS下,ncal突出显示当前的日期):
> cal
:
六月 2022
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
> ncal
:
六月 2022
一 6 13 20 27
二 7 14 21 28
三 1 8 15 22 29
四 2 9 16 23 30
五 3 10 17 24
六 4 11 18 25
日 5 12 19 26
可以看到ncal
命令和cal
命令都会在控制台输出有格式的日历,但是ncal
命令显示的日历是竖着的,有别于传统的日历格式。