• 作者:老汪软件技巧
  • 发表时间:2024-09-16 00:02
  • 浏览量:

秋招这段时间小编也是在不断的面试,最近也面一些大厂,但都不太如意,面过小米、字节、360大厂,现在终于来到了百度,来给大家分享一下百度前端开发实习一面的试题。

一、自我介绍

这个就不用说了,上来大部分都是让你简单介绍一下自己,相信在准备秋招的小伙伴们都已经得心应手了叭。

二、js的数据类型

这个问的js的一些简单基础问题。js的数据类型分为基本数据类型和引用数据类型。

基本数据类型

1、number 数字类型 2,1.2, -2,+4

2、string 字符串 '正确的值 ’ // " 中文" //黑色是字符串

3、boolean 布尔 true false

4、null 空对象指针

5、undefined 未定义

6、Symbol(es6新增,表示独一无二的值)

7、BigInt(es10新增)

引用数据类型

object对象

1、普通对象 {name: ‘xxxx’ }

2、数组 [’ ’ ,1,true,null,undefined]

3、Math 数学对象

4、Date的实例

5、/^$/ 正则

6、函数

7、原型

8、arguments

9、元素集合

function 函数1、普通函数2、构造函数(类)3、类

这里我就不再具体的说啦。大家有不懂的可以看我之前写的文章。

js四大常用类型数据判断(内含面试热点!!)今天,小编学习了js中的四种类型判断以及call源码的底层逻辑,深有所获,来 - 掘金 ()

三、如何解决跨域问题

这个是面试中经常会被问到的问题,我们先来了解一下为什么会发生跨域?

跨域是指在浏览器端,由于浏览器的同源策略(Same Origin Policy)限制,导致无法直接访问来自其他域的资源。

当前端页面尝试从与其不同源的服务器请求资源时,浏览器的同源策略(Same-Origin Policy)阻止了这种跨域请求。

同源机制/同源策略

同源机制(也叫同源策略)是浏览器中的一种重要安全机制,主要限制不同源的文档或脚本如何交互,以保护用户信息的安全。这里的“同源”指的是协议、域名和端口号三个要素必须完全相同。服务器间访问则不受同源策略限制,它们通常通过代码设置白名单或权限来控制访问。

同源策略的主要内容

dom节点:同源策略不允许不同源的两个页面通过JavaScript访问对方的dom节点

网络:限制了xhr,fetch等跨域请求

数据:同源策略不允许不同源的两个页面互相访问浏览器存储,Cookie、IndexedDB和LocalStorage等

什么时候发生的跨域

因为浏览器有同源策略,所以产生了跨域问题,没有浏览器根本不可能有跨域问题,所以跨域一定是发生在浏览器这一端的。当我们的页面发出Ajax请求时,这里是不会发生跨域的,服务器能够接收到页面发出的请求,但是当浏览器接收到服务器返回过来的数据之前,出于安全考虑会对响应做出校验,这个时候就有可能会发生跨域问题。

如何解决跨域问题一、JSONP

1、借助script标签的src属性不受同源策略的影响来发送请求

2、给后端携带一个参数 callback 并在前端定义callback函数体

3、后端返回callback的调用形式并将要影响的值作为callback的实参

4、当浏览器接受到响应后,就会触发全局的callback函数从而让callback

以参数的形式接受到后端的响应。

缺点:

二、cors

通过设置响应头中的某些字段,比如,access-control-allow-origin 设置允许的源 来通知浏览器此时同源策略不需要生效。

三、代理服务器

通过设置一个代理服务器,比如我的浏览器要朝他人的后端请求数据,我可以先设置一个代理服务器后端,让我的浏览器先朝我自己的后端也就是代理服务器发送请求,然后再让代理服务器朝他人的后端发送请求得到数据再返回来。

四、Nginx反向代理

相当于node代理

在服务器上装一个nginx,它其实就是一个后端代理,它就是一个软件,有配置文件,可以配置前端后端长啥样,配置好了之后,当后端返回一个响应,就由这个Nginx接受到。Nginx就相当于启动了一个web服务,Nginx在帮你把这个数据给前端。

五、WebSocket

socket协议天生不受同源协议的影响

WebSocket 是一种基于 TCP 的全双工通信协议,它允许客户端和服务器之间进行双向通信,与传统的 HTTP 请求-响应模式不同,WebSocket 建立一次连接后,可以保持长时间的通信会话。

虽然 WebSocket 协议本身并不受同源策略的限制,但在使用 WebSocket 进行跨域通信时,仍然需要注意一些安全性问题。一种常见的做法是通过服务端设置 CORS 头部,允许特定的源访问 WebSocket 服务。

六、postMessage

当页面一通过iframe嵌套了页面二,这两个页面上已无法进行通讯的,因为跨域了,但是使用postMessage可以实现跨域通信.

七、document.domain

两个页面通过iframe进行嵌套,且两个页面的二级域名一致

四、koa框架

官网介绍:Koa 是一个新的 web 框架,通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

Koa-- 基于 Node.js 平台的下一代 web 开发框架

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提 升错误处理的效率。

koa 不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的 函数库,使得编写 Web 应用变得得心应手。开发思路和 express 差不多,最大的特点就是 可以避免异步嵌套。

这里我就不详细介绍了,大家有需要了解的可以到官网看看:

官网API

五、你了解JSP吗

‌**JSP(Java Server Pages)**‌是一种动态网页技术,它允许在HTML页面中嵌入Java代码,这些代码在服务器端执行,根据客户端的请求动态生成HTML、XML或其他格式的Web页面。JSP技术由[Sun Microsystems](… Microsystems&rsv_pq=c33ce34b00576376&oq=编程中什么是JSP&rsv_t=66dd+2cM0xh/UVaElxKWko26OoPu8H87FVLGBY6vXcWUv1tNROIxnbnpA04&tn=baidu&ie=utf-8)公司主导创建,旨在简化服务器端的Web开发,尤其是对于动态内容的生成。JSP技术是[Java EE](… EE&rsv_pq=c33ce34b00576376&oq=编程中什么是JSP&rsv_t=66dd+2cM0xh/UVaElxKWko26OoPu8H87FVLGBY6vXcWUv1tNROIxnbnpA04&tn=baidu&ie=utf-8)的一部分,可以与Servlets、JavaBeans和JavaServerFaces等组件结合使用,实现复杂的Web应用程序。

JSP的主要特点包括:

JSP的工作原理大致如下:

当服务器上的JSP页面被请求时,JSP引擎会将JSP页面文件转译成Java文件。然后将Java文件编译成字节码文件。通过执行字节码文件响应客户端的请求,生成动态页面内容并发送给客户端(浏览器)。

JSP的引入,使得开发人员能够在Web页面中嵌入复杂的逻辑和业务处理,从而提供更丰富的用户体验和更好的交互性。同时,JSP技术也促进了表示层、控制层和模型层的分离,使得Web应用程序的开发更加模块化和可维护‌12。

六、inconfont的原理

“Iconfont" 是阿里巴巴推出的一款矢量图标字体库,广泛应用于网页和移动应用的设计中。Iconfont 提供了大量的图标资源,并支持自定义生成字体文件,方便设计师和开发者在项目中使用。

Iconfont 组件库的实现原理1. 字体图标(Font Icons)

Iconfont 主要通过字体图标来实现图标展示。字体图标本质上是特殊的字符,通过 Unicode 编码来表示。这些字符被定义在一个自定义字体文件中(如 .ttf, .woff, .eot 等格式),并通过 CSS 来显示。

2. CSS 使用

在 HTML 中,你可以像使用普通文本那样插入一个图标字符,然后通过 CSS 来指定所使用的字体文件以及具体的字符样式。例如:

class="icon">

CSS 中定义字体文件:

@font-face {
  font-family: 'iconfont'; /* 项目中自定义的字体名称 */
  src: url('iconfont.eot'); /* IE9 */
  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
       url('iconfont.woff') format('woff'),
       url('iconfont.ttf') format('truetype'),
       url('iconfont.svg#iconfont') format('svg'); /* 兼容 Chrome、Firefox 和 Opera */
}
.iconfont {
  font-family: 'iconfont' !important;
  font-size: 16px; /* 根据需求调整 */
}

3. 动态加载

对于一些动态生成的应用程序,可以利用 JavaScript 动态插入字体图标或者通过 AJAX 加载远程的字体文件。

4. 兼容性

为了确保浏览器兼容性,Iconfont 提供了多种字体格式以适应不同的浏览器环境。比如 .eot 文件主要用于 Internet Explorer,而 .woff 则用于最新版本的现代浏览器。

5. 可定制性

用户可以在 Iconfont 网站上选择自己需要的图标,并生成相应的字体文件和 CSS 代码。这样可以减少不必要的图标占用的空间,提高加载速度。

总结

Iconfont 通过使用字体图标的方式实现了图标组件库的功能,这种方式相比于传统的图片图标具有更好的可扩展性和灵活性,因为字体图标可以根据父元素的字体大小和颜色属性自动调整,而且在高分辨率屏幕上也能保持清晰。

七、three.js的载体

Three.js 是一个基于 WebGL 的 3D 图形库,用于在网页中渲染 3D 图形。WebGL 是一个用于渲染交互式 3D 和 2D 图形的标准 Web 技术,它直接在用户的浏览器中运行,无需安装任何插件。

Three.js 的载体

Three.js 的主要载体是浏览器中的 HTML5 元素,通过 WebGL 渲染 3D 图形。具体来说:

HTML5 元素:WebGL:JavaScript:

下面是一个简单的示例,展示如何使用 Three.js 在 HTML 页面中创建一个基本的 3D 场景:

html>
<html>
<head>
  <title>My first Three.js apptitle>
  <style>
    body { margin: 0; }
    canvas { display: block; }
  style>
head>
<body>
  <script src="https://cdn.jsdelivr.net/npm/three@0.132.2/build/three.min.js">script>
  <script>
    // 创建场景
    const scene = new THREE.Scene();
    // 创建相机
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    // 创建渲染器
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    // 创建几何体
    const geometry = new THREE.BoxGeometry();
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);
    // 定位相机
    camera.position.z = 5;
    // 渲染场景
    function animate() {
      requestAnimationFrame(animate);
      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;
      renderer.render(scene, camera);
    }
    animate();
  script>
body>
html>

在这个示例中,我们创建了一个简单的立方体,并使用 元素作为 WebGL 的渲染目标。通过 Three.js 的 API,我们可以方便地设置场景、相机、渲染器、几何体、材质等,并通过动画循环不断更新场景。

结论

Three.js 的主要载体是浏览器中的 元素,它依赖于 WebGL 技术来渲染 3D 图形。通过 JavaScript,Three.js 提供了一个易于使用的抽象层,使得开发者能够更容易地创建和管理复杂的 3D 场景。

八、this的问题

这个也是面试中经常会被问到并且很重要的一个问题。大家一定要熟练掌握

一、为什么要有this?

为了让对象中的函数有能力访问对象自己的属性

二、this的优点?

this可以显著的提升代码质量,减少上下文参数的传递

可以产生作用域的地方就可以用/this,除了块级作用域

就两种一个是全局,一个是函数体内。还有一个地方ever欺骗词法作用域也可以用this.

三、this的绑定规则1、默认绑定:

当一个函数独立调用,不带任何修饰符的时候

函数在哪个词法作用域下生效,函数的this就指向哪里

(只要是默认绑定,this一定指向window)

函数本身是没有词法作用域([[scope]])的,它的词法作用域是由函数声明的位置确定的或者this坚决不能访问词法作用域内部

var

在全局,通过var声明的变量相当于是在window对象上添加了一个属性

2、隐式绑定

当一个函数被一个对象所引用(非调用),再次调用时,函数中的this会指向该对象。

function foo(){
    console.log(this.a);
}
var obj = {
    a: 2,
    foo: foo
    // 相当于下面这样
    // foo: function foo(){
    //	console.log(this.a)
    // }
}
obj.foo() // 2

先解释下这段代码:obj中有个foo属性,然后这个属性的值又是一个函数体,就相当于foo这个函数体写在了foo这个key里面的value中,最后obj.foo()中obj.foo就是相当于foo这个函数体,然后()就是一个调用的意思

根据隐式绑定的规则,foo这个函数被obj这个函数引用,等你obj再次调用这个函数时,函数中的this最终指向了obj这个对象,而非全局,这就是隐式绑定,因此最终打印2

3、隐式丢失

隐式丢失是隐式绑定的一种,当一个函数被多个函数链式调用时,函数中的this最终指向引用函数的对象

function foo(){
    console.log(this.a);
}
var obj = {
    a: 2,
    foo: foo
}
var obj2 = {
    a: 3,
    obj: obj
}
obj2.obj.foo()

这段代码如何理解呢?我们有两种理解关于最后一行代码,一种是obj2.obj就是obj这个对象,然后obj这个对象去obj.foo(),就是成了一个隐式绑定,this会指向obj。另一种是obj2.(obj.foo()),obj.foo()就是foo(),然后obj2.foo(),相当于obj2调用了这个函数,this会指向obj2。两种理解好像都没问题,其实大部分人应该就是第一种理解,其实最终确实是第一种理解,换句话说,就近原则,最终输出2

4、显示绑定

显示绑定就是使用call、apply或bind方法人为干预他,让他代指谁

1、call

function foo(){
    console.log(this.a);
}
var obj = {
    a: 2
}
foo.call(obj) // 2

这个call的用法就是把foo的this指向了obj

foo中有参数时如何使用

function foo(n){
    console.log(this.a,n);
}
var obj = {
    a: 2
}
foo.call(obj,100) // 2 100

可以看出call与foo共用这个括号

2、apply

3、bind

五、new绑定

当使用new关键字进行实例化一个构造函数时,this最终指向该实例化对象

六、箭头函数

箭头函数没有this这个概念,在箭头函数中的this指向了外层第一个非箭头函数

九、如何实现一个三栏布局

具体的方法大家可以去看看我之前写的这篇文章

三栏布局:打造你想要的网页体验!前言: 什么是三栏布局? 就是主题内容优先加载,左右固定宽度,中间自适应。简单的说就是当 - 掘金 ()

十、如何实现水平垂直居中

这个是css中经常会被面试官问到的问题,有时候面试官还会让你手写,大家一定要背出来

情景:两个方块,大的包含小的,让小的水平垂直居中

方法一:定位absolute+translate

给top和left分别一个50%,然后自身再top和left负50%

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .box {
            width: 500px;
            height: 500px;
            background-color: rgb(28, 101, 164);
            position: relative;
        }
        .wrap {
            width: 200px;
            height: 200px;
            background-color: green;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            /* margin-top: -100px; */
            /* margin-left: -100px; */
        }
    style>
head>
<body>
    <div class="box">
        <div class="wrap">div>
    div>
body>
html>

如果已知宽高的时候也可以不用translate,直接写成margin-left:-100px和margin-top:-100px.

方法二:定位+margin auto

<style>
    .father{
        width:500px;
        height:300px;
        border:1px solid #0a3b98;
        position: relative;
    }
    .son{
        width:100px;
        height:40px;
        background: #f0a238;
        position: absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        margin:auto;
    }
 style>
 <div class="father">
    <div class="son">div>
 

父级设置为相对定位,子级绝对定位,并且四个定位属性的值都设置了0,那么这时候如果子级没有设置宽高,则会被拉开到和父级一样宽高

这里子元素设置了宽高,所以宽高会按照我们的设置来显示,但是实际上子级的虚拟占位已经撑满了整个父级,这时候再给它一个margin:auto它就可以上下左右都居中了。

方法三:弹性布局flex

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .box {
            width: 500px;
            height: 500px;
            background-color: rgb(28, 101, 164);
            display: flex;
            justify-content: center;
            align-items: center;
        }
        .wrap {
		   width: 200px;
            height: 200px;
            background-color: green;
        }
    style>
head>
<body>
    <div class="box">
        <div class="wrap">div>
    div>
body>
html>

justify-content: center是主轴居中,align-item: center是交叉轴居中

方法四:网格布局grid

写法和弹性一模一样

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .box {
            width: 500px;
            height: 500px;
            background-color: rgb(28, 101, 164);
            display: grid;
            justify-content: center;
            align-items: center;
        }
        .wrap {
            width: 200px; 
            height: 200px; 
            background-color: green;
        }
    style>
head>
<body>
    <div class="box">
        <div class="wrap">hhhhhhdiv>
    div>
body>
html>

方法五:表格布局table,text-align和vertical-aligin

用表格布局就需要用上text-align: center来居中,那么就需要子元素是非块级元素,所以将子元素设置display: inline-block成为行内块,表格元素在y轴上居中用vertical-align: middle;

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .box {
            width: 500px;
            height: 500px;
            background-color: rgb(28, 101, 164);
            display: table-cell;
            text-align: center;
            vertical-align: middle;
        }
        .wrap {
            display: inline-block;
            width: 200px;
            height: 200px;
            background-color: green;
        }
    style>
head>
<body>
    <div class="box">
        <div class="wrap">hhhhhhdiv>
    div>
body>
html>

文字水平垂直居中text-aligin、line-height

对于文字的水平垂直居中,你可以使用text-align: center和line-height来设置,line-height的参数设置成父容器的高即可

块级元素仅水平居中 margin: 0 auto

margin: 0 auto常见于仅水平居中块级元素,无法垂直居中

十一、浏览器存储方式有哪些?Cookies:Web Storage (localStorage/sessionStorage):IndexedDB:File System APIs (FileReader/FileWriter):

这里后面面试官又问我为什么现在仍然很多人用cookie?我是从这几个方面来回答他的

身份验证:

许多网站仍然依赖 Cookies 来进行身份验证,因为 Cookies 会随请求一起发送给服务器,从而允许服务器验证用户的身份。

兼容性:

Cookies 是最古老的存储机制之一,几乎所有浏览器都支持,并且许多遗留系统依然依赖 Cookies。

简单易用:

Cookies 的设置和读取相对简单,不需要额外的 JavaScript 操作,只需要简单的 HTTP 头部设置即可。

跨域请求:

Cookies 可以设置跨域访问权限,这对于单点登录(SSO)等场景非常重要。


上一条查看详情 +Android logcat 的使用技巧
下一条 查看详情 +没有了