关于 js:1. 基础语法与核心概念
js 全称 JavaScript(简称 JS),是 一种运行在浏览器和服务器端的脚本语言。
-
用途:
-
浏览器端交互(如:点击按钮出现弹窗)
-
网页动态内容渲染(如:淘宝、京东页面更新)
-
服务端开发(通过 Node.js)
-
自动化测试、爬虫、桌面程序、游戏开发等
-
-
运行环境:主要在浏览器(如 Chrome)中,也可在 Node.js 环境中运行
一、变量声明:var
/ let
/ const
的区别
特性 | var | let | const |
---|---|---|---|
声明作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
是否变量提升 | 是(初始化为 undefined ) | 是(但不能访问) | 是(但不能访问) |
是否可重复声明 | 可以 | 不可以(同一作用域) | 不可以(同一作用域) |
是否可修改值 | 可以 | 可以 | 不可以(但对象可改属性) |
是否有暂时性死区 | 没有 | 有 | 有 |
1. var
特点(老语法)
函数作用域
function test() {if (true) {var a = 1;}console.log(a); // 输出 1,因为 var 没有块作用域
}
变量提升(Hoisting)
console.log(a); // 输出 undefined(变量被提升但没有赋值)
var a = 10;
可以重复声明
var x = 5;
var x = 10; // 合法
2. let
特点(推荐使用)
块级作用域
if (true) {let a = 2;
}
console.log(a); // 报错,a 不存在于 if 外部作用域
暂时性死区(TDZ)
变量在声明之前不可访问,称为“暂时性死区”:
console.log(b); // 报错 ReferenceError
let b = 3;
不能重复声明
let y = 1;
let y = 2; // 报错:Identifier 'y' has already been declared
3. const
特点(用于声明常量)
必须初始化
const z; // 报错,必须赋初值
不可重新赋值
const num = 5;
num = 10; // 报错
对象/数组可变
const
只是不能重新赋值引用地址,但对象或数组的内部内容是可以变的:
const obj = { a: 1 };
obj.a = 100; // 合法
obj = {}; // 报错
使用建议
-
使用
let
:大多数可变变量情况都推荐用let
-
使用
const
:不打算修改的变量(如配置、函数、类等)用const
-
避免使用
var
:容易出问题,只在老代码或兼容性需要时使用
举例
function example() {console.log(a); // undefined(变量提升)console.log(b); // 报错(暂时性死区)var a = 1;let b = 2;
}
二、数据类型
1. 基本类型(Primitive Types)——值直接存在栈中
-
Number
:数字(整数、小数、NaN、Infinity) -
String
:字符串 -
Boolean
:布尔值(true / false) -
undefined
:变量声明了但没有赋值 -
null
:表示“空对象”指针(历史遗留问题) -
Symbol
:唯一值(用于对象属性标识符,ES6) -
BigInt
:支持大整数(如 2^53 以上,ES2020)
2. 引用类型(Reference Types)——存在堆中,变量保存引用地址
-
Object
:普通对象{}
,数组[]
,函数function(){}
,日期对象等 -
引用类型访问的是真实对象的内存地址(指针),而非值本身。
3. typeof 操作符(用于判断类型)
typeof 123 // "number"
typeof 'abc' // "string"
typeof true // "boolean"
typeof undefined // "undefined"
typeof null // "object"(历史 bug)
typeof Symbol() // "symbol"
typeof BigInt(10) // "bigint"typeof {} // "object"
typeof [] // "object"(数组本质也是对象)
typeof function(){} // "function"(是特殊的对象)
4. 类型判断更精准的方法
使用 Object.prototype.toString.call()
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(new Date) // "[object Date]"
Object.prototype.toString.call(() => {}) // "[object Function]"
判断数组
Array.isArray([]) // true
typeof [] === "object" // 仅说明它是对象,不准确
5. 类型转换
1)转换为字符串(String)
-
自动转换:模板字符串或字符串拼接
-
手动转换:
String(123); // "123"
(123).toString(); // "123"
2)转换为数字(Number)
-
自动转换:参与运算时,如
1 + '2'
→ 字符串拼接
表达式类型 | 转换行为 | 示例 | 结果 |
---|---|---|---|
+ 运算符,有字符串 | → 字符串拼接 | 1 + '2' | '12' |
其他运算符(-*/% ) | → 转为数字再运算 | '5' - 2 | 3 |
比较(== ) | → 双方尝试类型转换 | '5' == 5 | true |
-
手动转换:
Number("123"); // 123
+"123"; // 123
parseInt("123px"); // 123
parseFloat("3.14"); // 3.14
值 | Number(...) 结果 |
---|---|
true | 1 |
false | 0 |
null | 0 |
undefined | NaN |
"123" | 123 |
"abc" | NaN |
3)转换为布尔值(Boolean)
这些值转换为 false(“假值”):
-
false
-
0
-
NaN
-
""
(空字符串) -
null
-
undefined
Boolean(0); // false
Boolean("hello"); // true
!!"abc" // true(常用于强制布尔类型)
6. 值类型 vs 引用类型的比较方式
基本类型:比较值
let a = 1, b = 1;
console.log(a === b); // true
引用类型:比较地址
let obj1 = {x: 1};
let obj2 = {x: 1};
console.log(obj1 === obj2); // false(不是同一个引用)let obj3 = obj1;
console.log(obj1 === obj3); // true(同一引用)
举例
console.log(typeof null); // "object"(历史遗留问题)
console.log([] == false); // true(空数组转为布尔值是 true,但参与 == 运算先转为数字,[] -> 0)
console.log({} + []); // "[object Object]"({} 被当成代码块)
三、运算符
1. 算术运算符(Arithmetic Operators)
运算符 | 含义 | 示例 | 结果 |
---|---|---|---|
+ | 加法/拼接 | 1 + 2 | 3 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 2 * 4 | 8 |
/ | 除法 | 10 / 2 | 5 |
% | 取模 | 10 % 3 | 1 |
** | 幂运算 | 2 ** 3 | 8 |
++ | 自增 | x++ | 先返回 x,再加 1 |
-- | 自减 | --x | 先减 1,再返回值 |
注意:+
用于字符串拼接时,"abc" + 1
→ "abc1"
2. 逻辑运算符(Logical Operators)
运算符 | 含义 | 示例 | 结果 |
---|---|---|---|
&& | 且(与) | a && b | 如果 a 为假,返回 a,否则返回 b |
` | ` | 或(或) | |
! | 非(取反) | !true | false |
常用于短路逻辑判断:
let x = null;
let y = x || "默认值"; // y === "默认值"
逻辑中也常用于函数执行:
let isReady = true;
isReady && doSomething(); // 如果为 true,才执行函数
3. 位运算符(Bitwise Operators)
JavaScript 内部对数字是以 32 位有符号整数 形式处理位运算的。
运算符 | 名称 | 示例 | 描述 |
---|---|---|---|
& | 按位与(AND) | 5 & 3 | 0101 & 0011 = 0001 = 1 |
` | ` | 按位或(OR) | `5 |
^ | 按位异或(XOR) | 5 ^ 3 | 0101 ^ 0011 = 0110 = 6 |
~ | 按位非(NOT) | ~5 | ~00000101 = 11111010 = -6 |
<< | 左移 | 3 << 1 | 00000011 << 1 = 00000110 = 6 |
>> | 右移(带符号) | 6 >> 1 | 00000110 >> 1 = 00000011 = 3 |
>>> | 无符号右移 | -1 >>> 1 | 转为 32 位无符号后右移一位 |
位运算常用于加密逆向:
异或加密(XOR)
let data = 0x45;
let key = 0xAB;
let encrypted = data ^ key;
let decrypted = encrypted ^ key; // 再次异或同一个 key 可还原原文
掩码提取(bitmask)
提取二进制中的某几位:
let val = 0b10110101;
let mask = 0b00001111;
let result = val & mask; // 提取低四位
位操作常用于“位图”算法、“状态标记”、“加密算法”
比如:
// 判断第 3 位是否为 1
if (value & (1 << 2)) {// 第 3 位是 1
}
示例
某网站加密代码片段
function encode(str) {let res = "";for (let i = 0; i < str.length; i++) {// 取出第 i 位字符的编码, 与 0x12(18)做异或加密, 再转回字符, 拼接到结果字符串中res += String.fromCharCode(str.charCodeAt(i) ^ 0x12); // 每个字符异或处理}return res;
}
这种操作常见于:
-
登录数据加密
-
参数混淆
-
JS 中的行为分析与特征码加密
四、条件与循环
1. if / else if / else
条件语句
基本结构:
if (条件) {// 条件为 true 时执行
} else if (另一个条件) {// 另一个条件为 true 时执行
} else {// 所有条件都不成立时执行
}
示例:
let score = 85;
if (score >= 90) {console.log("优秀");
} else if (score >= 60) {console.log("及格");
} else {console.log("不及格");
}
注意:
-
条件表达式会被隐式转换为布尔值。
-
可与
==
、===
、&&
、||
、三元运算符组合使用。
2. switch
多条件判断(适用于“离散值分支”)
基本语法:
switch (变量) {case 值1:// 执行语句break;case 值2:// 执行语句break;default:// 都不匹配时执行
}
示例:
let key = "b";
switch (key) {case "a":console.log("选择了 A");break;case "b":console.log("选择了 B");break;default:console.log("未知选择");
}
注意:
-
===
严格比较,switch(1)
不等于case '1'
-
忘记写
break
会**“穿透”到下一个 case**
3. for
循环(结构最常见)
基本结构:
for (初始化; 条件; 更新) {// 每次循环执行内容
}
示例:
for (let i = 0; i < 5; i++) {console.log("i =", i);
}
应用:遍历数组
let arr = ["a", "b", "c"];
for (let i = 0; i < arr.length; i++) {console.log(arr[i]);
}
4. while
循环(先判断条件,再执行)
while (条件) {// 条件为 true 时执行
}
示例:
let i = 0;
while (i < 3) {console.log(i);i++;
}
5. do...while
(至少执行一次)
do {// 先执行一次
} while (条件);
示例:
let i = 0;
do {console.log(i);i++;
} while (i < 3);
6. for...in
和 for...of
语法 | 用于 | 遍历的是 |
---|---|---|
for...in | 对象、数组 | “键名”(字符串) |
for...of | 可迭代对象(数组) | “键值”(真正的值) |
1)for...in
(遍历对象属性)
let obj = {a: 1, b: 2};
for (let key in obj) {console.log(key, obj[key]); // a 1 b 2
}
2)for...of
(遍历数组值)
let arr = ['x', 'y'];
for (let val of arr) {console.log(val); // x y
}
7. 控制语句:break
、continue
语句 | 含义 | 示例 |
---|---|---|
break | 中断整个循环 | if (i === 3) break; |
continue | 跳过本次,继续循环 | if (i === 3) continue; |
8. 三元运算符(简洁的 if...else
)
条件 ? 表达式1 : 表达式2;
示例:
let age = 18;
let type = age >= 18 ? "成人" : "未成年";
9. 逆向中真实常见结构还原
很多加密/混淆代码里,条件和循环常被写得很复杂,例如:
(function(){var i = 0;while(true){switch(i++){case 0:a();break;case 1:b();break;case 2:return;}}
})();
这其实是反控制流(控制流平坦化),还原后就能看出执行顺序是:a() → b() → return
五、函数与作用域
1. 函数的几种声明方式
函数声明(Function Declaration)
function sayHi(name) {return "Hi, " + name;
}
特点:会提升(Hoisting),可以在定义前调用。
函数表达式(Function Expression)
const sayHi = function(name) {return "Hi, " + name;
};
特点:不会提升,只能在定义后使用。
箭头函数(Arrow Function)
const sayHi = (name) => "Hi, " + name;
特点:
-
没有自己的
this
、arguments
。 -
更简洁,常用于回调、闭包场景。
2. 函数参数与返回值
function sum(a, b = 0) {return a + b;
}
console.log(sum(3)); // 3
JS 支持默认参数、可选参数(未传为 undefined)。
3. 作用域与作用域链
作用域就是变量的可访问范围。
类型 | 说明 |
---|---|
全局作用域 | 全文件可访问 |
函数作用域 | 函数内部有效 |
块级作用域 | let /const 支持的代码块内 |
示例:
let a = 1;
function test() {let b = 2;console.log(a); // 可以访问外部变量 a
}
console.log(b); // 报错:b is not defined
作用域链(Scope Chain)
函数在定义时就确定了作用域链,查找变量是“由内向外,一层层查找”。
let a = 1;
function outer() {let b = 2;function inner() {let c = 3;console.log(a, b, c); // 都能访问}inner();
}
4. 闭包(Closure)
函数访问其外部作用域的变量,就形成了闭包。
function outer() {let counter = 0;return function() {counter++;return counter;};
}
const add = outer();
console.log(add()); // 1
console.log(add()); // 2
闭包 = 函数 + 它“定义时”能访问到的外部变量环境
一步步拆解:
1)定义阶段:outer()
定义了一个“返回函数”的函数。此时那个 return function()
就是闭包函数,它“捕获”了 counter
这个外部变量。
2)执行 outer()
,返回一个函数:但是!它不仅仅是函数,它还带着一个“记住了 counter = 0 的独立环境”。也就是说,这个函数“记住”了它当初在哪个作用域里被创建 —— 那个作用域中 counter = 0
。
3)调用 add()
第一次:执行时闭包访问到了 counter++
,结果变成 1,返回了 1。
4)再次调用 add()
:因为那个 counter
并没有消失,还存在于闭包中,所以继续自增。
特点:
-
counter
一直被内部函数引用,不会被释放。 -
每次调用
outer()
都是一个新的闭包。
闭包用途
用途 | 示例 |
---|---|
保持变量不被销毁 | 上面的 counter 示例 |
封装私有变量(模拟私有) | 不暴露内部变量 |
工厂函数、缓存、记忆化 | function memoized(){} |
逆向分析中的混淆函数 | _0xabc = function() { return ...; } 中保留状态 |
5. 立即执行函数 IIFE(立即执行函数表达式)
(function(){console.log("立即执行");
})();
常用于封装变量、创建闭包,防止污染全局。
6. JS 逆向中的应用场景
混淆代码结构(多见于 packer / eval 还原)
(function(){var _secret = "abc";window.getSecret = function() {return _secret;};
})();
_secret
是闭包私有变量,外部不能直接访问,但能通过暴露的函数调用。
利用闭包保存状态(如加密 Key、动态参数)
var keyGen = (function(){var key = 12345;return function() {return key ^ 0xdeadbeef;}
})();
六、this、箭头函数、call/apply/bind
this
是 运行时绑定的上下文对象,指的是“当前执行环境下的拥有者”。
不是“函数在哪定义的决定的”,而是“函数如何被调用的”决定的。
1. this与函数的关系
-
普通函数:
this
指向调用者。 -
箭头函数:
this
继承外层作用域(定义时决定)。 -
全局函数中:浏览器下
this === window
。
场景 | this 指向 | 示例 |
---|---|---|
默认绑定 | 浏览器中为 window ,严格模式是 undefined | 普通函数直接调用 |
隐式绑定 | 谁调用函数,this 就是谁 | obj.func() ,this === obj |
显式绑定(call/apply) | 手动指定 this | func.call(obj) |
new绑定(构造函数) | 指向新创建的实例对象 | new Foo() 中 this = 实例对象 |
默认绑定
function show() {console.log(this);
}
show(); // 浏览器中输出 window,严格模式下是 undefined
隐式绑定(最常见)
const obj = {name: "Tom",sayHi: function() {console.log(this.name);}
};
obj.sayHi(); // 输出 "Tom",this === obj
注意:如果脱离对象调用,this 就变了:
const fn = obj.sayHi;
fn(); // this 指向 window(默认绑定)
显式绑定(逆向中常见)
function greet() {console.log(this.lang);
}
const obj = { lang: "JS" };
greet.call(obj); // 输出 JS,this 被指定为 obj
new 绑定
function Person(name) {this.name = name;
}
const p = new Person("Alice");
console.log(p.name); // Alice
箭头函数:this
是静态的
const obj = {name: "Tom",sayHi: () => {console.log(this.name);}
};
obj.sayHi(); // undefined,this 不是 obj,而是外层作用域(window)
正确方式(用 function 保证 this 指向 obj):
const obj = {name: "Tom",sayHi() {console.log(this.name); // "Tom"}
};
调用方式 | this 指向 | 示例 |
---|---|---|
默认绑定 | 浏览器中是 window ,严格模式是 undefined | func() |
隐式绑定 | 谁调用函数,this 就是那个对象 | obj.func() |
显式绑定 | call / apply / bind 明确指定 | func.call(obj) |
new 绑定 | this 指向构造出的新对象 | new Foo() |
箭头函数 | 没有自己的 this ,继承定义时的作用域 | ()=>this |
2. 箭头函数
箭头函数最大的特点:
-
没有自己的
this
-
this
来自定义时的上下文环境(向上找第一个非箭头函数的this
) -
适合在回调、定时器、闭包中使用
示例一:普通函数 vs 箭头函数
const obj = {name: "Tom",sayHi: function() {console.log(this.name); // Tom},sayHiArrow: () => {console.log(this.name); // undefined,this来自 window}
};
obj.sayHi(); // Tom
obj.sayHiArrow(); // undefined
示例二:箭头函数捕获外部 this
function Person() {this.age = 0;setInterval(() => {this.age++; // this === Person 的实例console.log(this.age);}, 1000);
}
new Person();
箭头函数使 this
保持为构造函数内部的对象,避免了 setInterval 中的 this 指向 window 的问题。
-
普通函数:谁喊它,它就听谁的(
this
会变) -
箭头函数:一出生就决定跟谁混(
this
被词法绑定,不变)
箭头函数的 this
取决于定义时的外部上下文,不会被调用方式改变
const f = encrypt.bind({ secret: "xyz" });
console.log(f("123")); // 仍然输出 123abc
3. call
/ apply
/ bind
区别详解
call
、apply
、bind
都是 强制修改函数内部的 this
指向 的方法。
方法 | 参数形式 | 是否立即调用 | 改变 this |
---|---|---|---|
call | 逐个传参,如:fn.call(this, a, b) | 是 | 是 |
apply | 数组传参,如:fn.apply(this, [a, b]) | 是 | 是 |
bind | 返回新函数,如:let f = fn.bind(this) | 否 | 是 |
示例:
function greet(lang1, lang2) {console.log(this.name + " speaks " + lang1 + " and " + lang2);
}
const person = { name: "Alice" };greet.call(person, "JS", "Python");
greet.apply(person, ["JS", "Python"]);const newGreet = greet.bind(person, "JS");
newGreet("Go"); // Alice speaks JS and Go
apply 实际应用举例:
function wrapper() {console.log('wrapper this:', this);func.apply(this, arguments); // this 就是 wrapper 的 this
}function func(a, b) {console.log('func this:', this);console.log('a + b =', a + b);
}// 绑定一个对象调用
const obj = {name: '张三',callWrapper: wrapper
};obj.callWrapper(1, 2); // func 会以 obj 为 this 被调用
输出:
wrapper this: { name: '张三', callWrapper: f }
func this: { name: '张三', callWrapper: f }
a + b = 3
表达式 | 含义 |
---|---|
this | 当前函数的上下文调用者 |
arguments | 当前函数收到的所有参数 |
func.apply(this, arguments) | 把当前函数的参数原样转发给 func ,并让 func 也在当前 this 下执行 |
4. 应用场景详解
模拟继承(构造函数继承时用 call)
function Animal(name) {this.name = name;
}
function Dog(name, breed) {Animal.call(this, name); // this 指向 Dog 实例this.breed = breed;
}
防止丢失 this
const obj = {val: 42,getVal: function() {return this.val;}
};
const f = obj.getVal;
console.log(f()); // undefined,this 被丢了// 用 bind 修复:
const boundF = obj.getVal.bind(obj);
console.log(boundF()); // 42
立即执行箭头函数 vs bind
(() => {console.log(this); // window 或 global
})();(function() {console.log(this); // window 或 global
}).call({ a: 1 }); // 显示为 {a: 1}
5. JS 逆向中常见 this 用法(举例)
混淆代码通过 bind 固定 this(防反调试)
(function(){var _this = this;var keyFunc = function() {return _this.secret; // 使用外层 this}.bind(this);
})();
加密函数写成箭头函数,用外层上下文(难以 hook)
const encrypt = (() => {const secret = "abc";return (input) => input + secret;
})();
七、异常处理:try/catch
、throw
1. 基本语法结构
try {// 可能出错的代码
} catch (err) {// 捕获异常
} finally {// 总会执行的代码(可选)
}
执行流程图:
-
执行
try {...}
里的代码 -
如果出现错误,立刻跳到
catch(err)
,传入错误对象 -
无论有没有错误,都会执行
finally
(如果写了)
2. try / catch
示例详解
示例 1:正常捕获异常
try {let a = b + 1; // b 未定义,抛出 ReferenceError
} catch (e) {console.log("捕获到错误:", e.message); // 捕获执行
}
示例 2:不会捕获语法错误(编译时错误)
try {eval("var a = ;"); // 语法错误,仍可被 try-catch 捕获
} catch (e) {console.log("捕获到语法错误:", e.message);
}
说明:try
是运行时捕获,语法写错直接报错就挂了,不会走进 try
。
3. throw
手动抛出异常
可以使用 throw
抛出任何类型的值:
throw "我是一个字符串错误";
throw 123;
throw new Error("这是一个Error对象"); // 推荐
推荐抛出 Error
实例,语义更清晰,调试更容易。
自定义错误类型:
class MyError extends Error {constructor(message) {super(message);this.name = "MyError";}
}
throw new MyError("这是一个自定义错误");
4. finally
总是执行(即使中途 return)
function test() {try {return 1;} catch (e) {return 2;} finally {console.log("finally 总会执行");}
}
test(); // 输出 finally,然后返回 1
5. 常见的错误类型(系统内置)
错误类型 | 描述 |
---|---|
ReferenceError | 访问未定义变量 |
TypeError | 变量类型错误,如 null.foo() |
SyntaxError | 代码语法错误(eval 可捕获) |
RangeError | 值超出合法范围,如栈溢出 |
URIError | URI 处理函数使用错误(如 decodeURI ) |
EvalError | eval() 使用不当(已较少见) |
6. 实际用途:异常处理的高级应用场景
处理用户输入或接口错误
function parseJSON(str) {try {return JSON.parse(str);} catch (e) {return {}; // 防止接口返回异常}
}
逆向分析中:构造异常流 + 防调试
某些混淆代码使用 try/catch
故意制造异常阻止调试:
try {(function(){return (1).constructor.constructor("debugger")();})();
} catch(e) {// 捕捉异常,继续执行
}
反调试代码示例:
try {Object.defineProperty(window, 'console', {get: function() {throw new Error("调试被禁止!");}});
} catch(e) {// 黑盒继续运行
}
这段代码用 get
拦截访问 console
,用 throw
抛异常干扰开发者。
相关文章:
关于 js:1. 基础语法与核心概念
js 全称 JavaScript(简称 JS),是 一种运行在浏览器和服务器端的脚本语言。 用途: 浏览器端交互(如:点击按钮出现弹窗) 网页动态内容渲染(如:淘宝、京东页面更新…...
云境天合水陆安全漏电监测仪—迅速确定是否存在漏电现象
云境天合水陆安全漏电监测仪是一种专为水下及潮湿环境设计的电气安全检测设备,通过高灵敏度电磁传感器探测漏电电流产生的交变磁场,基于法拉第电磁感应定律,自动区分高灵敏度信号和低灵敏度信号,精准定位泄漏电源的具体位置。一旦…...
二、Hadoop狭义和广义的理解
作者:IvanCodes 日期:2025年5月6日🫠 专栏:Hadoop教程 Hadoop 的双重身份:核心框架与生态系统 在大数据领域,Hadoop 是一个广为人知的概念,但它并非单指某一个软件,而是涵盖了两个层…...
DTU_DTU厂家_5G/4G DTU终端_DTU模块_厦门计讯物联科技有限公司
在物联网蓬勃发展的当下,数据的高效、稳定、可靠的传输成为关键。厦门计讯物联科技有限公司(以下简称“计讯物联”)作为国内工业物联网领域的核心厂商,专注于5G/4G DTU终端、DTU模块及无线数传设备的研发与生产,致力于为智慧城市、能源电力、…...
学习alpha,第2个alpha
alphas (-1 * ts_corr(rank(ts_delta(log(volume), 2)), rank(((close - open) / open)), 6)) 先分析操作符从左到右 ts_corr: Pearson 相关度量两个变量之间的线性关系。当变量呈正态分布且关系呈线性时,它最有效。 ts_corr(vwap, close, 20)是一个计算时间序列相…...
如何用爬虫获得按关键字搜索淘宝商品
在电商领域,获取淘宝商品的详细信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。淘宝作为国内知名的电商平台,提供了丰富的商品资源。通过 Python 爬虫技术,我们可以高效地获取淘宝商品的详细信息,包括商品名…...
Android SDK 开发中的 AAR 与 JAR 区别详解
在 Android SDK 开发中,构建项目时我们常常会看到生成两个不同的文件:一个是 build/outputs/aar/*.aar,另一个是 build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar。很多初学者会疑惑:它们之间有什么区别&am…...
Python cv2滤波与模糊处理:从原理到实战
在图像处理领域,滤波与模糊是预处理阶段的两大核心操作,既能消除噪声干扰,又能实现艺术化效果。本文将结合OpenCV的cv2库,系统讲解滤波与模糊的原理及Python实现,带你从理论到实战全面掌握这项技术。 一、滤波与模糊的…...
【SpringBoot3】idea找不到log符号
解决idea找不到log符号,Slf4j注解不起作用 如图 解决办法 pom.xml文件里要手动添加版本号 插件也要添加对应的版本号 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30&l…...
Android学习总结之Java和kotlin区别
一、空安全机制 真题 1:Kotlin 如何解决 Java 的 NullPointerException?对比两者在空安全上的设计差异 解析: 核心考点:Kotlin 可空类型系统(?)、安全操作符(?./?:)、非空断言&…...
C++笔记-二叉搜索树(包括key,key/value搜索场景等)
1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值若它的右子树不为空,则2.右子树上所有结点的值都大于等于根结点…...
【从零开始学习RabbitMQ | 第二篇】生成交换机到MQ的可靠性保障
目录 编辑前言 交换机 Direct交换机与Fanout交换机的差异 Topic交换机 Topic交换机相比Direct交换机的差异 生成我们的交换机,队列,以及绑定关系 基于代码去生成交换机和队列 基于注解去声明队列和交换机 消息转换器 消息队列的高可靠性 发送…...
在 Sheel 中运行 Spark:开启高效数据处理之旅
在大数据处理领域,Apache Spark 凭借其强大的分布式计算能力,成为了众多开发者和企业处理海量数据的首选工具之一。而 Sheel 作为一种便捷的运行环境,在其中运行 Spark 可以充分发挥两者优势,实现高效的数据处理与分析。本文将详细…...
前端、XSS(跨站脚本攻击,Cross-Site Scripting)
XSS 攻击的三种主要类型 存储型 XSS(持久型) 原理:恶意脚本被永久存储在服务器(如数据库、评论内容),用户访问包含恶意脚本的页面时触发示例:攻击者在论坛的评论区提交 ,其他用户查…...
第六节:图像基本操作-像素级操作
一、数字图像处理基础 1.1 图像数字化原理 数字图像本质上是二维离散信号,由按矩阵排列的像素点构成。每个像素点的数值代表特定位置的亮度或色彩信息... 1.2 OpenCV核心数据结构 import cv2 import numpy as np# 读取图像文件 img cv2.imread(image.jpg)# 获取…...
【东枫科技】代理销售 NVIDIA DGX Spark 您的桌上有一台 Grace Blackwell AI 超级计算机。
NVIDIA GB10 Grace Blackwell超级芯片 FP4 AI 性能达到 1,000 AI TOPS 128GB 一致、统一的系统内存 ConnectX-7 智能网卡 高达 4TB 存储空间 150毫米长 x 150毫米宽 x 50.5毫米高 NVIDIA DGX™ Spark 搭载 NVIDIA GB10 Grace Blackwell 超级芯片,以节能紧凑的外形提…...
即插即用!长安汽车复旦提出LMPOcc:长期记忆先验实现占用预测任务新SOTA
导读 在基于视觉的自动驾驶感知算法当中,3D语义占用预测任务可以出色的对静态场景和动态目标同时进行建模,实现细粒度的场景理解,目前受到了来自学术界和工业界的广泛关注。 ©️【深蓝AI】编译 论文题目:ConRFT: A Reinfo…...
Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷
🚀 Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷 🌍 什么是弹性伸缩? 弹性伸缩(Auto Scaling)是指系统能够根据实时负载自动调整计算资源,以优化性能并降低成本。在 Kubernetes࿰…...
深入解析 Linux/Unix 通信机制:从原理到观测实践
深入解析 Linux/Unix 通信机制:从原理到观测实践 配图建议:Linux系统架构与通信机制全景示意图 一、开篇:理解“一切皆文件”的哲学 Unix/Linux 操作系统的核心灵魂在于其独特的设计哲学。当 Dennis Ritchie 和 Ken Thompson 在贝尔实验室开…...
Vue 2.0 详解全教程(含 Axios 封装 + 路由守卫 + 实战进阶)
目录 一、Vue 2.0 简介1.1 什么是 Vue?1.2 Vue 2.x 的主要特性 二、快速上手2.1 引入 Vue2.2 创建第一个 Vue 实例 三、核心概念详解3.1 模板语法3.2 数据绑定3.3 事件绑定3.4 计算属性 & 侦听器 四、组件系统4.1 定义全局组件4.2 单文件组件(*.vue …...
《Python星球日记》 第36天:线性代数基础
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、标量、…...
使用 Spring Boot 构建 REST API
使用 Spring Boot 构建 REST API 使用 Spring Boot 构建 REST API1. Spring Initializr构建springboot2. API 合同 & JSONAPI 协定什么是 JSON? 3.先测试什么是测试驱动开发?测试金字塔Red, Green, Refactor 循环 4. 实施 GET…...
PHP分页显示数据,在phpMyadmin中添加数据
<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //设置字符集为utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //记录总条数$count。 $pagesize10;//每…...
Spring Boot操作MongoDB的完整示例大全
以下是基于Spring Boot操作MongoDB的完整示例大全,涵盖增删改查、聚合查询、索引、事务等核心功能: 一、基础CRUD操作 1. 环境配置 依赖配置(pom.xml) <dependency><groupId>org.springframework.boot</groupId…...
SpringCloud入门教程合集(1)-SpringCloud简介与Eureka+Feign实现服务注册中心、服务提供与服务消费
场景 SpringCloud 总体架构与核心子项目 SpringCloud 总体架构 1. 基础设施层 服务注册与发现:Eureka/Nacos 配置中心:Spring Cloud Config/Nacos 消息总线:Spring Cloud Bus 2. 服务通信层 负载均衡:Ribbon/LoadBalancer…...
【Linuc】深入理解 Linux 文件权限
文章目录 一、权限基础解析1. 权限三元组2. 权限类型与数字映射二、查看文件权限三、修改权限实战1. chmod 命令符号模式数字模式(推荐)2. chown 修改归属四、特殊权限机制1. SetUID (Set User ID)2. SetGID (Set Group ID)3. Sticky Bit五、高级权限管理1. 默认权限控制2. A…...
ExtraMAME:复古游戏的快乐“时光机”
嘿,小伙伴们!今天电脑天空要给大家安利一款超有趣的软件——ExtraMAME!如果你对复古街机游戏念念不忘,那它绝对能成为你的快乐源泉,带你瞬间穿越回那个充满游戏机的黄金时代。 ExtraMAME是一款基于MAME(Mu…...
没有 Mac,如何把 iOS App 成功上架?
开发者的 iOS 上架折腾记:没有 Mac,也能搞定? 最近在帮朋友把一个跨平台 Flutter 项目上架到 App Store,结果被 iOS 上架的那套流程卡得头都大了。其实这也不是第一次碰壁了——每次到“申请证书 打包 上传”的时候,…...
使用VMware Workstation pro 17.5.1在Windows上安装Ubuntu 24.04.2的 详细步骤
一、准备工作 1. 下载Ubuntu 24.04.2 ISO镜像 官方下载地址:Ubuntu 24.04.2 (Noble Numbat) 选择 ubuntu-24.04.2-desktop-amd64.iso(桌面版)或 ubuntu-24.04.2-live-server-amd64.iso(服务器版)。 2. 确认系统要求…...
栈与队列详解及模拟实现
目录 一、栈(Stack):后进先出 1.1 什么是栈 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的经典应用 二、队列(Queue):先进先出 2.1 什么是队列 2.2 队列的使…...
Cursor无法SSH远程连接服务器免密登录问题
在本地机器和Ubuntu服务器之间实现SSH远程免密连接,可按如下步骤操作: 1. 生成SSH密钥对 在本地机器上开启终端,使用以下命令生成SSH密钥对: ssh-keygen -t rsa按提示操作,一般直接回车,这样密钥会生成在…...
【Vue】全局事件总线 TodoList 事件总线
目录 一、 实现所有组件看到x事件 二、 实现$on $off 以及 $emit 总结不易~ 本章节对我有很大的收获, 希望对你也是!!! 本节素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.com 全局事件总线图: 本节素材…...
动态规划背包问题
一、0-1背包问题 0-1背包问题就是给定n个物品和一个容量为C的背包,物品i的重量是Wi,其价值是Vi。问:应该如何选择装入背包的物品,使总价值最大且总重量不超过C? 1.确定状态表示 dp[i][j] 表示在背包容量为j时,从下标…...
ctfshow web入门 web49
信息收集 此%非彼%,%0a中的%不会被识别,因为识别之前就已经自动转化为了换行符 所以和之前一样的解法,没什么好说的 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|…...
AI+浏览器自动化:Nanobrowser Chrome 扩展的使用「详细教程」
AI+浏览器自动化:Nanobrowser Chrome 扩展的使用「详细教程」 一、前言二、Nanobrowser简介2.1 项目背景2.2 核心特性三、安装与配置3.1 安装方式3.1.1 Chrome Web Store安装3.1.2 手动安装最新版3.2 基本配置3.2.1 添加API Key3.2.2 选择模型3.2.3 其他设置四、核心功能详解4…...
【表设计】外键的取舍-分布式中逐渐消失的外键
在分布式大行其道的今天,为什么外键约束越来越少? 外键-数据链接带来强制完整性 在关系型数据库中,外键(Foreign Key)可以用于建立和强制两个表之间的数据链接。 在层次数据结构一篇的闭包表简单设计中,…...
HarmonyOS 5.0 分布式数据协同与跨设备同步
大家好,我是 V 哥。 使用 Mate 70有一段时间了,系统的丝滑使用起来那是爽得不要不要的,随着越来越多的应用适配,目前使用起来已经和4.3的兼容版本功能差异无碍了,还有些纯血鸿蒙独特的能力很是好用,比如&am…...
多行文本省略
方式1 兼容性不好 height: 100px; line-height: 25px; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4;方式2 利用浮动环绕、空白元素站位margin-top调整位置 <div class"wrap"><div class"more"…...
Adobe卸载清理工具Creative Cloud Cleaner Tool下载
Adobe Creative Cloud Cleaner Tool 是 Adobe 公司官方推出的一款卸载清理工具,主要用于清理 Creative Cloud 应用程序在安装、更新或卸载过程中可能遗留下来的错误配置文件、缓存、注册表项或其他系统级残留内容。相比一般的卸载程序,它更深入地处理系统…...
分布式、高并发-Day03
以下是 Day 3 详细学习内容(线程池拒绝策略实战:DiscardOldestPolicy与CallerRunsPolicy,30 分钟完整计划),包含策略原理、分步代码实战和场景解析: 📖 今日学习目标 掌握DiscardOldestPolicy…...
高等数学第四章---不定积分(4.4有理函数的不定积分2)
&4.4有理函数的不定积分2 篇幅有限制,例题的解答会占大量字符,html限制字符为22000个左右。这里继续探讨上文的有理函数的不定积分。 一、三角函数有理式的不定积分 由 sin x \sin x sinx, cos x \cos x cosx 以及常数经过有限次加、减、…...
C++中指针使用详解(4)指针的高级应用汇总
C 中指针的高级应用非常丰富,掌握这些内容能让你写出更高性能、更底层控制力强的代码。下面是应用模块梳理和例子讲解。 目录预览 函数指针与回调机制指针数组 vs 数组指针指针与类成员函数(成员函数指针)智能指针(unique_ptr, s…...
Java 8 非对称加密代码示例
以下是使用Java 8实现RSA非对称加密的完整代码示例,包括密钥生成、加密和解密过程。 1. 生成RSA密钥对 import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; impor…...
Linux环境基础与开发工具使用
1. Linux编译器vim 1.1 vim的基本概念讲解 vim有很多种模式,我们初学者常用的就是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。 命令/正常模式(Normal mode) …...
【BUG】‘DetDataSample‘ object has no attribute ‘_gt_sem_seg‘
问题: 使用mmdetection框架使用COCO格式训练自定义数据集时,其中模型使用HTC模型时出现如下问题: AttributeError: ‘DetDataSample’ object has no attribute ‘_gt_sem_seg’. Did you mean: ‘gt_sem_seg’? results self(**data, mode…...
C# Winforms 本地化 多语言支持 字符串资源
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
ts bug 找不到模块或相应类型的声明,@符有红色波浪线
解决方法:在env.d.ts文件中添加以下代码,这段代码是一个 TypeScript 的声明文件,用于让 TypeScript 知道如何处理 Vue 单文件组件(.vue 文件)的导入。 /// <reference types"vite/client" /> // 声明…...
赛灵思 XCZU11EG-2FFVC1760I XilinxFPGAZynq UltraScale+ MPSoC EG
XCZU11EG-2FFVC1760I 是 Zynq UltraScale MPSoC EG 系列中性能最强的器件之一,集成了四核 ARM Cortex-A53 应用处理器、双核 Cortex-R5 实时处理器与 Mali-400 MP2 GPU,并结合了 653,100 个逻辑单元与丰富的片上存储资源,可满足高性能计算、A…...
VSCode|IDEA|PyCharm无缝接入DeepSeek R1实现AI编程
文章目录 前言一、流程简介1. 获取DeepSeek R1的API密钥2. 在编程软件中下载安装 Continue 插件**IDEA**PyCharm 3. 配置Continue文件 二、使用体验利用 DeepSeek R1进行 AI 编程 前言 本文将介绍如何在 VSCode|IDEA|PyCharm 软件中接入 DeepSeek R1 实现 AI 编程,…...
深入浅出 PostgreSQL:从历史演进到高阶优化技术
引言 PostgreSQL 是一个免费开源的对象关系型数据库,既支持传统的 SQL 查询,也支持 JSON 等非关系数据类型,因其高度可扩展性和社区活跃度,已成为众多互联网、金融和企业级应用的首选数据库 (Introduction to PostgreSQL - W3Sch…...