// 类型断言,可以用来告诉解析器变量的实际类型
/*
-
语法:
-
变量 as 类型
-
<类型>变量
-
*/
e=2
s = e as string;
s = e;
&
// &表示同时
let j: { name: string } & { age: number };
// j = {name: ‘孙悟空’, age: 18};
type类型的别名
// 类型的别名
type myType = 1 | 2 | 3 | 4 | 5;
let k: myType;
let l: myType;
let m: myType;
k = 2;
1.自动编译文件
-
编译文件时,使用 -w 指令后,TS编译器会自动监视文件的变化,并在文件发生变化时对文件进行重新编译。
-
示例:
tsc xxx.ts -w
2.自动编译整个项目
-
如果直接使用tsc指令,则可以自动将当前项目下的所有ts文件编译为js文件。
-
但是能直接使用tsc命令的前提时,要先在项目根目录下创建一个ts的配置文件 tsconfig.json
-
tsconfig.json是一个JSON文件,添加配置文件后,只需只需 tsc 命令即可完成对整个项目的编译
npx tsc --init
tsc -w
配置选项:
include
-
定义希望被编译文件所在的目录
-
默认值:[“**/*”]
-
示例:
“include”:[“src//*", "tests//*”]
/*
tsconfig.json是ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译
“include” 用来指定哪些ts文件需要被编译
路径:** 表示任意目录
- 表示任意文件
“exclude” 不需要被编译的文件目录
默认值:[“node_modules”, “bower_components”, “jspm_packages”]
*/
“include”: [
“./src/**/*”
],
- 上述示例中,所有src目录和tests目录下的文件都会被编译
exclude
-
定义需要排除在外的目录
-
默认值:[“node_modules”, “bower_components”, “jspm_packages”]
-
示例:
“exclude”: [“./src/hello/**/*”]
- 上述示例中,src下hello目录下的文件都不会被编译
extends
-
定义被继承的配置文件
-
示例:
“extends”: “./configs/base”
- 上述示例中,当前配置文件中会自动包含config目录下base.json中的所有配置信息
files
-
指定被编译文件的列表,只有需要编译的文件少时才会用到
-
示例:
“files”: [
“core.ts”,
“sys.ts”,
“types.ts”,
“scanner.ts”,
“parser.ts”,
“utilities.ts”,
“binder.ts”,
“checker.ts”,
“tsc.ts”
]
- 列表中的文件都会被TS编译器所编译
compilerOptions
-
编译选项是配置文件中非常重要也比较复杂的配置选项
-
在compilerOptions中包含多个子选项,用来完成对编译的配置
项目选项
target
-
设置ts代码编译的目标版本
-
可选值:
-
ES3(默认)、ES5、ES6/ES2015、ES2016、ES2017、ES2018、ES2019、ES2020、es2021、es2022、ESNext
-
示例:
“compilerOptions”: {
“target”: “ES6”
//“target”: “ES2015”
}
- 如上设置,我们所编写的ts代码将会被编译为ES6版本的js代码
lib
-
指定代码运行时所包含的库(宿主环境)
-
可选值:
-
ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext、DOM、WebWorker、ScriptHost …
-
一般在浏览器运行不需要配置
-
示例:
“compilerOptions”: {
“target”: “ES6”,
“lib”: [“ES6”, “DOM”],
“outDir”: “dist”,
“outFile”: “dist/aa.js”
}
/‘es5’, ‘es6’, ‘es2015’, ‘es7’, ‘es2016’, ‘es2017’, ‘es2018’, ‘es2019’, ‘es2020’, ‘es2021’, ‘es2022’, ‘esnext’, ‘dom’, ‘dom.iterable’, ‘webworker’, ‘webworker.importscripts’, ‘webworker.iterable’, ‘scripthost’, ‘es2015.core’, ‘es2015.collection’, ‘es2015.generator’, ‘es2015.iterable’, ‘es2015.promise’, ‘es2015.proxy’, ‘es2015.reflect’, ‘es2015.symbol’, ‘es2015.symbol.wellknown’, ‘es2016.array.include’, ‘es2017.object’, ‘es2017.sharedmemory’, ‘es2017.string’, ‘es2017.intl’, ‘es2017.typedarrays’, ‘es2018.asyncgenerator’, ‘es2018.asynciterable’, ‘es2018.intl’, ‘es2018.promise’, ‘es2018.regexp’, ‘es2019.array’, ‘es2019.object’, ‘es2019.string’, ‘es2019.symbol’, ‘es2020.bigint’, ‘es2020.promise’, ‘es2020.sharedmemory’, ‘es2020.string’, ‘es2020.symbol.wellknown’, ‘es2020.intl’, ‘es2021.promise’, ‘es2021.string’, ‘es2021.weakref’, ‘es2021.intl’, ‘es2022.array’, ‘es2022.error’, ‘es2022.object’, ‘es2022.string’, ‘esnext.array’, ‘esnext.symbol’, ‘esnext.asynciterable’, ‘esnext.intl’, ‘esnext.bigint’, ‘esnext.string’, ‘esnext.promise’, ‘esnext.weakref’/
module
-
设置编译后代码使用的模块化系统
-
可选值:
-
CommonJS、UMD、AMD、System、ES2020、ESNext、None
-
示例:
“compilerOptions”: {
“module”: “CommonJS”
}
/‘none’, ‘commonjs’, ‘amd’, ‘system’, ‘umd’, ‘es6’, ‘es2015’, ‘es2020’, ‘es2022’, ‘esnext’, ‘node12’, ‘nodenext’/
outDir
-
编译后文件的所在目录
-
默认情况下,编译后的js文件会和ts文件位于相同的目录,设置outDir后可以改变编译后文件的位置
-
示例:
“compilerOptions”: {
“outDir”: “dist”
}
- 设置后编译后的js文件将会生成到dist目录
outFile
-
将所有的文件编译为一个js文件
-
默认会将所有的编写在全局作用域中的代码合并为一个js文件,如果module制定了None、System或AMD则会将模块一起合并到文件之中
-
一般不会用这个,一般用打包工具
-
示例:
“compilerOptions”: {
“outFile”: “dist/app.js”
}
rootDir
-
指定代码的根目录,默认情况下编译后文件的目录结构会以最长的公共目录为根目录,通过rootDir可以手动指定根目录
-
示例:
“compilerOptions”: {
“rootDir”: “./src”
}
allowJs
- 是否对js文件编译 ,默认是false
checkJs
-
是否对js文件进行检查
-
是否检查js代码是否符合ts语法规范,默认是false
-
示例:
“compilerOptions”: {
“allowJs”: true,
“checkJs”: true
}
removeComments
-
是否删除注释
-
默认值:false
noEmit
-
不对代码进行编译
-
不生成编译后的文件
-
只想检查语法的时候可能用
-
默认值:false
noEmitOnError
-
有错误的情况下不进行编译
-
默认值:false
sourceMap
-
是否生成sourceMap
-
默认值:false
严格检查
-
strict
-
启用所有的严格检查,默认值为true,设置后相当于开启了所有的严格检查
-
alwaysStrict
-
总是以严格模式对代码进行编译
-
noImplicitAny
-
禁止隐式的any类型
-
noImplicitThis
-
禁止类型不明确的this
-
strictBindCallApply
-
严格检查bind、call和apply的参数列表
-
strictFunctionTypes
-
严格检查函数的类型
-
strictNullChecks
-
严格的空值检查
let box1 = document.getElementById(‘box1’);
// if(box1 !== null){
// box1.addEventListener(‘click’, function (){
// alert(‘hello’);
// });
// }
box1?.addEventListener(‘click’, function (){
alert(‘hello’);
});
-
strictPropertyInitialization
-
严格检查属性是否初始化
额外检查
-
noFallthroughCasesInSwitch
-
检查switch语句包含正确的break
-
noImplicitReturns
-
检查函数没有隐式的返回值
-
noUnusedLocals
-
检查未使用的局部变量
-
noUnusedParameters
-
检查未使用的参数
高级
-
allowUnreachableCode
-
检查不可达代码
-
可选值:
-
true,忽略不可达代码
-
false,不可达代码将引起错误
-
noEmitOnError
-
有错误的情况下不进行编译
-
默认值:false
- 通常情况下,实际开发中我们都需要使用构建工具对代码进行打包,TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS。
步骤:
- 初始化项目
-
进入项目根目录,执行命令
npm init -y
-
主要作用:创建package.json文件
- 下载构建工具
-
npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin
-
共安装了7个包
-
webpack
-
构建工具webpack
-
webpack-cli
-
webpack的命令行工具
-
webpack-dev-server
-
webpack的开发服务器
-
typescript
-
ts编译器
-
ts-loader
-
ts加载器,用于在webpack中编译ts文件
-
html-webpack-plugin
-
webpack中html插件,用来自动创建html文件
-
npm i -D html-webpack-plugin
-
clean-webpack-plugin
-
webpack中的清除插件,每次构建都会先清除目录
- 根目录下创建webpack的配置文件webpack.config.js
// 引入一个包
const path = require(“path”);
// 引入html插件
const HtmlWebpackPlugin = require(“html-webpack-plugin”);
// 引入clean插件
const { CleanWebpackPlugin } = require(“clean-webpack-plugin”);
// webpack中的所有的配置信息都应该写在module.exports中
module.exports = {
optimization:{
minimize: false // 关闭代码压缩,可选
},
// 指定入口文件
entry: “./src/index.ts”,
// 指定打包文件所在目录
output: {
// 指定打包文件的目录
path: path.resolve(__dirname, “dist”),
// 打包后文件的文件
filename: “bundle.js”,
},
// 用来设置引用模块
resolve: {
extensions: [“.ts”, “.js”]
},
// 指定webpack打包时要使用模块
module: {
// 指定要加载的规则
rules: [
{
// test指定的是规则生效的文件
test: /.ts$/,
// 要使用的loader
use: {
loader: “ts-loader”
},
// 要排除的文件
exclude: /node_modules/
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
//title:‘TS测试’
template: “./src/index.html”//设定模板
}),
],
mode:‘production’
}
- 根目录下创建tsconfig.json,配置可以根据自己需要
{
“compilerOptions”: {
“target”: “ES2015”,
“module”: “ES2015”,
“strict”: true
}
}
- 修改package.json添加如下配置
{
…略…
“scripts”: {
“test”: “echo “Error: no test specified” && exit 1”,
“build”: “webpack”,
“start”: “webpack serve --open chrome.exe”
},
…略…
}
- 在src下创建ts文件,并在并命令行执行
npm run build
对代码进行编译,或者执行npm start
来启动开发服务器
- 经过一系列的配置,使得TS和webpack已经结合到了一起,除了webpack,开发中还经常需要结合babel来对代码进行转换以使其可以兼容到更多的浏览器,在上述步骤的基础上,通过以下步骤再将babel引入到项目中。
- 安装依赖包:
-
npm i -D @babel/core @babel/preset-env babel-loader core-js
-
共安装了4个包,分别是:
-
@babel/core
-
babel的核心工具
-
@babel/preset-env
-
babel的预定义环境
-
@babel-loader
-
babel在webpack中的加载器
-
core-js
-
core-js用来使老版本的浏览器支持新版ES语法
- 修改webpack.config.js配置文件
// 引入一个包
const path = require(‘path’);
// 引入html插件
const HTMLWebpackPlugin = require(‘html-webpack-plugin’);
// 引入clean插件
const { CleanWebpackPlugin } = require(‘clean-webpack-plugin’);
// webpack中的所有的配置信息都应该写在module.exports中
module.exports = {
// 指定入口文件
entry: “./src/index.ts”,
// 指定打包文件所在目录
output: {
// 指定打包文件的目录
path: path.resolve(__dirname, ‘dist’),
// 打包后文件的文件
filename: “bundle.js”,
// 告诉webpack不使用箭头//webpack会生成箭头函数的立即执行函数,这里不让他使用箭头函数
environment:{
arrowFunction: false
}
},
// 指定webpack打包时要使用模块
module: {
// 指定要加载的规则
rules: [
{
// test指定的是规则生效的文件
test: /.ts$/,
// 要使用的loader
use: [
// 配置babel
{
// 指定加载器
loader:“babel-loader”,
// 设置babel
options: {
// 设置预定义的环境
presets:[
[
// 指定环境的插件
“@babel/preset-env”,
// 配置信息
{
// 要兼容的目标浏览器
targets:{
“chrome”:“58”,
“ie”:“11”
},
// 指定corejs的版本//因为这里下载的是"core-js": “^3.21.1”,
“corejs”:“3”,
// 使用corejs的方式 “usage” 表示按需加载
“useBuiltIns”:“usage”
}
]
]
}
},
‘ts-loader’
],
// 要排除的文件
exclude: /node-modules/
}
]
},
// 配置Webpack插件
plugins: [
new CleanWebpackPlugin(),
new HTMLWebpackPlugin({
// title: “这是一个自定义的title”
template: “./src/index.html”
}),
],
// 用来设置引用模块
resolve: {
extensions: [‘.ts’, ‘.js’]
},
mode:‘production’
};
- 如此一来,使用ts编译后的文件将会再次被babel处理,使得代码可以在大部分浏览器中直接使用,可以在配置选项的targets中指定要兼容的浏览器版本。
面向对象是程序中一个非常重要的思想,它被很多同学理解成了一个比较难,比较深奥的问题,其实不然。面向对象很简单,简而言之就是程序之中所有的操作都需要通过对象来完成。
-
举例来说:
-
操作浏览器要使用window对象
-
操作网页要使用document对象
-
操作控制台要使用console对象
一切操作都要通过对象,也就是所谓的面向对象,那么对象到底是什么呢?这就要先说到程序是什么,计算机程序的本质就是对现实事物的抽象,抽象的反义词是具体,比如:照片是对一个具体的人的抽象,汽车模型是对具体汽车的抽象等等。程序也是对事物的抽象,在程序中我们可以表示一个人、一条狗、一把枪、一颗子弹等等所有的事物。一个事物到了程序中就变成了一个对象。
在程序中所有的对象都被分成了两个部分数据和功能,以人为例,人的姓名、性别、年龄、身高、体重等属于数据,人可以说话、走路、吃饭、睡觉这些属于人的功能。数据在对象中被成为属性,而功能就被称为方法。所以简而言之,在程序中一切皆是对象。
1、类(class)
要想面向对象,操作对象,首先便要拥有对象,那么下一个问题就是如何创建对象。要创建对象,必须要先定义类,所谓的类可以理解为对象的模型,程序中可以根据类创建指定类型的对象,举例来说:可以通过Person类来创建人的对象,通过Dog类创建狗的对象,通过Car类来创建汽车的对象,不同的类可以用来创建不同的对象。
- 定义类:
class 类名 {
属性名: 类型;
constructor(参数: 类型){
this.属性名 = 参数;
}
方法名(){
…
}
}
- 示例:
class Person{
name: string;
age: number;
constructor(name: string, age: number){
this.name = name;
this.age = age;
}
sayHello(){
console.log(大家好,我是${this.name}
);
}
}
- 使用类:
const p = new Person(‘孙悟空’, 18);
p.sayHello();
类的简介
// 使用class关键字来定义一个类
/*
-
对象中主要包含了两个部分:
-
属性
-
方法
-
*/
class Person{
/*
-
直接定义的属性是实例属性,需要通过对象的实例去访问:
-
const per = new Person();
-
per.name
-
使用static开头的属性是静态属性(类属性),可以直接通过类去访问
-
Person.age
-
readonly开头的属性表示一个只读的属性无法修改
-
*/
// 定义实例属性
// readonly name: string = ‘孙悟空’;
name = ‘孙悟空’;
// 在属性前使用static关键字可以定义类属性(静态属性)
// static readonly age: number = 18;
age = 18;
// 定义方法
/*
-
如果方法以static开头则方法就是类方法,可以直接通过类去调用
-
*/
sayHello(){
console.log(‘Hello 大家好!’);
}
}
const per = new Person();
per.sayHello();
构造函数
class Dog{
name: string;
age: number;
// constructor 被称为构造函数
// 构造函数会在对象创建时调用
constructor(name: string, age: number) {
// 在实例方法中,this就表示当前当前的实例
// 在构造函数中当前对象就是当前新建的那个对象
// 可以通过this向新建的对象中添加属性
this.name = name;
this.age = age;
}
bark(){
// alert(‘汪汪汪!’);
// 在方法中可以通过this来表示当前调用方法的对象
console.log(this.name);
}
}
const dog = new Dog(‘小黑’, 4);
const dog2 = new Dog(‘小白’, 2);
// console.log(dog);
// console.log(dog2);
dog2.bark();
继承
(function (){
// 定义一个Animal类
class Animal{
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
sayHello(){
console.log(‘动物在叫~’);
}
}
/*
-
Dog extends Animal
-
- 此时,Animal被称为父类,Dog被称为子类
-
- 使用继承后,子类将会拥有父类所有的方法和属性
-
- 通过继承可以将多个类中共有的代码写在一个父类中,
-
这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法
-
如果希望在子类中添加一些父类中没有的属性或方法直接加就行
-
- 如果在子类中添加了和父类相同的方法,则子类方法会覆盖掉父类的方法
-
这种子类覆盖掉父类方法的形式,我们称为方法重写
-
*/
// 定义一个表示狗的类
// 使Dog类继承Animal类
class Dog extends Animal{
run(){
console.log(${this.name}在跑~~~
);
}
sayHello() {
console.log(‘汪汪汪汪!’);
}
}
// 定义一个表示猫的类
// 使Cat类继承Animal类
class Cat extends Animal{
sayHello() {
console.log(‘喵喵喵喵!’);
}
}
const dog = new Dog(‘旺财’, 5);
const cat = new Cat(‘咪咪’, 3);
console.log(dog);
dog.sayHello();
dog.run();
console.log(cat);
cat.sayHello();
})();
super
(function () {
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
sayHello() {
console.log(‘动物在叫~’);
}
}
class Dog extends Animal{
age: number;
constructor(name: string, age: number) {
// 如果在子类中写了构造函数,在子类构造函数中必须对父类的构造函数进行调用
super(name); // 调用父类的构造函数
this.age = age;
}
sayHello() {
// 在类的方法中 super就表示当前类的父类
//super.sayHello();
console.log(‘汪汪汪汪!’);
}
}
const dog = new Dog(‘旺财’, 3);
dog.sayHello();
})();
抽象类
(function () {
/*
-
以abstract开头的类是抽象类,
-
抽象类和其他类区别不大,只是不能用来创建对象
-
抽象类就是专门用来被继承的类
-
抽象类中可以添加抽象方法
-
*/
abstract class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
// 定义一个抽象方法
// 抽象方法使用 abstract开头,没有方法体
// 抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
abstract sayHello():void;
}
class Dog extends Animal{
sayHello() {
console.log(‘汪汪汪汪!’);
}
}
class Cat extends Animal{
sayHello() {
console.log(‘喵喵喵喵!’);
}
}
const dog = new Dog(‘旺财’);
dog.sayHello();
})();
接口
接口就是定义了一个规范
(function () {
// 描述一个对象的类型
type myType = {
name: string,
age: number
};
/*
-
接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法
-
同时接口也可以当成类型声明去使用
-
*/
interface myInterface {
name: string;
age: number;
}
interface myInterface {
gender: string;
}
// const obj: myInterface = {
// name: ‘sss’,
// age: 111,
// gender: ‘男’
// };
/*
-
接口可以在定义类的时候去限制类的结构,
-
接口中的所有的属性都不能有实际的值
-
接口只定义对象的结构,而不考虑实际值
-
在接口中所有的方法都是抽象方法
-
*/
interface myInter{
name: string;
sayHello():void;
}
/*
- 定义类时,可以使类去实现一个接口,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
总结
前端资料汇总
-
框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。
-
算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯
-
在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。
-
要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
接口
接口就是定义了一个规范
(function () {
// 描述一个对象的类型
type myType = {
name: string,
age: number
};
/*
-
接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法
-
同时接口也可以当成类型声明去使用
-
*/
interface myInterface {
name: string;
age: number;
}
interface myInterface {
gender: string;
}
// const obj: myInterface = {
// name: ‘sss’,
// age: 111,
// gender: ‘男’
// };
/*
-
接口可以在定义类的时候去限制类的结构,
-
接口中的所有的属性都不能有实际的值
-
接口只定义对象的结构,而不考虑实际值
-
在接口中所有的方法都是抽象方法
-
*/
interface myInter{
name: string;
sayHello():void;
}
/*
- 定义类时,可以使类去实现一个接口,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-KNvwCAv3-1712702801808)]
[外链图片转存中…(img-lxE1VtzW-1712702801809)]
[外链图片转存中…(img-JIwOAB2e-1712702801810)]
[外链图片转存中…(img-dhQw5Zqk-1712702801810)]
[外链图片转存中…(img-QlAWFme6-1712702801810)]
[外链图片转存中…(img-pPfYGQvU-1712702801810)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-Q28zaCGU-1712702801811)]
总结
前端资料汇总
-
框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。
-
算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯
-
在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。
-
要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-deUljL6q-1712702801811)]