加载中...

面试复盘2

博客 2025.05.23 08:07 784

判断

Date.parse(new Date())的时间戳是s吗?

是,Date.parse()函数用于分析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间相差的毫秒数。其最后三位永远都是0,所以只能精确到秒。

204是成功请求吗?

HTTP204状态码代表的意思是 请求已成功处理,但无返回内容,即 HTTP 204 No Content 响应状态。

<img style="display:none" src="xxx"/> 会发起请求吗?

会,图片不会渲染,但会发起http请求。

简答

es6新特性(5个以上)

  1. 块级作用域、块级变量let、块级常量const
  2. 箭头函数
  3. 参数处理(默认参数/...)
  4. 模板字面量(模板字符串)
  5. 对象的扩展
  6. 解构赋值
  7. 模块(import/export)
  8. 类(class/extends)
  9. Promise

数据类型有哪些

基本类型:Number、Boolean、String、null、undefined、symbol(ES6 新增的),BigInt(ES2020)
引用类型:Object,对象子类型(Array,Function)

flex-flow是哪两个的组合

flex-direction 和 flex-wrap

隐藏元素的方法

  1. display:none
  2. visibility:hidden
  3. opacity:0
  4. 绝对定位移出可视区域
  5. z-index负值用其他元素盖住
  6. clip/clip-path裁剪
  7. transform:scale(0,0)

css3中transform的作用

Transform属性应用于元素的2D或3D转换。这个属性允许你将元素旋转,缩放,移动,倾斜等。

代码

水平垂直居中

<div class='container'>
    <div class='content'></div>
</div>
  1. margin: auto
  2. position:absolute
  3. flex
  4. text-align 和 line-height
  5. grid

深拷贝函数

完整版

export function deepClone(obj, hash = new WeakMap()) {
  // 处理null或者undefined
  if (obj === null) return obj;
  // 处理日期类型
  if (obj instanceof Date) return new Date(obj);
  // 处理正则类型
  if (obj instanceof RegExp) return new RegExp(obj);
  // 普通值或函数不需要深拷贝
  if (typeof obj !== "object") return obj;
  // 对象进行深拷贝
  if (hash.get(obj)) return hash.get(obj);
  let cloneObj = new obj.constructor();
  // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
  hash.set(obj, cloneObj);
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      // 实现一个递归拷贝
      cloneObj[key] = deepClone(obj[key], hash);
    }
  }
  return cloneObj;
}

摘抄于genrate-form

// 深拷贝对象
export function deepClone(obj) {
  const _toString = Object.prototype.toString;

  // null, undefined, non-object, function
  if (!obj || typeof obj !== "object") {
    return obj;
  }

  // DOM Node
  if (obj.nodeType && "cloneNode" in obj) {
    return obj.cloneNode(true);
  }

  // Date
  if (_toString.call(obj) === "[object Date]") {
    return new Date(obj.getTime());
  }

  // RegExp
  if (_toString.call(obj) === "[object RegExp]") {
    const flags = [];
    if (obj.global) {
      flags.push("g");
    }
    if (obj.multiline) {
      flags.push("m");
    }
    if (obj.ignoreCase) {
      flags.push("i");
    }

    return new RegExp(obj.source, flags.join(""));
  }

  const result = Array.isArray(obj)
    ? []
    : obj.constructor
    ? new obj.constructor()
    : {};

  for (const key in obj) {
    result[key] = deepClone(obj[key]);
  }

  return result;
}

斐波那契数列算法(递归)

这么简单醉了

int fibonacci0(int n){
    return (n < 2) ? n : fibonacci0(n - 1) + fibonacci0(n -2);
}

提取url参数

split分割

function getParam(url) {
    const urlArr = url.split('&')
    const params = {}
    for(let i = 0; i < urlArr.length; i++) {
        const arg = urlArr[i].split('=')
        params [arg[0]] = arg[1]
    }
    return params ;
}

正则

function getParam(url) { 
  const pattern = /(\w+)=(\w+)/ig;// 真写不出
  const params = {};
  url.replace(pattern, function(a, b, c){
    params [b] = c;
  });
  return params ;
}

Event Loop 、变量提升

下面代码输出啥

使用let

for (let index = 0; index < 3; index++) {
  setTimeout(function(){
    console.log('a:'+index)
  }, 0);
  console.log('b:'+index)
}

结果:

b:0
b:1
b:2
a:0
a:1
a:2

使用var

for (var index = 0; index < 3; index++) {
  setTimeout(function(){
    console.log('a:'+index)
  }, 0);
  console.log('b:'+index)
}

结果:

b:0
b:1
b:2
a:3
a:3
a:3

解析:var的变量提升机制,var命令实际只会执行一次,所以每次获取的都是同一个index;而let命令不存在变量提升,所以每次循环都会执行一次,声明一个新变量,但是值不同。