当前位置: 首页 > article >正文

八股文-js篇

八股文-js篇

  • 1. 延迟执行js的方式
  • 2. js的数据类型
  • 3. null 和 undefined的区别
  • 4. == 和 ===的区别
  • 5. js微任务和宏任务
  • 6. js作用域
  • 7. js对象
  • 9. JS作用域+this指向+原型
  • 8. js判断数组
  • 9. slice作用、splice是否会改变原数组
  • 10. js数组去重
  • 11. 找出数组最大值
  • 12. 给字符串新增方法实现功能
  • 13. 找出字符串出现最多次数的字符以及次数
  • 14. new操作符具体做了什么
  • 15. 闭包
  • 16. Promise 的三种状态是什么?如何转换?
  • 17. Promise.all 和 Promise.race 的区别?
  • 18. async/await 的作用是什么?
  • 19. async/await 和 Promise 的关系?
  • 20. instanceof 和 typeof
  • 21. Map
  • 22. 箭头函数和普通函数

1. 延迟执行js的方式

  • defer(等html全部解析完成,才会执行js代码,按顺序执行)
    defer属性只对外部脚本文件有效。这个属性表示脚本在执行的时候不会改变页面的结构,脚本会被延迟到整个页面都解析完毕后(即页面解析到</html>标签后)再运行。不过在实际当中,推迟执行的脚本不一定总会按顺序执行或者在DOMContenLoaded事件之前执行,因此 最好只包含一个这样的脚本
  • async(不按顺序执行,谁先加载完谁先执行)
    async属性只适用于外部脚本。给脚本添加async实行的目的是告诉浏览器,不必等该脚本下载和执行后再加载页面,同样也不必等该异步脚本下载和执行后再加载其他脚本。因此,异步脚本不应该再加载期间修改DOM。异步脚本保证会在页面的load事件前执行,但可能在DOMContentLoaded之前或之后。一般不推荐
    在这里插入图片描述

2. js的数据类型

  • 简单数据类型(7种):undefinednullbooleannumberstringsymbolbigInt
  • 复杂数据类型(1种):object
console.log(true + 1) // 2
console.log(undefined + 1) // NaN
// 字符串和其他类型相加会有隐式转换
console.log('name' + true) // 'nametrue'
console.log('1' + 1) // '11'
console.log('1' + undefined ) // '1undefined '
console.log(typeof null) // object

3. null 和 undefined的区别

  • null:空。
  • undefined:未定义。
    先有null后有undefined。最初设计null时参考了java。null会被隐式转换为0,不容易被发现错误,为了填补这个问题设计出了undefined。
console.log(typeof null) // object
console.log(typeof undefined) // 'undefined'console.log(Number(undefined)) // 0
console.log(Number(undefined)) // NaN

4. == 和 ===的区别

  • ==:比较值,隐式转换值相等时会判true
  • ===:比较值且比较类型

5. js微任务和宏任务

js是单线程语言,就是同一时间只能做一件事。js的主要用途是和用户互动,为了避免复杂性,单线程就成了js的核心特征。

js代码执行顺序:

  • 同步的任务都执行完了才会执行事件循环(包含微任务和宏任务,先执行完微任务再执行宏任务)的内容。
  • 先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

宏任务和微任务:

  • 宏任务:script、setTimeout、setInterval、postMessage
  • 微任务:Promise.then ES6、Object.observer、MutationObserver、process.nextTick
  • 先执行同步再执行异步,异步遇到微任务,先执行微任务,执行完后如果没有微任务,就执行下一个宏任务,如果有微任务,就按顺序一个一个执行微任务

6. js作用域

  • 除了函数外,js没有块级作用域
  • 作用域链:内部可以访问外部变量(就近原则),但外部 不能访问内部变量
  • 注意声明变量是用var还是没有写(没有写默认window.)
  • var变量声明提升机制
  • 优先级:声明变量 > 普通函数(普通声明函数是不看函数的顺序的) > 参数 > 变量提升
function c(){var b = 1;function a(){console.log( b ); // undefinedvar b = 2;console.log( b ); // 2}a();console.log( b ); // 1
}
c();
var name = 'a';
(function(){if( typeof name == 'undefined' ){var name = 'b';console.log('111'+name);}else{console.log('222'+name);}
})()
// 111b
function fun( a ){console.log( a ); //ƒ a(){}var a = 10;function a(){}
}
fun( 100 );

7. js对象

  • 对象是new出来的,对象不相等(跟存储的是指针有关)
  • 对象注意:引用类型
  • 对象的key都是字符串类型
  • 对象查找某个属性或方法:原型链
console.log([1]==[1]) // false
let a = [1]
let b = a
console.log(a === b) // true
var obj1 = {a:'hellow'
}
var obj2 = obj1;
obj2.a = 'world';
console.log(obj1); 	//{a:world}
(function(){console.log(a); 	//undefinedvar a = 1;
})();
var a = {}
var b = {key:'a'
}
var c = {key:'c'
}a[b] = '123';
a[c] = '456';console.log( a[b] ); // 456

9. JS作用域+this指向+原型

function Foo(){getName = function(){console.log(1)} //注意是全局的window.return this;
}Foo.getName = function(){console.log(2)}
Foo.prototype.getName = function(){console.log(3)}
var getName = function(){console.log(4)}
function getName(){console.log(5)
}Foo.getName();    //2
getName(); 		  //4
Foo().getName();  //1
getName();		  //1
new Foo().getName();//3
var o = {a:10,b:{a:2,fn:function(){console.log( this.a ); // 2console.log( this );   // {a: 2, fn: ƒ} 代表b对象}}
}
o.b.fn();
window.name = 'ByteDance';
function A(){this.name = 123;
}
A.prototype.getA = function(){console.log( this ); // windowreturn this.name + 1;
}
let a = new A();
let funcA = a.getA;
funcA();  // 'ByteDance1'
var length = 10;
function fn(){return this.length + 1;
}
var obj = {length:5,test1:function(){return fn();},test3:fn,
}
obj.test2 = fn;
console.log( obj.test1() ); // 11
console.log( obj.test3() ); // 6
console.log( fn()===obj.test2() ); // false
console.log( obj.test1() == obj.test2() ); // false

8. js判断数组

  • Array.isArray()
  • instanceof [] instanceof Array
  • toString.call() 原型判断 Object.prototype.toString.call(arr).indexOf(‘Array’) > -1
  • isPrototypeOf() Array.prototype.isPrototypeOf(arr)
  • constructor arr.constructor.toString().indexOf(‘Array’) > -1

9. slice作用、splice是否会改变原数组

  • slice()用来截取数组,返回一个新数组
  • splice()用来插入、删除、替换原数组,返回被删除的元素;会改变原数组

10. js数组去重

  • Set结构 new Set()(集合天然去重)[…new Set(arr)]
  • filter() 配合indexOf()
  • 遍历配合indexOf()
  • 遍历配合includes()

11. 找出数组最大值

Math.max(...[1,45,15464,2])

12. 给字符串新增方法实现功能

给字符串对象定义一个addPrefix函数,当传入一个字符串str时,它会返回新的带有指定前缀的字符串,例如:
console.log( ‘world’.addPrefix(‘hello’) ) 控制台会输出helloworld

String.prototype.addPrefix = function(str){return str  + this;
}
console.log( 'world'.addPrefix('hello') )

13. 找出字符串出现最多次数的字符以及次数

var str = 'aaabbbbbccddddddddddx';
var obj = {};
for(var i=0;i<str.length;i++){var char = str.charAt(i);if( obj[char] ){obj[char]++;}else{obj[char] = 1;}
}
console.log( obj );
//统计出来最大值
var max = 0;
var word = '';
for( var key in obj ){if( max < obj[key] ){max = obj[key];word = key;}
}
console.log('最多的字符是'+word );
console.log('出现的次数是'+max);

14. new操作符具体做了什么

  1. 创建一个空的对象
  2. 将新创建的空对象的原型([[Prototype]])链接到构造函数的原型对象。这意味着新对象可以访问构造函数的原型中定义的属性和方法。
  3. 用 “this” 关键字引用新创建的空对象,然后调用构造函数,将构造函数中的属性和方法添加到新创建的对象中。
  4. 如果构造函数没有显式返回一个对象,则返回这个新创建的对象。
function Fun( age,name ){this.age = age;this.name = name;
}
function create( fn , ...args ){//1. 创建了一个空的对象var obj = {}; //var obj = Object.create({})//2. 将空对象的原型,指向于构造函数的原型Object.setPrototypeOf(obj,fn.prototype);//3. 将空对象作为构造函数的上下文(改变this指向)var result = fn.apply(obj,args);//4. 对构造函数有返回值的处理判断return result instanceof Object ? result : obj;
}
console.log( create(Fun,18,'张三')   )

15. 闭包

闭包:指那些引用了另一个函数作用域中变量的函数。闭包是一个函数加上到创建函数作用域的链接,闭包关闭了函数的自由变量。

优点: 内部函数可以访问外部函数的变量(解决:把变量手动清空)
缺点: 变量会驻留在内存中,造成内存损耗;在一些低版本浏览器,如ie中还可能造成内存泄漏

16. Promise 的三种状态是什么?如何转换?

  • 状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)。

  • 转换规则:
    初始状态为 pending。
    调用 resolve() 变为 fulfilled,状态不可逆。
    调用 reject() 变为 rejected,状态不可逆。

console.log(1);
new Promise((resolve) => {console.log(2);resolve();
}).then(() => {console.log(3);
});
console.log(4);
// 1 2 4 3
// new Promise 的构造函数是同步执行的,会立即输出 1 和 2。
// .then() 是微任务,会在当前宏任务(同步代码)执行完毕后执行,因此输出 4 后再输出 3。

17. Promise.all 和 Promise.race 的区别?

  • Promise.all:
    接收一个 Promise 数组,所有 Promise 都成功时返回结果数组,若有一个失败则直接返回失败
  • Promise.race:
    接收一个 Promise 数组,返回第一个完成(成功或失败)的 Promise 的结果

18. async/await 的作用是什么?

  • 作用:
    async 函数返回一个 Promise。
    await 用于等待一个 Promise 的结果,使异步代码看起来像同步代码
  • 优势:
    代码更易读,避免回调地狱。
    支持 try/catch 捕获错误。
async function foo() {console.log(1);await bar();console.log(2);
}function bar() {console.log(3);return new Promise((resolve) => {setTimeout(() => resolve(), 0);});
}foo();
console.log(4);
// 1 3 4 2
// foo() 是异步函数,console.log(1) 同步执行。
// await bar() 会暂停 foo() 的执行,但不会阻塞外部代码,因此先输出 3 和 4。
// 微任务队列中的 resolve() 执行后,foo() 继续执行,输出 2。

19. async/await 和 Promise 的关系?

async/await 是基于 Promise 的语法糖,底层仍依赖 Promise。
await 等待的是一个 Promise 对象,若非 Promise 会被自动包装为 Promise.resolve()。

20. instanceof 和 typeof

在这里插入图片描述

  • typeof:适合检测基本类型和函数,但不够精确。
  • instanceof:适合检测引用类型,但受原型链和跨窗口影响。
  • 实际开发中:
    基本类型用 typeof 或严格相等(如 === null)。
    对象类型用 instanceof 或 Array.isArray() 等专用方法。
    复杂场景用 Object.prototype.toString.call()。

21. Map

在 JavaScript 中,Map 是一种用于存储键值对的集合数据结构,于 ES6(ECMAScript 2015)中引入。与传统的对象(Object)不同,Map 的键可以是任意类型(包括对象、函数、基本类型等),并且保留了插入顺序

核心特性:

  • 键的类型灵活:键可以是任意类型(对象、函数、原始值等),而对象的键只能是字符串或 Symbol。
  • 插入顺序保留:Map 会按照键值对的插入顺序进行迭代。
  • 性能优化:对于频繁增删键值对的场景,Map 的性能通常优于对象。
  • 直接访问大小:通过 size 属性直接获取键值对的数量,而对象需要手动计算(如 Object.keys(obj).length)。

Map与Object对比:
在这里插入图片描述

22. 箭头函数和普通函数

关于this:

  • 普通函数:动态绑定 this,this 的值由调用方式决定(全局对象、DOM 事件、构造函数等)。
const obj = {name: 'Alice',greet: function() {console.log(this.name); // 输出 'Alice'}
};
obj.greet();// 回调函数中可能丢失 this
setTimeout(obj.greet, 100); // 输出 undefined(this 指向全局对象)
  • 箭头函数:词法绑定 this:this 继承自外层作用域(定义时的上下文),无法通过 call、apply 或 bind 修改。
const obj = {name: 'Alice',greet: () => {console.log(this.name); // 输出 undefined(this 指向外层作用域,如 window)}
};
obj.greet();// 适合回调中保留 this
const button = document.querySelector('button');
button.addEventListener('click', () => {console.log(this); // 保持外层 this(如 Vue/React 组件实例)
});

构造函数与 new:

  • 普通函数:可作为构造函数,通过 new 调用
  • 箭头函数:不可作为构造函数,没有 prototype 属性,new 调用会报错
function Person(name) {this.name = name;
}
const alice = new Person('Alice');const Person = () => {};
const alice = new Person(); // 报错:Person is not a constructor

arguments 对象:

  • 普通函数:内部可访问 arguments 对象(类数组,包含所有参数)
  • 箭头函数:无 arguments 对象,需使用剩余参数(Rest Parameters)
function sum() {return Array.from(arguments).reduce((acc, val) => acc + val, 0);
}
sum(1, 2, 3); // 6const sum = (...args) => args.reduce((acc, val) => acc + val, 0);
sum(1, 2, 3); // 6

在这里插入图片描述

相关文章:

八股文-js篇

八股文-js篇 1. 延迟执行js的方式2. js的数据类型3. null 和 undefined的区别4. 和 的区别5. js微任务和宏任务6. js作用域7. js对象9. JS作用域this指向原型8. js判断数组9. slice作用、splice是否会改变原数组10. js数组去重11. 找出数组最大值12. 给字符串新增方法实现功能…...

DeepSeek:开启教育测评智能化新时代

目录 一、引言二、DeepSeek 技术概述2.1 DeepSeek 的发展历程与特点2.2 工作原理与技术架构 三、测评试题智能生成3.1 生成原理与技术实现3.2 生成试题的类型与应用场景3.3 优势与面临的挑战 四、学生学习评价报告4.1 评价指标体系与数据来源4.2 DeepSeek 生成评价报告的流程与…...

【2025五一数学建模竞赛B题】 矿山数据处理问题|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的美赛O奖、国赛国一的数学建模团队&#xff0c;我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解析&#xff0c…...

智能制造环形柔性生产线实训系统JG-RR03型模块式环形柔性自动生产线实训系统

智能制造环形柔性生产线实训系统JG-RR03型模块式环形柔性自动生产线实训系统 一、产品概述 (一)组成 柔性系统须有五个分系统构成即&#xff1a;数字化设计分系统、模拟加工制造分系统、检测装配分系统、生产物分流系统和信息管理分系统。它应包含供料检测单元&#xff0c;操作…...

1.2.2.1.4 数据安全发展技术发展历程:高级公钥加密方案——同态加密

引言 在密码学领域&#xff0c;有一种技术被图灵奖得主、著名密码学家Oded Goldreich誉为"密码学圣杯"&#xff0c;那就是全同态加密&#xff08;Fully Homomorphic Encryption&#xff09;。今天我们就来聊聊这个神秘而强大的加密方案是如何从1978年的概念提出&…...

Java大师成长计划之第18天:Java Memory Model与Volatile关键字

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在Java多线程编程中&#xff0c;线程…...

Lua再学习

因为实习的项目用到了Lua&#xff0c;所以再来深入学习一下 函数 函数的的多返回值 Lua中的函数可以实现多返回值&#xff0c;实现方法是再return后列出要返回的值的列表&#xff0c;返回值也可以通过变量接收到&#xff0c;变量不够也不会影响接收对应位置的返回值 Lua中传…...

GitLab搭建与使用(SSH和Docker)两种方式

前言 目前公共的代码仓库有很多&#xff0c;比如:git、gitee等等仓库但是我们在公司中&#xff0c;还是要搭建属于本公司自己的一个代码仓库&#xff0c;原因有如下几点 代码私密性&#xff0c;我们公司开发的代码保密性肯定一级重要&#xff0c;那么我们放到公网上&#xff0c…...

Linux数据库篇、第零章_MySQL30周年庆典活动

MySQL考试报名网站 Oracle Training and Certification | Oracle 中国 活动时间 2025年 MySQL的30周年庆典将于2025年举行。MySQL于1995年首次发布&#xff0c;因此其30周年纪念日是2025年。为了庆祝这一里程碑&#xff0c;MySQL将提供免费的课程和认证考试&#xff0c;活动…...

Windows ABBYY FineReader 16 Corporate 文档转换、PDF编辑和文档比较

作为一名合格的工人&#xff0c;日常工作肯定离不开PDF文件&#xff0c;所以今天给大家找来了一款全新的PDF处理工具&#xff0c;保证能给你带来不一样的体验。 软件介绍 这是一个全能型的PDF处理器&#xff0c;集优秀的文档转换、PDF编辑和文档比较等功能于一身&#xff0c;…...

设计模式简述(十九)桥梁模式

桥梁模式 描述基本组件使用 描述 桥梁模式是一种相对简单的模式&#xff0c;通常以组合替代继承的方式实现。 从设计原则来讲&#xff0c;可以说是单一职责的一种体现。 将原本在一个类中的功能&#xff0c;按更细的粒度拆分到不同的类中&#xff0c;然后各自独立发展。 基本…...

【每日一题 | 2025年5.5 ~ 5.11】搜索相关题

个人主页&#xff1a;Guiat 归属专栏&#xff1a;每日一题 文章目录 1. 【5.5】P3717 [AHOI2017初中组] cover2. 【5.6】P1897 电梯里的尴尬3. 【5.7】P2689 东南西北4. 【5.8】P1145 约瑟夫5. 【5.9】P1088 [NOIP 2004 普及组] 火星人6. 【5.10】P1164 小A点菜7. 【5.11】P101…...

C语言速成之08循环语句全解析:从基础用法到高效实践

C语言循环语句全解析&#xff1a;从基础用法到高效实践 大家好&#xff0c;我是Feri&#xff0c;12年开发经验的程序员。循环语句是程序实现重复逻辑的核心工具&#xff0c;掌握while、do-while、for的特性与适用场景&#xff0c;能让代码更简洁高效。本文结合实战案例&#xf…...

多模态大语言模型arxiv论文略读(六十九)

Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ➡️ 论文标题&#xff1a;Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ➡️ 论文作者&#xff1a;Yue Zha…...

云计算-容器云-部署CICD-jenkins连接gitlab

安装 Jenkins 将Jenkins部署到default命名空间下。要求完成离线插件的安装,设置Jenkins的登录信息和授权策略。 上传BlueOcean.tar.gz包 [root@k8s-master-node1 ~]#tar -zxvf BlueOcean.tar.gz [root@k8s-master-node1 ~]#cd BlueOcean/images/ vim /etc/docker/daemon.json…...

精讲C++四大核心特性:内联函数加速原理、auto智能推导、范围for循环与空指针进阶

前引&#xff1a;在C语言长达三十余年的演进历程中&#xff0c;每一次标准更新都在试图平衡性能与抽象、控制与安全之间的微妙关系。从C11引入的"现代C"范式开始&#xff0c;开发者得以在保留底层控制能力的同时&#xff0c;借助语言特性大幅提升代码的可维护性与安全…...

【HarmonyOS 5】鸿蒙中常见的标题栏布局方案

【HarmonyOS 5】鸿蒙中常见的标题栏布局方案 一、问题背景&#xff1a; 鸿蒙中常见的标题栏&#xff1a;矩形区域&#xff0c;左边是返回按钮&#xff0c;右边是问号帮助按钮&#xff0c;中间是标题文字。 那有几种布局方式&#xff0c;分别怎么布局呢&#xff1f;常见的思维…...

Docker 部署 - Crawl4AI 文档 (v0.5.x)

Docker 部署 - Crawl4AI 文档 (v0.5.x) 快速入门 &#x1f680; 拉取并运行基础版本&#xff1a; # 不带安全性的基本运行 docker pull unclecode/crawl4ai:basic docker run -p 11235:11235 unclecode/crawl4ai:basic# 带有 API 安全性启用的运行 docker run -p 11235:1123…...

QuecPython+Aws:快速连接亚马逊 IoT 平台

提供一个可接入亚马逊 Iot 平台的客户端&#xff0c;用于管理亚马逊 MQTT 连接和影子设备。 初始化客户端 Aws class Aws(client_id,server,port,keep_alive,ssl,ssl_params)参数&#xff1a; client_id (str) - 客户端唯一标识。server (str) - 亚马逊 Iot 平台服务器地址…...

内存安全暗战:从 CVE-2025-21298 看 C 语言防御体系的范式革命

引言 2025 年 3 月&#xff0c;当某工业控制软件因 CVE-2025-21298 漏洞遭攻击&#xff0c;导致欧洲某能源枢纽的电力调度系统瘫痪 37 分钟时&#xff0c;全球网络安全社区再次被拉回 C 语言内存安全的核心战场。根据 CISA 年度报告&#xff0c;68% 的高危漏洞源于 C/C 代码&a…...

SpringCloud Gateway知识点整理和全局过滤器实现

predicate(断言)&#xff1a; 判断uri是否符合规则 • 最常用的的就是PathPredicate&#xff0c;以下列子就是只有url中有user前缀的才能被gateway识别&#xff0c;否则它不会进行路由转发 routes:- id: ***# uri: lb://starry-sky-upmsuri: http://localhost:9003/predicate…...

全球实物文件粉碎服务市场洞察:合规驱动下的安全经济与绿色转型

一、引言&#xff1a;从纸质堆叠到数据安全的“最后一公里” 在数字化转型浪潮中&#xff0c;全球企业每年仍产生超过1.2万亿页纸质文件&#xff0c;其中包含大量机密数据、客户隐私及商业敏感信息。据QYResearch预测&#xff0c;2031年全球实物文件粉碎服务市场规模将达290.4…...

冒泡排序的原理

冒泡排序是一种简单的排序算法&#xff0c;它通过重复地遍历待排序的列表&#xff0c;比较相邻的元素并交换它们的位置来实现排序。具体原理如下&#xff1a; 冒泡排序的基本思想 冒泡排序的核心思想是通过相邻元素的比较和交换&#xff0c;将较大的元素逐步“冒泡”到列表的…...

Day22 Kaggle泰坦尼克号训练实战

​ 作业 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 一、流程 思路概述 数据加载 &#xff1a;读取泰坦尼克号的训练集和测试集。数据预处理 &#xff1a;处理缺失值、对分类变量进行编码、…...

深入浅出之STL源码分析7_模版实例化与全特化

1.引言 显示实例话和全特化的区别&#xff0c;之前我们在讨论类模版的时候&#xff0c;讨论过&#xff0c;他俩不是同一个概念&#xff0c;类模版中你如果全特化了&#xff0c;还是需要实例化才能生成代码&#xff0c;但是对于函数模版&#xff0c;这个是不同的&#xff0c;函…...

CAPL -实现SPRMIB功能验证

系列文章目录 抑制肯定响应消息指示位&#xff08;SPRMIB&#xff09; 二十一、CANdelaStudio深入-SPRMIB的配置 文章目录 系列文章目录一、SPRMIB是什么&#xff1f;二、SetSuppressResp(long flag)三、GetSuppressResp 一、SPRMIB是什么&#xff1f; 正响应&#xff1a;表示…...

2025 Mac常用软件安装配置

1、homebrew 2、jdk 1、使用brew安装jdk&#xff1a; brew install adoptopenjdk/openjdk/adoptopenjdk8 jdk默认安装位置在 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home 目录。 2、配置环境变量&#xff1a; vim ~/.zshrc# Jdk export JAVA_HOM…...

容器技术 20 年:颠覆、重构与重塑软件世界的力量

目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合​ 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重&#xff0c;到操作系统虚拟…...

cmake:test project

本文主要探讨cmake在测试和项目中的应用。 add_test add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS])  add_test(NAME test_uni COMMAND $<TARGET_F…...

C++开发过程中的注意事项详解

目录 C++开发过程中的注意事项详解 一、内存管理:避免泄漏与资源浪费 1.1 使用智能指针管理动态内存 1.2 避免手动内存管理的陷阱 1.3 利用RAII机制管理资源 1.4 容器与内存分配 二、安全性:防御攻击与未定义行为 2.1 输入验证与安全编码 2.2 使用安全的通信协议 2…...