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

【前端】es6相关,柯里化

0. 严格模式

严格模式的概念从ES6引进。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。

  1. MDN中严格模式的描述
    1. 严格模式通过抛出错误来消除了一些原有静默错误
    2. 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快
    3. 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法
  2. 使用方法
    1. 脚本最顶端放"use strict"
      1. 支持严格模式的引擎会启动这种模式
      2. 不支持该模式的引擎就当遇到了一个未赋值的字符串字面量,会忽略这个编译指示
    2. 函数中使用
      function striceExample(){"use strict";// 其他逻辑......
      }
      
    3. 现代ES6的代码,支持 classes 和 modules 高级语言结构,它们会自动启用 use strict。因此,如果我们使用它们,则无需添加 “use strict” 指令
  3. 严格和非严格的区别
    1. 严格模式下变量需声明才能用,否则报错“ReferenceError”
    2. 严格模式下禁止使用with语句
      因with语句无法在编译时确定属性归于什么对象,严格模式有利于编译效率提高
    // NOTE with的用意是逐级的对象访问,即在指定代码区域,通过节点名称调用对象;
    // 通常被当做重复引用同一个对象中的多个属性的快捷方式,可以不需要重复引用对象本身
    with(location){              console.log(href);}// 严格模式:抛出语法错误
    // p.s., with的应用场景
    let obj={a:1, b:2, c:3
    }
    // 修改obj的一般写法
    obj.a = 3;
    obj.b = 5;
    // 使用with的写法
    // 在with代码内部,每个变量首先被认为是一个局部变量,如果局部变量与 obj 对象的某个属性同名,则这个局部变量会指向 obj 对象属性。
    with(obj){a = 3;b = 4;c = 5;
    }// p.p.s, with的弊端// 1. 数据泄漏function foo(obj) {with (obj) {a = 5;}}var o1 = {a: 3};var o2 = {b: 3}foo(o1);console.log(o1.a);	//2foo(o2);console.log(o2.a);	//undefinedconsole.log(a);		//5,(由于o2传递)a被泄漏到全局作用域上。传递o2时,因为非严格模式下LHS找不到变量会创建全局变量,因此全局中会新建变量a// 2. 性能下降// JS若在代码中发现了with,只能简单地假设关于标识符位置的判断都是无效的,因为无法知道传递给 with 用来创建新词法作用域的对象的内容到底是什么。// 而优化依赖于静态分析。因此,无法分析的引擎可能不做优化,使代码运行变慢(eval()也会)
    
    1. 严格模式下创建eval作用域
    2. 严格模式下禁止this指向全局对象
    3. 严格模式下禁止在函数内部遍历调用栈
    4. 严格模式下无法删除变量
    5. 严格模式显示报错
    6. 严格模式下不允许对禁止扩展的对象添加新属性
    
    

1. this指向

1)绝大多数情况下,非箭头函数内部的this由调用者确定,即谁调用指向谁。
2)箭头函数的this取决于函数定义所在的上下文中this,即函数定义外部this是什么,箭头函数内部的this就是什么,相当于固化了当前执行环境中的this,注意不是函数定义所在的对象!
3)构造函数中的this指向新创建的对象
4)apply/call方式调用的函数,其this可以在调用时指定
5)bind函数可以将根据一个函数生成一个新的函数,并且该函数的this绑定到指定的对象上

  1. 一般情况,函数中的this指向函数的调用者
    p.s.没指定调用者,严格模式下this会是undefined,非严格模式下则是指向全局对象(Node环境中是global,浏览器环境中则是window)
// 调用者window
function demo1(){console.log(this)
}
// 调用者demo2
let demo2={log(){}
}
// 调用者setTimeout方法
var demo3= {log() {setTimeout(function print(){ // 给一个函数名方便理解console.log(this)},1000)}
}
  1. 构造函数中的this指向新对象
function Demo() {this.a = 1;console.log(this)
}
new Demo() // {a: 1}
  1. apply, call中的this指向target。
    此时,第一个参数理解为this=target,区别在于apply的第二个参数是将数组拆成一个个参数传入([1,2,3]变为log(1,2,3))、call将参数传入函数。
    p.s.非严格模式下,call的参数如果nullundefined,则指向全局;严格模式下,依然指向给定nullundefined
    p.p.s.,对箭头函数使用call或apply将不能指定this,因箭头函数的this在定义时已确定
function log() {console.log(this, arguments)
}var target = {a: 1}
log.apply(target, [1,2,3]) // {a:1} [1,2,3]
log.call(target, 1, 2, 3) // {a:1} [1,2,3]
  1. bind和箭头函数
    bind和箭头函数其实是一种,后者作为语法糖简化了bind。bind作用是绑定函数作用域但不立即执行。函数this在定义时就已确定,指向此时外层的this。
    p.s.若没有外层函数,在严格/非严格模式下都指向全局对象而非undefined。
"use strict"
function log() {console.log(this, arguments)
}var target = {a: 1}
log.bind(target)log(1, 2, 3) // {a:1} [1,2,3]
  1. arguments传参时的this:
    1. arguments是一个对象
    2. 由于js对象允许函数有不定数目的参数,所以有一种机制,可以在函数体内读取所有参数,即arguments对象的由来
    3. arguments包含运行时的参数,arguments[0]
    4. 定义
      1. callee属性:返回对应原函数
      var f = function() {console.log(arguments.callee===f);
      }
      f() 
      
      1. 通过
    5. 严格模式
      1. arguments对象与函数不具有联动关系,即修改不会影响到实际的函参
      var f = function(a, b) {'use strict'; // 严格arguments[0] = 3;arguments[1] = 2;return a+b;
      }
      f(1, 1)
      
      1. 命令接受一个字符串作为参数,语句执行
        1. `eval(‘var a=1;’)

        2. 静态分析阶段

        3. 1

    6. 相关代码
    var length = 10;
    function fn() {
    console.log(this.length);
    }var obj = { 
    method: function(fn) {fn();arguments[0]();
    }
    };obj.method(fn, 1); // 输出:10,2
    // 第一个值10,由fn()直接得到这里this指向的window。所以输出的值为最外层定义的length
    // 第二个值2,执行的是method里面的第二行"arguments0"(arguments0 => fn() ),这里this执行的是arguments这个对象,所以输出值为arguments的长度
    

2. 闭包

闭包是有权访问另一个函数作用域中变量的函数,即在函数内创建另一个函数。实际上闭包 = 里层函数+外层函数共同构成

let book = (function(){// 静态私有变量let bookNum = 0// 静态私有方法function checkBook(name){console.log(bookNum) // Closure闭包bookNum: 0}f()
})
  1. 闭包使用return的情况:外部需要引用闭包变量
let book = (function(){let bookNum = 0return function(){console.log(a)}
})
const fn = book()
fn()
  1. 应用情况:保证数据的私有,避免同名全局变量的影响;外部能使用但无法修改 -> 会引起内存泄漏,但还想在外部进行访问
    1)基本应用
function count(){let i=1function fn(){i++console.log(`函数被调用了${i}`) //注意不是''而是``}return fn
}
const fun = count() // Attention! Count()中的i被引用后不会被回收
fun() // 函数被调用了2次
i = 1000 //即使修改了i也不会影响到函数中

2)模仿块级作用域

// 计时器的应用
for (var i = 0; i < 10; i++) {(function (j) {setTimeout(function () {console.log(j);}, 1000 * j)})(i)
}
// 相当于闭包的基本格式
for (var i = 0; i < 10; i++) {function (j) {setTimeout(function () {console.log(j);}, 1000 * j)}return i
}// 打印一组li的下标
for(let i=0; i<lis.length; i++){(function(j){lis[j].onclick = function(){alert(kj)}})(i)
}

3)埋点计数器:网站中常用的数据采集方法

function count(){let num = 0return function(){return ++num}
}
// 第一个需要统计的地方
let getNum_1 = count()
// 第二个需要统计的地方
let getNum_2 = count()
// 若统计两个button的点击次数
document.querySelectorAll('common-btn')[0].onclick = function(){console.log('点击按钮1的次数:'+getNum());
}
document.querySelector('submit-btn').onclick = function(){console.log('点击按钮1的次数:'+getNum());
}

4)柯里化:将一个多参数转为单参数函数
  柯里化和类的区别:
  ① 柯里化是一种函数式编程技术,目前是将函数的参数分解为多个可部分应用的函数,以实现更灵活的函数组合
  ② 类是面向对象编程,以创建多个对象实例,每个实例都共享类的属性和方法
  方法不同,看上去相似

p.s. 关于性能消耗

柯里化通常涉及创建多个函数闭包,这可能会导致一些内存消耗。每个柯里化的函数都需要维护它自己的作用域和参数。但在许多情况下,这种额外的开销是微不足道的,不会显著影响性能。
类也涉及创建对象实例,每个实例都具有自己的属性和方法。这也会导致一些内存消耗,但这通常取决于类的复杂性和对象的数量。在某些情况下,类可能会更有效,因为它们利用了JavaScript引擎的原型继承机制(原型所有属性和方法能被实例对象共享),而不是每个对象都有自己的副本。
总的来说,性能差异通常不是决定柯里化和类之间选择的主要因素。更重要的是根据你的具体需求和代码结构来选择适当的编程技巧。优化性能通常需要更具体的优化策略,而不仅仅是选择柯里化或类。

// 原函数
function check(reg, txt){return reg.test(txt)
}
console.log(check(电话号码的正则,13923456789))
console.log(check(邮箱的正则,youxiang@163.com))// 更新
function nowCheck(reg){return function(txt){return reg.test(txt)}
}
var isPhone = nowCheck(电话号码的正则)
console.log(isPhone('13923456789'))
var isEmail = nowCheck(邮箱的正则)
console.log(isEmail('youxiang@163.com'))
2.1 类的基本方法和闭包
  1. 创建类的方法
// 方法1
// 1)首先声明一个函数,保存在变量里
// 2)在函数的内部通过对this变量添加属性/方法实现对类添加属性/方法
let AClass = function(id, name){// this和prototype创建的区别:每创建一个新对象时,this的方法会创建,而原型(链)不会this.id = idthis.bookName = name 
}// 方法2:在类的原型上添加属性和方法
// 1)选择1-单独为原型对象属性赋值
BClass.prototype.display = function(){}
// 2)选择2-将对象赋值给类的原型对象
BClass.prototype ={display: function(){}
}
  1. 抽象类、抽象类的原型和实际类的关系
    !js中,constructor只是抽象类原型的属性
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  2. 类进行属性和方法的封装【全】
    类具有3个部分,第一部分是构造函数内的(用于创建和初始化实例对象时使用的属性和方法),第二是构造函数外的、通过点语法对类添加的(只能类用,对象不能),第三是原型对象prototype(第一部分会成为prototype的constructor)
// 对象:类 => 【part 1. 构造函数内】
let AClass = function(id, name){// 私有属性和方法var num = 1function checkId(){}// this创建的:外部可访问// 对象公有属性this.id = id// 特权方法:能访问私有属性this.getId = function(){}// 对象公有方法:不能访问私有属性this.copy = function(){}this// 构造器,也是thisthis.setName(name)
}
// 类添加(对象不能访问) => 【part 2. 构造函数外】
AClass.isChinese = true // 类静态公有属性
AClass.resetTime = function(){} // 类静态公有方法
// prototype添加(对象可以访问),因新对象的prototype和类的prototype指向同一个对象 => 【part 3. 原型对象】
AClass.prototype = {// 公有属性isJS: true,// 公有方法display: function(){}
}

类的私有属性num和静态共有属性resetTime无法被新对象访问

  1. 闭包实现【全】
let Book = function(){if(){}else{}
}
  1. 用法
    1. includes用法
      1)数组
      includes能判断一个数组中是否涵盖某个元素,并返回true或false。
    ['a', 'b', 'c'].includes('a')
    
    可以含2个参数,第2个参数表示判断的起始位置;若
    2)字符串
    查找字符串是否包含"Runoob",
    let str = "Hello World"
    2.
2.2 创建对象的安全模式
  1. 没有使用new创建类的对象
    对象是undefined,而参数会添加到window上

    Why? new关键字可以看作当前对象this的赋值,但
// 图书类
let Book = function(title, time){this.title = titlethis.time = time
}
// 虚假的实例化
let aBook = Book('JS设计模式','2014') 
console.log(aBook) // undefined
console.log(window.title) // JS设计模式
  1. 限定只能使用new
    let winTool = function(){// 创建对象的安全模式:限定newif(this instanceof winTool){console.log('符合条件')}else{return new winTool()}// 其他设计}
    
2.3 继承
  1. 类式继承

3. 原型

3.1 基本概念
  1. 原型:每个对象都有prototype属性(隐式引用),称为原型
    1. 别称-原型对象:由于这个属性的值是对象,也成为原型对象
    2. 作用
      1. 存放属性和方法
      2. 在js中实现继承
        1. 基于原型链的继承
          1. JS对象是动态属性(自有属性)“包”
            1. 当试图访问对象属性时,
          2. JS: 有一个指向原型对象的“链”
            1. child.value
    3. 当前继承对象:继承“方法
    const parent = {value: 2,method() {return this.value+1;}}console.log(parent.method()) // 3// 当调用parent.method时,"this"指向parentconst child = {__proto__:parent // 继承parent对象}console.log(child.method()) // 3function Box(value) {this.value = value}// this值指向当前继承的对象,而非拥有该函数的原型对象// 构造函数:原型的强大之处,若一组应该出现在每个实例上const boxes = [{value: 1, getValue() {}},{value: 1, getValue() {}},{value: 1, getValue() {}}]child.value = 4; // 在child,将"value"属// JSconst boxPrototype = {getValue() {return this.value;}}const boxes = [{},{ },{}]
    
    1. 隐式引用的含义:ECMAScript 规范说 prototype 应当是一个隐式引用,通过Object.getPrototypeOf(obj) 间接访问指定对象的 prototype 对象而Object.setPrototypeOf(obj, anotherObj) 间接设置。部分浏览器提前开了 __proto__的口子,使得可以通过obj.__proto__直接访问原型,通过 obj.__proto__ = anotherObj直接设置原型。ECMAScript 2015 规范只好向事实低头,将__proto__属性纳入了规范的一部分。
    // 声明
    let obj = {a:1,b:}
    // 控制台看到的
    // a, b, __proto__
    
  2. 原型和原型链
const arr = new Array(1,2,3)
arr.reverse() // 翻转

相当于构造函数具有的原型Array.prototype中方法能给实例arr使用,此处arr.__proto指向Array.prototype,而Array.__proto指向更上一级的原型即Object.prototype,最终Object.prototype指向null。对象能使用该原型链之上的属性和方法。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2 原型链的应用
  1. 不污染对象的链式添加
    1) 函数调用方式
// 会污染Function:将checkEmail方法添加到所有的函数对象上,包括原生的函数对象和自定义的函数对象
Function.prototype.checkEmail = function(){// 逻辑
}
let f = function(){}
f.checkEmail
// 不污染Function:将方法添加到Function.prototype,、
Function.prototype.addMethod = function(name, fn){this[name] = fnreturn this // 实现链式添加
}
let f2 = function(){}
f2.addMethod('checkName', function(){}) // 非链式添加
f2.addMethod('checkPassword', function(){// 每个方法加上return this,实现链式调用 
}) .addMethod('checkEmail', function(){// return this
}) // 链式添加
f2.checkName()

2)类式调用

Function.prototype.addMethod = function(name, fn){this.prototype[name] = fn// 无需return this即可链式调用创建
}
let Method = function(){}
Method.addMethod('checkPassword', function(){}) .addMethod('checkEmail',function(){}) 
let m = new Method()
m.checkEmail()

3)函数的嵌套调用

UINT Fac(UINT nParam) {if(nParam < 2)return 1elsereturn nParam *Fac(nParam-1)
}

4)函数指针变量
指针变量可以指向一个函数,该函数在被编译时分配给一个入口地址。这个入口地址被称为函数指针,其一般形式为:类型(*函数指针变量名)(参数列表,…)

#include <stdio.h>
#include <windows.h>
typedef void (*FN_NOTIFY)(const char *pszMsg)
void Notify1(const char *pszMsg) {printf("Notify1:%s\n", pszMsg)
}
void Notify2(const char *pszMsg) {printf("Notify1:%s\n", pszMsg)
}

5)

3.3 原型链的应用

let age = 18;
let flag =

4. 函数的分类

函数分为一级函数、一阶函数、高阶函数、一元函数、柯里化函数、纯函数。

4.1 一级(等)函数

函数是第一类对象,一等函数表示该语言的函数可以被视为任何其他变量,像任何其他值一样处理:也就是说,它们可以在运行时被动态地分配给一个名称或符号。它们可以存储在数据结构中,通过函数参数传入,并作为函数返回值返回。

// 如以下分配给监听器的处理函数
const handler = () => console.log('???')
document.addEventListener('click', handler)
  1. addEventListener方法参数
    1. 方法参数
    const elem = document.getElementById('myElem')
    element.addEventListener('click', function() {console.log('Element clicked!')
    }, {capture: false,once: false,passive: false
    })
    
4.2.1 一阶函数

一阶函数是不接受另一个函数作为参数不返回函数作为其返回值的函数。

const firstOrder = () => console.log("I am a first order function!")
  1. 函数名
  2. 1
4.2.2 高阶函数

高阶函数是接受另一个函数作为参数或返回函数作为其返回值的函数,或二者兼有

  1. 参数的理解
  2. 箭头函数中的参数

5. ECMAScript

5.1 和JS的关系
  1. ECMAScript和JavaScript的关系
    1. ECMAScript:1996年11月,创造者Netscape公司
    2. JavaScript:
      1. 脚本语言轻量级script language:
        1. 不具备开发操作系统的能力
        2. 独立的数据类型
          1. 采用基于原型对象prototype的继承链
          2. JavaScript语言:解释器直接执行
      2. 嵌入式(embedded):
        1. JavaScript核心语法 - 轻量级的脚本语言,
        2. 循序渐进、由浅入深,
  2. 信息结构
    1. 观点信息
      1. 属性
        1. 通过获取大量信息
        2. 需要获取模式
        3. 而非记忆细节
      2. 处理方式
        1. 4速读方法
        2. 5图表法
    2. 过程信息
      1. 定义:知道人行
5.2 ES5
  1. 1
  2. 1
  3. 1
5.3 ES6引入的新特性
  1. 执行环境、作用域(Scope)和上下文(Context)
    1. 作用域基于函数\,上下文基于对象
    2. 执行环境(execution context->scope):JS单线程意味同时只能执行一个任务;当js解释器初始化时,默认进入全局执行环境
      1. 定义:偏向作用域
        1. 变量或函数有权访问的其他数据,决定行为
      2. 特点
        1. 每个函数都有自己的执行环境 - 每次调用都会创建新环境
        2. 环境会推入环境栈(execution stack)内
      3. 两个阶段
        1. 创建:每个执行环境都有一个变量对象(variable object/activation object)-执行环境中的变量函数声明参数组成,作用域会被初始化
          1. this也会被确定
          2. 只有解析器能访问
        2. 执行:解释执行
          1. 会创建作用域链(the scope chain):对execution context内所有变量函数的有序访问
            1. 执行上下文的词法环境,外部环境outer指向的词法
            2. 当前执行上下文的词法环境(在全局对象的属性a访问不到)会添加到作用域的最前端并递归处理外部,直到全局执行上下文-全局:最后一个结点
            3. 作用域:词法环境
            4. 全局都是作用域链的最后一个对象
            5. 查找变量时,沿着作用域链查找,找不到抛出ReferenceError(如let的块级作用域)
            6. 代码
             var color = "blue";function changeColor(){var anotherColor = "red";function swapColors(){var tempColor = anotherColor;anotherColor = color;color = tempColor;// 这里可以访问color, anotherColor, 和 tempColor}// 这里可以访问color 和 anotherColor,但是不能访问 tempColorswapColors();}changeColor();// 这里只能访问colorconsole.log("Color is now " + color);
            
    3. 作用域:涉及被调用函数的变量访问
      1. 函数外都是全局的!
        1. 任何定义的全局变量,意味着它要在函数体外部被声明
        2. 存活于整个运行时
      2. 在ES6前,JS不支持块级作用域
        1. ES5中,变量只有varfunction两种
          1. var将全局变量提升到作用域最顶端,内部则是函数作用域最顶端
        2. =在ifswitchforwhile循环中不支持块级
        3. ES6通过let定义变量,修正了var的缺点
          // ES5
          function func() {if(true) {var tmp = 123; }console.log(tmp); //123
          }// ES6
          function func() {if (true) {let tmp = 123;}console.log(tmp); // ReferenceError: tmp is not defined
          }
          
      3. this上下文:函数作为对象中一个方法被调用时,this是在该方法的对象
      var obj = {foo: function() {alert(this === obj);}
      }
      obj.foo(); // true 
      
      调用函数使用new操作符创建对象实例的情况下,作用域内this的值设为新创建实例
      4.
      5. 运行时(runtime)期间变量的不同作用域范围
    4. 上下文:this的值
  2. ES5和ES6的区别
    1. let和const关键字
      1. ES5只有var关键字声明变量,而ES6提供了let、const,二者都允许块级作用域,而var只有函数作用域
      2. ES6转为ES5:
      let tempFunc = 
      
    2. 箭头函数
      ES6提供了箭头函数,更简洁
      1. 外形不同:箭头函数用箭头定义,普通函数中没
      2. 普通函数:arguments对象
        1. 存储实际传递的参数
        2. 箭头没有arguments对象
        3. 也没有super、new.target
      3. 箭头函数都是匿名;普通函数可有匿名,或具名
      // 具名函数
      function xxx() { // 要执行的代码typeof 37 === 'number'typeof 3.14 === 'number'typeof Math.LN2 === 'number'
      }
      xxx() // 直接调用
      xxx.onclick = fn // 在事件中的调用
      // 匿名函数:没有名字,使用时只有两种情况
      // 1)匿名函数自执行
      (function(){console.log('匿名函数自执行')
      })() // 2)将函数存到变量
      function saveParams(a, b){return a + b
      }
      result = saveParams(3, 5)
      print(result)
      // 箭头函数
      let tmpFunc = () => {console.log(arguments)
      }
      tmpFunc()
      
      使用new Function
      let 函数名 = new Function('形参,形参1','函数体')
      // 定义
      var sayBye = new Function('console.log("bye!")')
      // 调用
      sayBye()
      // 
      window.name = '长袖'
      // 传参
      let func1 = function() {return this.name
      }
      let func2 = () => this.name
      let temp = {name: 
      }
      // 
      void Process(FN_NOTIFY pFn) {const int MAX_LOOP = 100
      }
      // 箭头函数
      var name = "长袖"
      let tempFunc = () => {console.log(this.name)
      }
      console.log(func1.call(temp))
      console.log(func1.call(temp))
      局部变量
      void foo(int i1, int i2) {int i3, i4;i3 = 3;i4 = 4;{int i3, i5;i3 = 3333;i5 = 5;cout << "in block:" << i3 << endl}
      }
      
      1. 箭头函数不能用于构造;普通可用于构造,创建对象实例
      
      
      1. 箭头函数没有this,其this通过作用域查到外层作用域的this,且指向函数定义时的this而非执行时
      2. 箭头函数不具有arguments对象,如果要用使用rest参数
      3. 箭头函数不具prototype原型对象,箭头函数不具super
      4. 箭头函数不能用yield命令,因此不能用作Generator函数
      5. 不能用call/apply/bind修改this指向,但能通过外层作用域的this间接修改
      6. 箭头函数没有arguments对象,不能用new,否则会报错
    3. 模板字符串(template string)
      ES6引入了模板字符串,允许在字符串中插入变量和表达式。即用反引号`标识,当普通字符串/定义多行字符串/在字符串中嵌入变量
    4. 解构赋值
      ES6引入了解构赋值,允许从数组/对象中提取值并付给变量

    5. ES6引入了类,使JS更面向对象
      1)
      2)
    6. Promise
      ES6引入Promise,提供一种更好的异步编程方式,用于处理异步
    7. 模块化
      ES6提供了标准的模块化方式,使JS开发更规范并易于维护

相关文章:

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式&#xff0c;可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷&#xff1a;有时…...

51单片机基础部分——矩阵按键检测

前言 上一节&#xff0c;我们说到了独立按键的检测以及使用&#xff0c;但是独立按键每一个按键都要对应一个IO口进行检测&#xff0c;在一些需要多按键的情况下&#xff0c;使用过多的独立按键会过多的占用单片机的IO资源&#xff0c;为了解决这个问题的出现&#xff0c;我们…...

onSaveInstanceState() 和 ViewModel 在数据保存能力差异

一、设计目标差异 ​​维度​​onSaveInstanceState()ViewModel​​核心目的​​保存 ​​瞬态 UI 状态​​&#xff08;如用户输入、滚动位置&#xff09;&#xff0c;应对进程意外终止或配置变更。管理 ​​业务逻辑相关数据​​&#xff0c;在配置变更时保留数据&#xff0…...

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…...

Java Fork/Join框架:三大核心组件深度解析

ForkJoinTask、ForkJoinWorkerThread 和 ForkJoinPool 构成了 Java 中 Fork/Join 框架的三个核心组件&#xff0c;它们之间形成了紧密的协作关系&#xff0c;共同提供了高效的并行计算能力。 三者关系概述 ForkJoinPool&#xff1a;执行环境&#xff0c;管理工作线程和任务调…...

【envoy】-1.安装与下载源码

1.安装 建议使用ubuntu2004&#xff0c;对glibc有要求。上个ti子更快。 wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg $ echo "deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/envo…...

B站的视频怎么下载下来——Best Video下载器

B站&#xff08;哔哩哔哩&#xff09;作为国内最受欢迎的视频平台之一&#xff0c;聚集了无数优质内容&#xff1a;动漫番剧、游戏实况、学习课程、纪录片、Vlog、鬼畜剪辑……总有那么些视频让人想反复观看、离线观看&#xff0c;甚至剪辑创作。 但你是否遇到过这样的烦恼&am…...

Mysql-定时删除数据库中的验证码

Moudle 1 使用调度器定时删除事件 数据库实现验证码自动删除的解决方案 -- 删除旧事件&#xff08;如果存在&#xff09; DROP EVENT IF EXISTS delete_expired_captchas;-- 创建新事件&#xff08;每分钟执行一次&#xff09; CREATE EVENT delete_expired_captchas ON SCHE…...

容器安全最佳实践:云原生环境下的零信任架构实施

&#x1f4cb; 目录 引言&#xff1a;容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…...

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…...

MySQL连接报SSL错误

问题&#xff08;cmd&#xff09; C:\Users>mysql -h xx.xx.xx.xx -u root -p Enter password: ERROR 2026 (HY000): SSL connection error: error:0A000102:SSL routines::unsupported protocol 解决方案 1. 临时禁用 SSL 连接&#xff08;不推荐生产环境使用&#xff0…...

在WPF项目中集成Python:Python.NET深度实战指南

随着Python在数据分析、机器学习、自动化等领域的广泛应用&#xff0c;越来越多的.NET开发者希望在WPF桌面应用中调用Python代码&#xff0c;实现两者优势互补。Python.NET&#xff08;pythonnet&#xff09;作为连接.NET与Python的桥梁&#xff0c;提供了强大的跨语言调用能力…...

Nuxt.js 布局系统详解:构建可复用页面框架

Nuxt.js 是一个基于 Vue.js 的强大框架&#xff0c;旨在简化开发流程并提高项目的可维护性。布局系统是 Nuxt.js 项目结构中的一个重要组成部分&#xff0c;它位于 layouts 目录下&#xff0c;帮助开发者实现页面间的统一风格和结构复用。 什么是 Nuxt.js 布局系统 Nuxt.js 提…...

CICD实战(二)-----gitlab的安装与配置

1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…...

[GitHub] 优秀开源项目

1 工具类 1.1 桌面猫咪互动 BongoCat...

Linux中su与sudo命令的区别:权限管理的关键差异解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)

低层协议&#xff08;Low Level Protocol, LLP&#xff09;详细解析 1. 低层协议&#xff08;Low Level Protocol, LLP&#xff09;核心特性 包基础 &#xff1a;基于字节的包协议&#xff0c;支持 短包 &#xff08;32位&#xff09;和 长包 &#xff08;可变长度&#xff0…...

第4天:RNN应用(心脏病预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…...

Python训练day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 展平操作&#xff1a;除第一个维度batchsize外全部展平 dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练…...

湖北理元理律师事务所:债务优化中的民生保障实践

在债务纠纷数量年增21%&#xff08;2023年最高人民法院数据&#xff09;的背景下&#xff0c;法律服务机构如何平衡债务清偿与民生保障&#xff0c;成为行业重要课题。湖北理元理律师事务所通过“法律金融心理”三维服务模式&#xff0c;探索出一条可持续的债务化解路径。 一、…...

Vue-Todo-list 案例

一、前言 在前端开发中&#xff0c;Todo List&#xff08;待办事项列表&#xff09; 是一个非常经典的入门项目。它涵盖了组件化思想、数据绑定、事件处理、本地存储等核心知识点&#xff0c;非常适合用来练习 Vue 的基本用法。 本文将带你一步步实现一个功能完整的 Vue Todo…...

GIC700概述

GIC-700是用于处理外设与处理器核之间&#xff0c;以及核与核之间中断的通用中断控制器。GIC-700支持分布式微体系结构&#xff0c;其中包含用于提供灵活GIC实现的几个独立块。 GIC700支持GICv3、GICv3.1、GICv4.1架构。 该微体系结构规模可从单核到互联多chip环境&#xff0…...

动静态库的使用(Linux)

1.库 通俗来说&#xff0c;库就是现有的&#xff0c;可复用的代码&#xff0c;例如&#xff1a;在C/C语言编译时&#xff0c;就需要依赖相关的C/C标准库。本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。通常我们可以在windows下看到一些后…...

Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析

你可能会认为&#xff1a;用了跨平台框架&#xff08;如 Flutter 或 React Native&#xff09;&#xff0c;开发效率提高了&#xff0c;发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时&#xff0c;现实给了我一巴掌&#xff1a; “没有 Mac&…...

统信桌面专业版如何使用python开发平台jupyter

哈喽呀&#xff0c;小伙伴们 最近有学员想了解在统信UOS桌面专业版系统上开发python程序&#xff0c;Anaconda作为python开发平台,anaconda提供图形开发平台,提供大量的开发插件和管理各种插件的平台&#xff0c;但是存在版权问题&#xff0c;有没有其他工具可以替代Anaconda呢…...

移除元素-JavaScript【算法学习day.04】

题目链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 第一种思路 标签&#xff1a;拷贝覆盖 主要思路是遍历数组 nums&#xff0c;每次取出的数字变量为 num&#xff0c;同时设置一个下标 ans 在遍历过程中如果出现数字与需要移除的值不相同时&#xff…...

Android 相对布局管理器(RelativeLayout)

俩重要属性 android:gravity android:ignoreGravity Android 相对布局管理器&#xff1a;自由排列的魔法布局 想象一下&#xff0c;你是一个室内设计师&#xff0c;需要在一个房间里摆放家具。RelativeLayout&#xff08;相对布局&#xff09;就像是一个 "自由摆放"…...

DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎

DuckDB 是一款令人兴奋的内嵌式分析型数据库 (OLAP)&#xff0c;它为本地数据分析和处理带来了前所未有的便捷与高效 &#x1f680;。它无需外部服务器&#xff0c;可以直接在应用程序进程中运行&#xff0c;并提供了强大的 SQL 支持和列式存储带来的高性能。 什么是 DuckDB&am…...

什么是预训练?深入解读大模型AI的“高考集训”

1. 预训练的通俗理解&#xff1a;AI的“高考集训” 我们可以将预训练&#xff08;Pre-training&#xff09; 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样&#xff0c;大模型在正式诞生前&#xff0c;也要经历一场声势浩大的“题海战术”…...

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…...