美文网首页
刷题笔记-JS相关

刷题笔记-JS相关

作者: 鐵衣 | 来源:发表于2022-04-24 18:10 被阅读0次

前端JS相关面试题,排名没有先后只记录

1.Promise.then值穿透

// 例 问最后输出什么?
Promise.resolve('foo')
.then(Promise.resolve('bar'))
.then(function(result){
  console.log(result)
})
// 结果 foo

你可能会认为结果是"bar", 其实不然. 结果是"foo".
这个问题记住下面这点:
.then 或者 .catch 的参数期望是函数,传入非函数就会发生值穿透;Promise方法链通过 return 传值,没有 return 就只是相互独立的任务而已

// 依次传值
Promise.resolve('foo')
.then(() => Promise.resolve('bar'))
.then(function(result){
  console.log(result)
})
// bar

2. 请写出如下代码的打印结果

function Foo() {
    Foo.a = function() {
        console.log(1)
    }
    this.a = function() {
        console.log(2)
    }
}
// 以上只是 Foo 的构建方法,没有产生实例,此刻也没有执行

Foo.prototype.a = function() {
    console.log(3)
}
// 现在在 Foo 上挂载了原型方法 a ,方法输出值为 3

Foo.a = function() {
    console.log(4)
}
// 现在在 Foo 上挂载了直接方法 a ,输出值为 4

Foo.a();
// 立刻执行了 Foo 上的 a 方法,也就是刚刚定义的,所以
// # 输出 4

let obj = new Foo();
/* 这里调用了 Foo 的构建方法。Foo 的构建方法主要做了两件事:
1. 将全局的 Foo 上的直接方法 a 替换为一个输出 1 的方法。
2. 在新对象上挂载直接方法 a ,输出值为 2。
*/

obj.a();
// 因为有直接方法 a ,不需要去访问原型链,所以使用的是构建方法里所定义的 this.a,
// # 输出 2

Foo.a();
// 构建方法里已经替换了全局 Foo 上的 a 方法,所以
// # 输出 1

3. 用 JavaScript 写一个函数,输入 int 型,返回整数逆序后的字符串。如:输入整型 1234,返回字符串“4321”。要求必须使用递归函数调用,不能用全局变量,输入函数必须只有一个参数传入,必须返回字符串。

/**
 * @case 1234 => '4321'
 * @case 1000 => '1'
 * @case -1000 => '-1'
 * @case -1234 => '-4321'
 *
 * @param {number} number 传入的数值
 */
function solution(number) {
  if (number < 0) {
    return `-${solution(Math.abs(number))}`; // 如果是负数取绝对值
  }

  if (number < 10) {
    return `${number}`; // 1位数直接返回
  }

  return `${number % 10 || ''}${solution(~~(number / 10))}`; 
// number % 10 取余数也就是最后一位
// number / 10 减少位数 ~位运算符(按位取反) 
// ~~的作用是去掉小数部分,因为位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数。
}
let  n = solution(-123456); // -654321

4. 写出如下代码的打印结果

function changeObjProperty(o) {
  o.siteUrl = "http://www.baidu.com"
  o = new Object()  // 形参 o 的指向发生改变,指向堆内存中一个新的对象
  o.siteUrl = "http://www.google.com"
} 
let webSite = new Object();
changeObjProperty(webSite);
console.log(webSite.siteUrl); // "http://www.baidu.com"
// 对象作为参数,传递进去的是这个对象的引用地址,o.siteUrl 是给这个对象赋值, o = new Object; 把o指向另一个对象,o.siteUrl 是给这个对象赋值, 不影响webSite 这个变量指向的那个对象, 两个o指向的对象的引用地址不同;

5. React 和 Vue 的 diff 时间复杂度从 O(n^3) 优化到 O(n) ,那么 O(n^3) 和 O(n) 是如何计算出来的?

一两句说不清楚 参考 传统diff、react优化diff、vue优化diff
aooy/blog#2

6.写一个 mySetInterVal(fn, a, b),每次间隔 a,a+b,a+2b,...,a+nb 的时间,然后写一个 myClear,停止上面的 mySetInterVal

function  mySetInterVal(fn, a, b){
  this.a = a;
  this.b = b;
  this.n = 0;
  this.timeoutID= -1;
  this.start = () => {
     this.timeoutID = setTimeout(()=>{
       fn();
       this.n++;
       this.start();
       console.log(this.a + this.n*this.b);
    }, this.a + this.n*this.b)
  }
  this.clear = () => {
    clearTimeout(this.timeoutID);
    this.n = 0;
  }
}
let myFunc = new mySetInterVal(() => {console.log('123')},1000, 2000 );
myFunc.start();
myFunc.clear();

7.将数组扁平化并去除其中重复数据,最终得到一个升序且不重复的数组

已知如下数组:
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{ return a-b})

8. 数组扁平化 5 种方法

  1. toString & split
arr.toString().split(',')
  1. ES6 flat()
arr.flat(Infinity)
  1. ES6 扩展运算符 ...
 const flatten = (arr) => {
    while (arr.some(item => Array.isArray(item))) {
        arr = [].concat(...arr) // 给原数组重新赋值
    }
    return arr
}
  1. reduce() 方法
const flatten = (arr) => {
    return arr.reduce((pre, next) => {
        return pre.concat(Array.isArray(next) ? flatten(next) : next);
    }, [])
}
  1. 递归
const flatten = (arr) => {
    let res = []
    arr.forEach(item => {
        if (Array.isArray(item)) {
            res = res.concat(flatten(item))
        } else {
            res.push(item)
        }
    })
    return res
}

9. 数组去重

  1. 利用ES6中的 Set 方法去重
    注:Set为ES6新增的一个对象,允许存储任何类型(原始值或引用值)的唯一值
function unique(arr) {
  return Array.from(new Set(arr))
}
  1. 使用双重for循环,再利用数组的splice方法去重(ES5常用)
function unique(arr) {
    for(let i = 0, len = arr.length; i < len; i++) {
        for(let j = i+1, len = arr.length; j < len; j++) {
            if(arr[i] === arr[j]) {
                arr.splice(j, 1);
                j--; // 每删除一个数就减一
                len--; // j减少len也相应减少(减少循环,节省性能)
            }
        }
    }
    return arr;
}
  1. 利用数组的indexOf方法去重
    注:array.indexOf(item,statt) 返回数组中某个指定的元素的位置,没有则返回-1
function unique(arr){
    var arr1 = []; // 新建一个数组来存放arr中的值
    for(var i=0,len=arr.length;i<len;i++){
        if(arr1.indexOf(arr[i]) === -1){
            arr1.push(arr[i]);
        }
    }
    return arr1;
}
  1. 利用数组的sort方法去重(相邻元素对比法)
    注:array.sort( function ) 参数必须是函数,可选,默认升序
function unique(arr) {
    arr = arr.sort();
    let arr1 = [arr[0]];
    for(let i = 1, len = arr.length; i<len; i++){
        if(arr[i] !== arr[i-1]) {
            arr1.push(arr[i])
        }
    }
    return arr1
}
  1. 利用数组的includes去重
    注:arr.includes(指定元素(必填),指定索引值(可选,默认值为0) ),有值返回true,没有则返回false
function unique(arr){
    var arr1 = []; // 新建一个数组来存放arr中的值
    for(var i=0,len=arr.length;i<len;i++){
        if(!arr1.includes(arr[i])){ // 检索arr1中是否包含有arr中的值
            arr1.push(arr[i]);
        }
    }
    return arr1;
}
  1. 利用数组的filter方法去重
    注:filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素,array.filter(function(currentValue,index,arr), thisValue). currentValue:当前元素的值(必选参数)、index:当前元素的索引值(可选)、arr:当前元素属于的数组对象(可选)、thisValue:对象作为该执行回调时使用,传递给函数,用作 “this” 的值,默认undefined(可选)
function unique(arr) {
    return arr.filter((item, index) => {
        return arr.indexOf(item, 0) === index;
    })
}
  1. 利用函数递归去重
function unique(arr) {
    let arr1 = arr;
    let len = arr1.length;
    arr1.sort((a, b) => a - b);
    function loop(index) {
        if(index>=1){
            if(arr1[index] === arr1[index-1]) {
                arr1.splice(index, 1)
            }
            loop(index -1 )
        }
    }
    loop(len - 1);
    return arr1
}
  1. 利用ES6中的Map方法去重
    创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
function unique(arr) {
    let map = new Map();
    let arr1 = []
    for (let i = 0, len = arr.length; i < len; i++) {
        if (map.has(arr[i])) { // 判断是否存在该key值
            map.set(arr[i], true);
        } else {
            map.set(arr[i], false);
            arr1.push(arr[i]);
        }
    }
    return arr1;
}

相关文章

  • 刷题笔记-JS相关

    前端JS相关面试题,排名没有先后只记录 1.Promise.then值穿透 你可能会认为结果是"bar", 其实不...

  • 谷歌工程师为金三银四筹备1000道Leetcode刷题笔记

    对于刷题相关的文章,在之前我也推荐过不少,今天再给大家推荐一份算法刷题笔记,这份笔记与以往的刷题有所区别,作者把 ...

  • 刷题笔记-HTML相关

    1. 行内元素,块状元素,行内块状元素 三者可以通过display进行相互转换:display:block(块元素...

  • js 刷题

    [不断补充!!!] 1.找出数组中出现最多的元素和次数测试用例: 解决方法:利用对象来统计,区别for...of ...

  • 晨间日记

    计算机刷题 看书写笔记 高数刷题 英语刷题 奋斗到天亮,加油奥利给

  • 刷题笔记

    算法思想 一、二分查找 1. 算法思想 算法详解 算法细节 一定要看二分查找细节.md 实现时需要注意以下细节: ...

  • 刷题笔记

    最近在准备面试,发现自己真的菜的不行,就计划接下来的时间把 leetcode 上面刷的 中等题 和 每日一题做个简...

  • 刷题笔记

    题目描述 343 - Integer BreakGiven a positive integer n, break...

  • 卢小七的刷题笔记(js)

    题目来源: Codewars 题目: Is my friend cheating? 题目难度: 5kyu(不是很难...

  • 卢小七的刷题笔记(js)

    题目来源: Codewars 题目: Coordinates Validator 题目难度: 4kyu(理论上难,...

网友评论

      本文标题:刷题笔记-JS相关

      本文链接:https://www.haomeiwen.com/subject/uoutyrtx.html