为了面试能通过,我要看完这75道面试题(上,响应式web开发项目教程

2024-04-11 13:44

本文主要是介绍为了面试能通过,我要看完这75道面试题(上,响应式web开发项目教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/* 作用域链

内部作用域->外部作用域-> 全局作用域

*/

// 全局作用域

var variable1 = “Comrades”;

var variable2 = “Sayonara”;

function outer(){

// 外部作用域

var variable1 = “World”;

function inner(){

// 内部作用域

var variable2 = “Hello”;

console.log(variable2 + " " + variable1);

}

inner();

}

outer(); // Hello World

在这里插入图片描述

20. 什么是闭包?

这可能是所有问题中最难的一个问题,因为闭包是一个有争议的话题,这里从个人角度来谈谈,如果不妥,多多海涵。

闭包就是一个函数在声明时能够记住当前作用域、父函数作用域、及父函数作用域上的变量和参数的引用,直至通过作用域链上全局作用域,基本上闭包是在声明函数时创建的作用域。

看看小例子:

// 全局作用域

var globalVar = “abc”;

function a(){

console.log(globalVar);

}

a(); // “abc”

在此示例中,当我们声明a函数时,全局作用域是a闭包的一部分。

在这里插入图片描述

变量globalVar在图中没有值的原因是该变量的值可以根据调用函数a的位置和时间而改变。但是在上面的示例中,globalVar变量的值为abc

来看一个更复杂的例子:

var globalVar = “global”;

var outerVar = “outer”

function outerFunc(outerParam) {

function innerFunc(innerParam) {

console.log(globalVar, outerParam, innerParam);

}

return innerFunc;

}

const x = outerFunc(outerVar);

outerVar = “outer-2”;

globalVar = “guess”

x(“inner”);

在这里插入图片描述

上面打印结果是 guess outer inner

当我们调用outerFunc函数并将返回值innerFunc函数分配给变量x时,即使我们为outerVar变量分配了新值outer-2outerParam也继续保留outer值,因为重新分配是在调用outerFunc之后发生的,并且当我们调用outerFunc函数时,它会在作用域链中查找outerVar的值,此时的outerVar的值将为 "outer"

现在,当我们调用引用了innerFuncx变量时,innerParam将具有一个inner值,因为这是我们在调用中传递的值,而globalVar变量值为guess,因为在调用x变量之前,我们将一个新值分配给globalVar

下面这个示例演示没有理解好闭包所犯的错误:

const arrFuncs = [];

for(var i = 0; i < 5; i++){

arrFuncs.push(function (){

return i;

});

}

console.log(i); // i is 5

for (let i = 0; i < arrFuncs.length; i++) {

console.log(arrFuncsi); // 都打印 5

}

由于闭包,此代码无法正常运行。var关键字创建一个全局变量,当我们 push 一个函数时,这里返回的全局变量i。 因此,当我们在循环后在该数组中调用其中一个函数时,它会打印5,因为我们得到i的当前值为5,我们可以访问它,因为它是全局变量。

因为闭包在创建变量时会保留该变量的引用而不是其值。 我们可以使用IIFES或使用 let 来代替 var 的声明。

21. JavaScript 中的虚值是什么?

const falsyValues = [‘’, 0, null, undefined, NaN, false];

简单的来说虚值就是是在转换为布尔值时变为 false 的值。

22. 如何检查值是否虚值?

使用 Boolean 函数或者 !! 运算符。

23. ‘use strict’ 是干嘛用的?

"use strict"ES5 特性,它使我们的代码在函数或整个脚本中处于严格模式严格模式帮助我们在代码的早期避免 bug,并为其添加限制。

严格模式的一些限制:

  1. 变量必须声明后再使用

  2. 函数的参数不能有同名属性,否则报错

  3. 不能使用with语句

  4. 不能对只读属性赋值,否则报错

  5. 不能使用前缀 0 表示八进制数,否则报错

  6. 不能删除不可删除的属性,否则报错

  7. 不能删除变量delete prop,会报错,只能删除属性delete global[prop]

  8. eval不能在它的外层作用域引入变量

  9. evalarguments不能被重新赋值

  10. arguments不会自动反映函数参数的变化

  11. 不能使用arguments.callee

  12. 不能使用arguments.caller

  13. 禁止this指向全局对象

  14. 不能使用fn.callerfn.arguments获取函数调用的堆栈

  15. 增加了保留字(比如protectedstaticinterface

设立”严格模式”的目的,主要有以下几个:

  1. 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

  2. 消除代码运行的一些不安全之处,保证代码运行的安全;

  3. 提高编译器效率,增加运行速度;

  4. 为未来新版本的Javascript做好铺垫。

24. JavaScript 中 this 值是什么?

基本上,this指的是当前正在执行或调用该函数的对象的值。this值的变化取决于我们使用它的上下文和我们在哪里使用它。

const carDetails = {

name: “Ford Mustang”,

yearBought: 2005,

getName(){

return this.name;

},

isRegistered: true

};

console.log(carDetails.getName()); // Ford Mustang

这通常是我们期望结果的,因为在getName方法中我们返回this.name,在此上下文中,this指向的是carDetails对象,该对象当前是执行函数的“所有者”对象。

接下我们做些奇怪的事情:

var name = “Ford Ranger”;

var getCarName = carDetails.getName;

console.log(getCarName()); // Ford Ranger

上面打印Ford Ranger,这很奇怪,因为在第一个console.log语句中打印的是Ford Mustang。这样做的原因是getCarName方法有一个不同的“所有者”对象,即window对象。在全局作用域中使用var关键字声明变量会在window对象中附加与变量名称相同的属性。请记住,当没有使用“use strict”时,在全局作用域中this指的是window对象。

console.log(getCarName === window.getCarName); // true

console.log(getCarName === this.getCarName); // true

本例中的thiswindow引用同一个对象。

解决这个问题的一种方法是在函数中使用applycall方法。

console.log(getCarName.apply(carDetails)); // Ford Mustang

console.log(getCarName.call(carDetails)); // Ford Mustang

applycall方法期望第一个参数是一个对象,该对象是函数内部this的值。

IIFE立即执行的函数表达式,在全局作用域内声明的函数,对象内部方法中的匿名函数和内部函数的this具有默认值,该值指向window对象。

(function (){

console.log(this);

})(); // 打印 “window” 对象

function iHateThis(){

console.log(this);

}

iHateThis(); // 打印 “window” 对象

const myFavoriteObj = {

guessThis(){

function getName(){

console.log(this.name);

}

getName();

},

name: ‘Marko Polo’,

thisIsAnnoying(callback){

callback();

}

};

myFavoriteObj.guessThis(); // 打印 “window” 对象

myFavoriteObj.thisIsAnnoying(function (){

console.log(this); // 打印 “window” 对象

});

如果我们要获取myFavoriteObj对象中的name属性(即Marko Polo)的值,则有两种方法可以解决此问题。

一种是将 this 值保存在变量中。

const myFavoriteObj = {

guessThis(){

const self = this; // 把 this 值保存在 self 变量中

function getName(){

console.log(self.name);

}

getName();

},

name: ‘Marko Polo’,

thisIsAnnoying(callback){

callback();

}

};

第二种方式是使用箭头函数

const myFavoriteObj = {

guessThis(){

const getName = () => {

console.log(this.name);

}

getName();

},

name: ‘Marko Polo’,

thisIsAnnoying(callback){

callback();

}

};

箭头函数没有自己的 this。它复制了这个封闭的词法作用域中this值,在这个例子中,this值在getName内部函数之外,也就是myFavoriteObj对象。

25. 对象的 prototype(原型) 是什么?

简单地说,原型就是对象的蓝图。如果它存在当前对象中,则将其用作属性和方法的回退。它是在对象之间共享属性和功能的方法,这也是JavaScript实现继承的核心。

const o = {};

console.log(o.toString()); // logs [object Object]

即使o对象中不存在o.toString方法,它也不会引发错误,而是返回字符串[object Object]。 当对象中不存在属性时,它将查看其原型,如果仍然不存在,则将其查找到原型的原型,依此类推,直到在原型链中找到具有相同属性的属性为止。 原型链的末尾是Object.prototype

console.log(o.toString === Object.prototype.toString); // logs true

26. 什么是 IIFE,它的用途是什么?

IIFE或立即调用的函数表达式是在创建或声明后将被调用或执行的函数。 创建IIFE的语法是,将function (){}包裹在在括号()内,然后再用另一个括号()调用它,如:(function(){})()

(function(){

} ());

(function () {

})();

(function named(params) {

})();

(() => {

});

(function (global) {

})(window);

const utility = (function () {

return {

}

})

这些示例都是有效的IIFE。 倒数第二个救命表明我们可以将参数传递给IIFE函数。 最后一个示例表明,我们可以将IIFE的结果保存到变量中,以便稍后使用。

IIFE的一个主要作用是避免与全局作用域内的其他变量命名冲突或污染全局命名空间,来个例子。

假设我们引入了一个omelibr.js的链接,它提供了一些我们在代码中使用的全局函数,但是这个库有两个方法我们没有使用:createGraphdrawGraph,因为这些方法都有bug。我们想实现自己的createGraphdrawGraph方法。

解决此问题的一种方法是直接覆盖:

当我们使用这个解决方案时,我们覆盖了库提供给我们的那两个方法。

另一种方式是我们自己改名称:

当我们使用这个解决方案时,我们把那些函数调用更改为新的函数名。

还有一种方法就是使用IIFE

在此解决方案中,我们要声明了graphUtility 变量,用来保存IIFE执行的结果,该函数返回一个包含两个方法createGraphdrawGraph的对象。

IIFE 还可以用来解决一个常见的面试题:

var li = document.querySelectorAll(‘.list-group > li’);

for (var i = 0, len = li.length; i < len; i++) {

li[i].addEventListener(‘click’, function (e) {

console.log(i);

})

假设我们有一个带有list-group类的ul元素,它有5li子元素。 当我们单击单个li元素时,打印对应的下标值。但在此外上述代码不起作用,这里每次点击 li 打印 i 的值都是5,这是由于闭包的原因。

闭包只是函数记住其当前作用域,父函数作用域和全局作用域的变量引用的能力。 当我们在全局作用域内使用var关键字声明变量时,就创建全局变量i。 因此,当我们单击li元素时,它将打印5,因为这是稍后在回调函数中引用它时i的值。

使用 IIFE 可以解决此问题:

var li = document.querySelectorAll(‘.list-group > li’);

for (var i = 0, len = li.length; i < len; i++) {

(function (currentIndex) {

li[currentIndex].addEventListener(‘click’, function (e) {

console.log(currentIndex);

})

})(i);

}

该解决方案之所以行的通,是因为IIFE会为每次迭代创建一个新的作用域,我们捕获i的值并将其传递给currentIndex参数,因此调用IIFE时,每次迭代的currentIndex值都是不同的。

27. Function.prototype.apply 方法的用途是什么?

apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

const details = {

message: ‘Hello World!’

};

function getMessage(){

return this.message;

}

getMessage.apply(details); // ‘Hello World!’

call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。

const person = {

name: “Marko Polo”

};

function greeting(greetingMessage) {

return ${greetingMessage} ${this.name};

}

greeting.apply(person, [‘Hello’]); // “Hello Marko Polo!”

28. Function.prototype.call 方法的用途是什么?

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

const details = {

message: ‘Hello World!’

};

function getMessage(){

return this.message;

}

getMessage.call(details); // ‘Hello World!’

注意:该方法的语法和作用与 apply() 方法类似,只有一个区别,就是 call() 方法接受的是一个参数列表,而 apply() 方法接受的是一个包含多个参数的数组。

const person = {

name: “Marko Polo”

};

function greeting(greetingMessage) {

return ${greetingMessage} ${this.name};

}

greeting.call(person, ‘Hello’); // “Hello Marko Polo!”

29. Function.prototype.apply 和 Function.prototype.call 之间有什么区别?

apply()方法可以在使用一个指定的 this 值和一个参数数组(或类数组对象)的前提下调用某个函数或方法。call()方法类似于apply(),不同之处仅仅是call()接受的参数是参数列表。

const obj1 = {

result:0

};

const obj2 = {

result:0

};

function reduceAdd(){

let result = 0;

for(let i = 0, len = arguments.length; i < len; i++){

result += arguments[i];

}

this.result = result;

}

reduceAdd.apply(obj1, [1, 2, 3, 4, 5]); // 15

reduceAdd.call(obj2, 1, 2, 3, 4, 5); // 15

30. Function.prototype.bind 的用途是什么?

bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

import React from ‘react’;

class MyComponent extends React.Component {

constructor(props){

super(props);

this.state = {

value : “”

}

this.handleChange = this.handleChange.bind(this);

// 将 “handleChange” 方法绑定到 “MyComponent” 组件

}

handleChange(e){

//do something amazing here

}

render(){

return (

<>

<input type={this.props.type}

value={this.state.value}

onChange={this.handleChange}

/>

</>

)

}

}

31. 什么是函数式编程? JavaScript 的哪些特性使其成为函数式语言的候选语言?

函数式编程(通常缩写为FP)是通过编写纯函数,避免共享状态、可变数据、副作用 来构建软件的过程。数式编程是声明式 的而不是命令式 的,应用程序的状态是通过纯函数流动的。与面向对象编程形成对比,面向对象中应用程序的状态通常与对象中的方法共享和共处。

函数式编程是一种编程范式 ,这意味着它是一种基于一些基本的定义原则(如上所列)思考软件构建的方式。当然,编程范示的其他示例也包括面向对象编程和过程编程。

函数式的代码往往比命令式或面向对象的代码更简洁,更可预测,更容易测试 - 但如果不熟悉它以及与之相关的常见模式,函数式的代码也可能看起来更密集杂乱,并且 相关文献对新人来说是不好理解的。

JavaScript支持闭包和高阶函数是函数式编程语言的特点。

32. 什么是高阶函数?

高阶函数只是将函数作为参数或返回值的函数。

function higherOrderFunction(param,callback){

return callback(param);

}

33. 为什么函数被称为一等公民?

在JavaScript中,函数不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值(var func = function(){})、传参(function func(x,callback){callback();})、返回(function(){return function(){}}),这样的函数也称之为第一级函数(First-class Function)。不仅如此,JavaScript中的函数还充当了类的构造函数的作用,同时又是一个Function类的实例(instance)。这样的多重身份让JavaScript的函数变得非常重要。

34. 手动实现 Array.prototype.map 方法

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

function map(arr, mapCallback) {

// 首先,检查传递的参数是否正确。

if (!Array.isArray(arr) || !arr.length || typeof mapCallback !== ‘function’) {

return [];

} else {

let result = [];

// 每次调用此函数时,我们都会创建一个 result 数组

// 因为我们不想改变原始数组。

for (let i = 0, len = arr.length; i < len; i++) {

result.push(mapCallback(arr[i], i, arr));

// 将 mapCallback 返回的结果 push 到 result 数组中

}

return result;

}

}

35. 手动实现Array.prototype.filter方法

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

function filter(arr, filterCallback) {

// 首先,检查传递的参数是否正确。

if (!Array.isArray(arr) || !arr.length || typeof filterCallback !== ‘function’)

{

return [];

} else {

let result = [];

// 每次调用此函数时,我们都会创建一个 result 数组

// 因为我们不想改变原始数组。

for (let i = 0, len = arr.length; i < len; i++) {

// 检查 filterCallback 的返回值是否是真值

if (filterCallback(arr[i], i, arr)) {

// 如果条件为真,则将数组元素 push 到 result 中

result.push(arr[i]);

}

}

return result; // return the result array

}

}

36. 手动实现Array.prototype.reduce方法

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

function reduce(arr, reduceCallback, initialValue) {

// 首先,检查传递的参数是否正确。

if (!Array.isArray(arr) || !arr.length || typeof reduceCallback !== ‘function’)

{

return [];

} else {

// 如果没有将initialValue传递给该函数,我们将使用第一个数组项作为initialValue

let hasInitialValue = initialValue !== undefined;

let value = hasInitialValue ? initialValue : arr[0];

// 如果有传递 initialValue,则索引从 1 开始,否则从 0 开始

for (let i = hasInitialValue ? 0 : 1, len = arr.length; i < len; i++) {

value = reduceCallback(value, arr[i], i, arr);

}

return value;

}

}

37. arguments 的对象是什么?

arguments对象是函数中传递的参数值的集合。它是一个类似数组的对象,因为它有一个length属性,我们可以使用数组索引表示法arguments[1]来访问单个值,但它没有数组中的内置方法,如:forEachreducefiltermap

我们可以使用Array.prototype.slicearguments对象转换成一个数组。

function one() {

return Array.prototype.slice.call(arguments);

}

注意:箭头函数中没有arguments对象。

function one() {

return arguments;

}

const two = function () {

return arguments;

}

const three = function three() {

return arguments;

}

const four = () => arguments;

four(); // Throws an error - arguments is not defined

当我们调用函数four时,它会抛出一个ReferenceError: arguments is not defined error。使用rest语法,可以解决这个问题。

const four = (…args) => args;

这会自动将所有参数值放入数组中。

38. 如何创建一个没有 prototype(原型)的对象?

我们可以使用Object.create方法创建没有原型的对象。

const o1 = {};

console.log(o1.toString()); // [object Object]

const o2 = Object.create(null);

console.log(o2.toString());

// throws an error o2.toString is not a function

39. 为什么在调用这个函数时,代码中的b会变成一个全局变量?

function myFunc() {

let a = b = 0;

}

myFunc();

原因是赋值运算符是从右到左的求值的。这意味着当多个赋值运算符出现在一个表达式中时,它们是从右向左求值的。所以上面代码变成了这样:

function myFunc() {

let a = (b = 0);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

总结

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

前端面试题汇总

JavaScript

前端资料汇总

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

原因是赋值运算符是从右到左的求值的。这意味着当多个赋值运算符出现在一个表达式中时,它们是从右向左求值的。所以上面代码变成了这样:

function myFunc() {

let a = (b = 0);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-WdvZhP5n-1712803340971)]
[外链图片转存中…(img-hf3iw4qf-1712803340972)]
[外链图片转存中…(img-qQOXKnz3-1712803340972)]
[外链图片转存中…(img-L6gn1yle-1712803340972)]
[外链图片转存中…(img-8KROYYSS-1712803340973)]
[外链图片转存中…(img-Sjb6D15m-1712803340973)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-GORkB4kx-1712803340974)]

总结

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

前端面试题汇总

JavaScript

前端资料汇总

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-TSHTU9ps-1712803340974)]

这篇关于为了面试能通过,我要看完这75道面试题(上,响应式web开发项目教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894241

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定