本周面试题一览:javascript
更多优质文章可戳: github.com/YvetteLau/B…css
在实现 Promise.race
方法以前,咱们首先要知道 Promise.race
的功能和特色,由于在清楚了 Promise.race
功能和特色的状况下,咱们才能进一步去写实现。html
Promise.race(iterable)
返回一个 promise,一旦 iterable
中的一个 promise
状态是 fulfilled
/ rejected
,那么 Promise.race
返回的 promise
状态是 fulfilled
/ rejected
.前端
let p = Promise.race([p1, p2, p3]);
复制代码
只要p一、p二、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise
实例的返回值,就传递给 p 的回调函数。java
Promise.race 的返回值是一个 promise 实例node
Promise.race
返回的 promise
永远是 pending
态promise
,Promise.race
会返回一个处理中(pending)的 promise
iterable
包含一个或多个非 promise
值或已经解决的promise,则 Promise.race
将解析为 iterable
中找到的第一个值。Promise.race = function (promises) {
//promises传入的是可迭代对象(省略参数合法性判断)
promises = Array.from(promises);//将可迭代对象转换为数组
return new Promise((resolve, reject) => {
if (promises.length === 0) {
//空的可迭代对象;
//用于在pending态
} else {
for (let i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then((data) => {
resolve(data);
}).catch((reason) => {
reject(reason);
})
}
}
});
}
复制代码
尽管浏览器有同源策略,可是 <script>
标签的 src
属性不会被同源策略所约束,能够获取任意服务器上的脚本并执行。jsonp
经过插入 script
标签的方式来实现跨域,参数只能经过 url
传入,仅能支持 get
请求。git
function jsonp({url, params, callback}) {
return new Promise((resolve, reject) => {
//建立script标签
let script = document.createElement('script');
//将回调函数挂在 window 上
window[callback] = function(data) {
resolve(data);
//代码执行后,删除插入的script标签
document.body.removeChild(script);
}
//回调函数加在请求地址上
params = {...params, callback} //wb=b&callback=show
let arrs = [];
for(let key in params) {
arrs.push(`${key}=${params[key]}`);
}
script.src = `${url}?${arrs.join('&')}`;
document.body.appendChild(script);
});
}
复制代码
使用:github
function show(data) {
console.log(data);
}
jsonp({
url: 'http://localhost:3000/show',
params: {
//code
},
callback: 'show'
}).then(data => {
console.log(data);
});
复制代码
服务端代码(node):面试
//express启动一个后台服务
let express = require('express');
let app = express();
app.get('/show', (req, res) => {
let {callback} = req.query; //获取传来的callback函数名,callback是key
res.send(`${callback}('Hello!')`);
});
app.listen(3000);
复制代码
Set
Set
相似于数组,可是成员的值都是惟一的,没有重复的值。express
function uniq(arry) {
return [...new Set(arry)];
}
复制代码
indexOf
function uniq(arry) {
var result = [];
for (var i = 0; i < arry.length; i++) {
if (result.indexOf(arry[i]) === -1) {
//如 result 中没有 arry[i],则添加到数组中
result.push(arry[i])
}
}
return result;
}
复制代码
includes
function uniq(arry) {
var result = [];
for (var i = 0; i < arry.length; i++) {
if (!result.includes(arry[i])) {
//如 result 中没有 arry[i],则添加到数组中
result.push(arry[i])
}
}
return result;
}
复制代码
reduce
function uniq(arry) {
return arry.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}
复制代码
Map
function uniq(arry) {
let map = new Map();
let result = new Array();
for (let i = 0; i < arry.length; i++) {
if (map.has(arry[i])) {
map.set(arry[i], true);
} else {
map.set(arry[i], false);
result.push(arry[i]);
}
}
return result;
}
复制代码
当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种状况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象。这个现象叫浮动溢出,为了防止这个现象的出现而进行的CSS处理,就叫CSS清除浮动。
<style> .inner { width: 100px; height: 100px; float: left; } </style>
<div class='outer'>
<div class='inner'></div>
<div class='inner'></div>
<div class='inner'></div>
</div>
复制代码
clear
属性在 <div class='outer'>
内建立一个空元素,对其设置 clear: both;
的样式。
clear
属性 + 伪元素.outer:after{
content: '';
display: block;
clear: both;
visibility: hidden;
height: 0;
}
复制代码
IE8以上和非IE浏览器才支持:after,若是想要支持IE六、7,须要给 outer
元素,设置样式 zoom: 1
;
根据 BFC 的规则,计算 BFC 的高度时,浮动元素也参与计算。所以清除浮动,只须要触发一个BFC便可。
可使用如下方法来触发BFC
如:
.outer {
overflow: hidden;
}
复制代码
注意使用 display: inline-block
会产生间隙。
在开始以前,咱们首先须要搞清楚函数柯里化的概念。
函数柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数并且返回结果的新函数的技术。
const currying = (fn, ...args) =>
args.length < fn.length
//参数长度不足时,从新柯里化该函数,等待接受新参数
? (...arguments) => currying(fn, ...args, ...arguments)
//参数长度知足时,执行函数
: fn(...args);
复制代码
function sumFn(a, b, c) {
return a + b + c;
}
var sum = currying(sumFn);
console.log(sum(2)(3)(5));//10
console.log(sum(2, 3, 5));//10
console.log(sum(2)(3, 5));//10
console.log(sum(2, 3)(5));//10
复制代码
函数柯里化的主要做用:
[1] CSS-清除浮动
[2] 详解JS函数柯里化
[3] JavaScript数组去重
谢谢各位小伙伴愿意花费宝贵的时间阅读本文,若是本文给了您一点帮助或者是启发,请不要吝啬你的赞和Star,您的确定是我前进的最大动力。 github.com/YvetteLau/B…