前端面试题合集(二)

1、如何做适配h5页面的适配?

视口设置(viewport)

  • 在HTML页面的 <head> 标签内添加<meta>标签,如<meta name="viewport" content="width=device - width, initial - scale=1.0">。这行代码的意思是让页面宽度等于设备宽度,初始缩放比例为1.0,这样能确保页面在移动设备上正确显示,避免出现页面被压缩或拉伸的情况。

媒体查询(Media Queries)

  • 可以根据不同的设备屏幕宽度、高度等条件来应用不同的CSS样式。例如:
/* 当屏幕宽度小于600px时 */
@media (max - width:600px) {
    body {
        font - size:14px;
    }
}

这种方式可以灵活地调整页面布局和样式,比如在小屏幕设备上改变字体大小、隐藏某些元素或者改变元素的排列方式。

百分比布局和弹性布局(Flexbox)

  • 百分比布局:将元素的宽度、高度等属性设置为百分比形式,使元素能够根据父元素的大小按比例缩放。比如,一个
    元素设置宽度为50%,它就会始终占据父元素宽度的一半,这样在不同屏幕尺寸下能自适应。
  • 弹性布局(Flexbox):通过设置 display:flex 或 display:inline-flex 来启用弹性布局。例如:
.container {
    display:flex;
    justify - content:space - between;
    align - items:center;
}

这会让容器内的元素能够灵活地排列,根据空间自动调整间距和对齐方式,在各种屏幕尺寸下保持良好的布局效果。

相对单位

  • 使用相对单位如rem、em等。rem是相对于根元素(html元素)字体大小的单位,em是相对于父元素字体大小的单位。比如设置 font - size:1.2rem ,当根元素字体大小改变时,这个元素的字体大小也会按比例变化,方便在不同设备上实现统一的缩放效果。

2、图片懒加载怎么实现

纯JavaScript实现
(1)首先,将所有需要懒加载的图片的 src 属性设置为一个占位符(比如一个很小的默认图片或者一个特定的标识),同时将真实的图片地址存储在 data-src 属性中。
(2) 然后,通过 document.addEventListener('scroll', function() {}) 监听页面滚动事件。在滚动事件的回调函数中,遍历所有需要懒加载的图片,判断图片是否进入可视区域。
(3)可以使用getBoundingClientRect函数来获取图片相对于浏览器视口的位置。如果图片的顶部位置小于浏览器视口的高度,就说明图片进入可视区域,此时将data-src 中的真实图片地址赋值给 src 属性,实现图片加载。例如:

<img src="placeholder.jpg" data-src="real-image.jpg" alt="懒加载图片">  
const lazyImages = document.querySelectorAll("img[data-src]");
const loadImage = function (image) {
  image.src = image.dataset.src;
};
const handleScroll = function () {
  lazyImages.forEach((image) => {
    if (image.getBoundingClientRect().top < window.innerHeight) {
      loadImage(image); // 加载后移除事件监听,避免重复加载
      image.removeEventListener("load", handleScroll);
    }
  });
};
window.addEventListener("scroll", handleScroll);

使用IntersectionObserver API
(1) IntersectionObserver是一个现代浏览器提供的API,用于异步观察目标元素与祖先元素或顶级文档视窗(viewport)交叉状态。
(2)对于懒加载图片,首先还是将真实图片地址存储在 data-src 属性中,将 src 设置为占位符。
(3)创建一个IntersectionObserver实例,传入一个回调函数,在回调函数中,当观察的图片进入可视区域(交叉比例大于0)时,将 data - src 赋值给 src 来加载图片。例如:

<img src="placeholder.jpg" data-src="real-image.jpg" alt="懒加载图片">  
const lazyImages = document.querySelectorAll("img[data-src]");
const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.intersectionRatio > 0) {
      const image = entry.target;
      image.src = image.dataset.src;
      observer.unobserve(image);
    }
  });
});
lazyImages.forEach((image) => {
  observer.observe(image);
});

3、Math.js、BigDecimal.js的理解

Math.js是一个功能强大的JavaScript和Node.js数学库。
它可以进行复杂的数学计算,包括但不限于数值计算、代数运算、微积分等。例如它支持矩阵运算,像创建矩阵、矩阵乘法等操作,这在处理线性代数相关问题时非常有用。同时,它还能处理不同数据类型的数值,包括整数、小数等。

BigDecimal.js主要用于高精度的十进制算术运算。
在JavaScript中,浮点数的精度有时会出现问题,而BigDecimal.js可以避免这种情况。比如在进行货币计算时,需要精确到小数点后几位,BigDecimal.js就能保证计算的准确性,防止出现因为浮点数精度问题导致的金额计算错误。

4、js的浅拷贝和深拷贝的区别

浅拷贝(Shallow Copy):浅拷贝只复制对象的第一层属性。
深拷贝(Deep Copy):深拷贝会递归地复制对象及其所有子对象,从而创建一个与原对象完全独立的副本。
简单点来说,比如数据A复制了数据B,当修改数据B时,数据A变了,说明这是浅拷贝,数据A没变,那就是深拷贝。

实现浅拷贝的方法
(1)for···in只循环第一层
(2)Object.assign方法 Object.assign(target)
(3)直接用=赋值

实现深拷贝的方法
(1)采用递归去拷贝所有层级属性
(2)通过JSON对象来实现深拷贝

function deepClone2(obj) { 
      var _obj = JSON.stringify(obj), 
          objClone = JSON.parse(_obj); 
      return objClone; 
}

缺点:无法实现对对象中方法的深拷贝,会显示为undefined
(3)通过jQuery的extend方法实现深拷贝

var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝

(4)lodash函数库实现深拷贝
可参考官方文档:https://lodash.com/

// 导入lodash,lodash用下划线接
import _ from 'lodash'

let result = _.cloneDeep(test)

(5)Reflect法
(6)手动实现深拷贝
(7)如果对象的value是基本类型的话,也可以用Object.assign来实现深拷贝,但是要把它赋值给一个空对象 Object.assign({}, target)
(8)用slice、concat实现对数组的深拷贝

// 当数组里面的值是基本数据类型,比如String,Number,Boolean时,属于深拷贝 
var arr1 = ["1","2","3"];
var arr2 = arr1.slice(0);    var arr2 = arr1.concat();
// 当数组里面的值是引用数据类型,比如Object,Array时,属于浅拷贝
var arr1 = [{a:1},{b:2},{c:3}];
var arr2 = arr1.concat();

(9)使用拓展运算符(…)实现深拷贝

// 当value是基本数据类型,比如String,Number,Boolean时,是可以使用拓展运算符进行深拷贝的 
// 当value是引用类型的值,比如Object,Array,引用类型进行深拷贝也只是拷贝了引用地址,所以属于浅拷贝 
var obj = { a: "1", b: "2", c: "3" } 
var updateObj = { ...obj, b: "5" } 
console.log(obj); // {a: "1", b: "2", c: "3"} 
console.log(updateObj); // {a: "1", b: "5", c: "3"} 

(10)直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。

5、简述如何对网站的文件和资源进行优化?

参考回答:
(1)文件合并(目的是减少http请求):使用css sprites合并图片,一个网站经常使用小图标和小图片进行美化,但是很遗憾这些小图片占用了大量的HTTP请求,因此可以采用sprites的方式把所有的图片合并成一张图片 (精灵图),可以通过相关工具在线合并,也可以在ps中合并。
(2)使用CDN(内容分发网络)加速,降低通信距离。
(3)缓存的使用,添加Expire/Cache-Control头。
(4)启用Gzip压缩文件
(5)图片预加载,将css放在页面最上面。将script放在页面最下面。
(6)避免在css中使用表达式。
(7)将css, js都放在外部文件中。
(8)减少DNS查询。
(9)文件压缩:最小化css, js,减小文件体积。
(10)避免重定向。
(11)移除重复脚本。
(12)配置实体标签ETag。
(13)使用AJAX缓存,让网站内容分批加载,局部更新。

以上是本次分享全部内容。
非常感谢您阅读本篇博客文章。希望这篇文章能够为您提供有价值的信息,并帮助您解决问题或增长知识。如果您对文章内容有任何问题、建议或反馈。同时,也欢迎您继续关注我的博客,获取更多有趣、实用的内容。
期待与您在下一篇文章再次见面。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值