1,手写快排;
let ary = [3,5,1,2,7,9,6]
let temp = null;
for(let i = 0; i < ary.length; i++){
for(let j = 0; j < ary.length - 1; j++){
if(ary[j] > ary[j+1]){
temp = ary[j];
ary[j] = ary[j+1]
ary[j+1] = temp
}
}
}
console.log(ary)
2,手写深拷贝;
var obj1 = {
name:'aaaaa',
age:'10',
sex:'girl',
scorl:{
math:'100',
chinese:'99',
english:'98'
}
function deepClone(obj){
let cloneObj = Array.isArray(obj) ? [] : {}
if(obj && typeof obj == 'object'){
for( key in obj ){
if(obj.hasOwnProperty(key)){
if(obj[key] && typeof obj[key] == 'object'){
cloneObj[key] = deepClone(obj[key])
}else{
cloneObj[key] = obj[key]
}
}
}
}
return cloneObj
}
var obj2 = deepClone(obj1);
3,手写防抖和节流;
函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,
如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
// 防抖
function debounce(func, wait=0) {
if (typeof func !== 'function') {
throw new TypeError('need a function arguments')
}
let timeid = null;
let result;
return function() {
let context = this;
let args = arguments;
if (timeid) {
clearTimeout(timeid);
}
timeid = setTimeout(function() {
result = func.apply(context, args);
}, wait);
return result;
}
}
// 处理函数
function handle() {
console.log(Math.random());
}
// 滚动事件
window.addEventListener('scroll', debounce(handle, 1000));
函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数。
// 节流throttle代码(时间戳+定时器):
var throttle = function(func, delay) {
var timer = null;
var startTime = Date.now();
return function() {
var curTime = Date.now();
var remaining = delay - (curTime - startTime);
var context = this;
var args = arguments;
clearTimeout(timer);
if (remaining <= 0) {
func.apply(context, args);
startTime = Date.now();
} else {
timer = setTimeout(func, remaining);
}
}
}
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));
4,手写call / apply;
call:
var name = "张三"
var obj = {
name:"李四"
}
function fn(a,b,c){
console.log(a+b+c+this.name)
}
Function.prototype.myCall = function (obj){
obj = obj ? Object(obj) : window;
obj.fn = this
var argumentsAry = []
for(let i = 1,len = arguments.length; i < len; i++){
argumentsAry.push("arguments["+i+"]")
}
var result = eval("obj.fn("+argumentsAry+")")
delete obj.fn
return result
}
fn.myCall(obj,"我的","名字","是") // 我的名字是李四
apply:
var name = "张三"
var obj = {
name:"李四"
}
function fn(a,b,c){
console.log(a+b+c+this.name)
}
Function.prototype.myApply = function (obj,ary){
obj = obj ? Object(obj) : window;
var result;
obj.fn = this
if(!ary){
result = obj.fn
}else{
var argumentsAry = []
for(let i = 0,len = ary.length; i < len; i++){
argumentsAry.push("ary["+i+"]")
}
result = eval("obj.fn("+argumentsAry+")")
}
delete obj.fn
return result
}
fn.myApply(obj,["我的","名字","是"]) // 我的名字是李四
5,手写括号匹配
var moduleJson = {//括号匹配模板,你可以增加别的匹配,比如“{}”,“<>”,等,只需写入moduleJson里面去
")":"(",
"]":"["
}
var testStr = "([()]())()()";//测试字符串
var tempSaveArray = [];//用于存储字符串的数组
for(var i = 0;i<testStr.length;i++){//如果存在括号字符,就加入数组
for(var key in moduleJson){
if(testStr[i] == key||testStr[i]==moduleJson[key]){//如果字符串中存在json中的key 和value字符,就加入数组
tempSaveArray.push(testStr[i]);
}
}
}
if(tempSaveArray.length){
if((tempSaveArray.length%2)!=0){//如果括号的长度为奇数,肯定不匹配
console.log("括号不匹配");
}else{//如果字符串括号长度为偶数,就进行遍历数组,进行判断 12345 0 4
for(var j = 0;j<tempSaveArray.length;j++){
//(((())))
if(moduleJson[tempSaveArray[j]]){//如果是右括号,就和前一个进行匹配。
//拿到数组前一位的字符,是否与自己匹配
if(j>0){
console.log("前一个元素:"+j+tempSaveArray[j-1]+" 后一个元素"+moduleJson[tempSaveArray[j]]);
console.log(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]);
if(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]){//说明两个括号进行了匹配,让其出栈
tempSaveArray.splice(j-1,2);
j=0;//从新遍历数组
}
}
}
}
if(tempSaveArray.length){//没有移除完毕
console.log("括号不匹配");
} else{
console.log("括号匹配,恭喜你语法正确!");
}
}
}else{
console.log("你输入的字符串不存在括号");
}
6,手写数组去重
var testAry = [..."1235sahdhhhsygyw5555"]
var newAry = new Set(testAry)
console.log(newAry) //["1","2","3","5","s","a","h","d","y","g","w",]
7,将奇数排在前面,偶数排在后面。要求时间复杂度O(n)。
var testAry = [..."123456789"]
var newAry = []
testAry.forEach((item,i) => {
let n = Number(item)
if(n%2 == 0){
newAry.push(n)
}else{
newAry.unshift(n)
}
})
console.log(newAry) //["9","7","5","3","1","2","4","6"]
8,解析出URL中所有的部分
获取当前URL对象:window.location
通过URL对象获取详细的内容:
地址:window.location.href
协议:window.location.protocol
主机名:window.location.hostname
端口:window.location.port
主机:window.location.host
来源:window.location.origin
pathname:window.location.hostname
锚点:window.location.hash
查询参数:window.location.search
9,实现一个compare函数,比较两个对象是否相同
isObjectValueEqual(a, b) {
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i]
var propA = a[propName]
var propB = b[propName]
if ((typeof (propA) === 'object')) {
if (this.isObjectValueEqual(propA, propB)) {
return true
} else {
return false
}
} else if (propA !== propB) {
return false
} else { }
}
return true
},
10,找出出现次数最多的英语单词
let str = "asdfssaaasasasasaa";
function findMax(data){
data = data || ""
let obj = {};
if(data.length == 0){
return undefined
}else{
for(let i=0; i<data.length; i++){
let key = data[i]
if(obj[key]){
obj[key]++
}else{
obj[key] = 1
}
}
}
let max = 0;
let result = "";
for(let item in obj){
if(max < obj[item]){
max = obj[item]
result = item
}
}
console.log("字符串中出现次数最多的字符是"+result+",次数是"+max)
}
findMax(str);
伙伴们在面试过程中还遇到过其他的写代码的题目吗?
欢迎在评论区评论,分享,
我们随时更新博文内容哦!
拜了个拜!迪迦。。。