阿里达摩院训练题2

  |  

前言

每天一练


61



不定项选择题1

题目描述:关于Promise的说法,下述正确的是

题目答案: a、b、d

题目解析:

a.Promise.resolve 返回一个Promise并把状态置为fullfilled

正确:Promise.resolve方法接受单个参数并返回一个处于完成态的Promise。

Promise的状态有:

  • pending:挂起态
  • fullfilled:完成态
  • rejected:拒绝态
  • resolve:决议态
  • unsettled:未决态

b.Promise.reject返回一个Promise并把状态置为rejected

正确:Promise.reject方法接受单个参数并返回一个处于拒绝态的Promise

c.Promise.all如果当前数组中所有的Promise的状态置为fullfilled或rejected,自己的状态即置为fullfilled

错误:Promise.all接收单个可迭代对象作为参数,并返回一个Promise。这个可迭代对象的元素都是Promise。当所有Promise置为fullfilled时,返回的Promise置为fullfilled。但是任意一个Promise被拒绝,那么返回的Promise会立刻置为rejected,且不需要等待其它Promise决议,

d.Promise.race中如果当前数组中率先改变状态的Promise为fullfilled,则自己的状态即置为fullfilled

正确:Promise.race接收单个可迭代对象作为参数,并返回一个Promise。返回的Promise的状态,取决于可迭代对象中率先完成的Promise的状态。

e.Promise.all中数组项必须为Promise

错误:根据MDN的描述,如果参数中包含非Promise值,这些值将被忽略,但仍然会被放在返回数组中(其实就是使用Promise.resolve将其转变为Promise)

1
2
3
4
5
6
7
8
let p1 = Promise.resolve(3),
p2 = 1234,
p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1234, 'foo']
})

f.Promise.race中数组项必须为Promise

错误:虽然MDN没有明确的说明对于Promise.race中数组项是否都是为Promise。但是我试了一下,可以有其它值

1f

不定项选择题2

题目描述: 关于浏览器网络知识,一下说法正确的是

题目答案:b、f

题目解析:

a.JSONP/CORS支持使用GET/POST/PUT/DElETE请求方式实现跨域

错误:CORS的确支持所有类型的HTTP请求,但是JSONP只支持GET请求

除了这两种跨域方式,常见的跨域方式还有:

  • 图像PING跨域
  • 服务器代理
  • document.domain跨域
  • window.name跨域
  • location.hash跨域
  • postMessage跨域

不过用的最多的还是CORS和JSONP

b.现代浏览器支持使用Fetch/XMLHttpRequest两种方式发送Ajax请求

正确:这道题我不太确定。我主要是这么想的,所以就判断它为正确

Fetch和XMLHttpRequest非常类似,都可以用来发送网络请求,只不过Fetch使用了Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fetch('./api/some.json')
.then(function(res) {
if (res.status !== 200) {
console.log('Looks like there was a problem. Status Code: ' + res.status);
return;
}

// 处理响应中的文本信息
res.json().then(function(data) {
console.log(data);
});
})
.catch(function(err) {
console.log('Fetch Error : %S', err);
})

让我存在疑惑的点主要是Fetch和Ajax的两个区别:

  • fetch返回的Promise不会拒绝http的错误状态
  • 在默认情况下fetch不会接收和发送cookies

c.HTTP 500 代表用户传入的参数错误,禁止访问

错误:500是服务器内部错误,400才是参数错误。HTTP协议常见响应码

1xx——信息类:表示收到http请求,正在进行下一步处理,通常是一种瞬间的响应状态

  • 100(continue):表示目前为止一切正常, 客户端应该继续请求, 如果已完成请求则忽略
  • 101 (Switching Protocol):状态码表示服务器应客户端升级协议的请求(Upgrade请求头)正在进行协议切换。

2xx——成功类:表示用户请求被正确接收、理解和处理

  • 200(OK):请求成功。一般用于GET与POST请求
  • 201(Created):已创建。成功请求并创建了新的资源
  • 202(Accepted):表示服务器端已经收到请求消息,但是尚未进行处理。

3xx——重定向类:表示没有请求成功,必须采取进一步的动作

  • 301(Moved Permanently):资源被永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI
  • 302(Found):资源临时移动。资源只是临时被移动,客户端应继续使用原有URI

4xx——客户端错误:表示客户端提交的请求包含语法错误或不能正确执行

  • 400(Bad Requests):客户端请求的地址不存在或者包含不支持的参数
  • 401(Unauthorized):未授权,或认证失败。对于需要登录的网页,服务器可能返回此响应
  • 403(Forbidden):没权限。服务器收到请求,但拒绝提供服务
  • 404(Not Found):请求的资源不存在。遇到404首先检查请求url是否正确

5xx——服务端错误:表示服务器不能正确执行一个正确的请求

  • 500(Internal Server Error):服务器内部错误,无法完成请求
  • 503(Service Unavailable):由于超载或系统维护(一般是访问人数过多),服务器无法处理客户端的请求 ,通常这只是暂时状态

d.HTTP协议在OSI七层模型中属于会话层,用于实现两台主机间的通信

错误:HTTP在OSI七层模型和TCP/IP协议中均处于应用层。应用层除了HTTP以外常见的协议还有Telnet、FTP、SMTP。而会话层的主要作用是使应用建立和维持会话,并能使会话同步

e.WebSocket有同源限制,因此会有跨域的问题

错误:webSocket本来就是设计成支持跨域访问的协议,所以并不存在同源限制。浏览器的SOP也无法限制他。HTTP是受同源策略限制的。

f.使用Gzip方式,可以有效压缩响应的体积

正确:这道题不会,只能百度一下。Gzip是前端常见的优化方式。但并不是所有浏览器都支持Gzip。需要在请求头中的Accept-Encoding来标识浏览器支持哪些压缩方式。然后服务端可以在响应头中加入content-encoding:gzip,来表明服务端使用了Gzip压缩方式。

编程题

题目描述:

1
2
3
4
5
6
实现一个金额展示格式化的函数 formatAmount,金额展示规则为整数部分每三位用逗号分割,小数部分展示两位。输入数据不是数字时返回 "-"
举例:
formatAmount(2688) => "2,688.00"
formatAmount("2e6") => "2,000,000.00"
formatAmount(-2.33333333) => "-2.33"
formatAmount("Alibaba") => "-"

题目解析:

1
2
3
4
5
6
let formatAmount = function(val) {
let num = Number(val);
if(num !== num) return '-'
let str = num.toFixed(2).split('.');
return Number(str[0]).toLocaleString() + '.' + str[1];
}

用Number()强制类型转换,再利用NaN的非自反性,判断输入的值能否转换为数字,不能输出’-‘,能得话,用toFixed()去限制小数点后的位数,由于toFixed()返回的是字符串,再调用toLocaleString()无法达到格式化的效果。所以我们先分隔字符串,然后将整数部分转换为数值类型,通过toLocaleString()做格式化,再重新拼接并返回

编程题

文章目录
  1. 1. 不定项选择题1
  2. 2. 不定项选择题2
  3. 3. 编程题