【JavaEE】JavaScript

news2024/11/30 8:55:23

JavaScript

文章目录

    • JavaScript
      • 组成
      • 书写方式
        • 行内式
        • 内嵌式
        • 外部式(推荐写法)
      • 输入输出
      • 变量
        • 创建
        • 动态类型
        • 基本数据类型
          • 数字类型
            • 特殊数字值
          • String
          • 转义字符
          • 求长度
          • 字符串拼接
          • 布尔类型
          • undefined未定义数据类型
          • null
      • 运算符
      • 条件语句
          • if语句
          • 三元表达式
          • switch
      • 循环语句
        • while循环
        • continue
        • break
        • for循环
      • 数组
        • 创建数组
        • 获取数组元素
        • 新增数组元素
          • 1. 通过修改length 新增
          • 2.通过下标新增
          • 3. 使用 push 进行追加元素
        • 删除数组中的元素
      • 函数
        • 语法格式
        • 参数个数
        • 函数表达式
        • 作用域
        • 作用域链
      • 对象
        • 基本概念
        • 创建对象
          • 1.使用字面量创建对象[常用]
          • 2.使用new Object创建对象
          • 3.使用构造函数创建对象
          • 基本语法
        • new关键字
        • 对象
          • JavaScript的对象和Java的对象的区别
            • 1.JavaScript 没有类的概念
            • 2.JavaScript对象不区分"属性"和"方法"
            • 3.JavaScript对象没有private/public等访问控制机制.
            • 4.JavaScript对象没有"继承"
        • class关键字
        • static变量
        • 继承

JS运行通常是在浏览器上~

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=E%3A%5CTypora_note%5Cjavaweb%5CJavaweb.assets%5Cimage-

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

组成

  • ECMAScript(简称 ES): JavaScript 语法

  • DOM: 页面文档对象模型, 对页面中的元素进行操作

  • BOM: 浏览器对象模型, 对浏览器窗口进行操作

书写方式

行内式
    <input type="button" value="这是一个按钮" onclick="alert('哈哈哈哈哈')" name="" id="">
    <input type="button" value="这是一个按钮" onclick='alert("哈哈哈哈哈")' name="" id="">

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内嵌式
<script>
    alert('hhhhhhh')
</script>
外部式(推荐写法)
<body>
    <script src="./demo02.js"></script>
</body>
alert('我在学js')

输入输出

输入:prompt

// 弹出一个输入框
prompt("请输入您的姓名:");

输出:alert

// 弹出一个输出框
alert("hello");

输出:console.log

// 向控制台输出日志
console.log("这是一条日志");

变量

创建
var name = 'zhangsan';
var age = 20;
var name = "guagtouqiang"
console.log(name)
let age = 30
console.log(age)

letvar出现的晚,意味着避免了var这块定义变量的时候的一些缺陷,如果使用let定义变量,此时变量生命周期,作用域,基本上和Java一样。

JS定义变量的时候,不需要对变量指定类型

在JS中对于数字只有一种类型,数值类型

动态类型
  1. 什么是强类型变量,什么是弱类型变量?
  • 强类型变量:意味着不同类型之间变量进行赋值的时候,,需要进行一定的手段,即强制类型转换

  • 弱类型变量:在不同类型之间变量进行赋值的时候,可以直接赋值

<script>
    a=1
    b='b'
    b=a
    console.log(b)
</script>
  1. 什么是动态类型变量,什么是静态类型变量?
  • 动态类型变量:代码在执行过程中,变量类型可以随时发生变化
  • 静态类型变量:意味着定义的时候是什么类型,在运行过程中就是什么类型
script>
    a=1
    console.log(typeof(a))
    b='b'
    a=b
    console.log(typeof(a))
</script>
基本数据类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数字类型
let a = 10
    console.log(typeof(a))
    a = a / 3
    console.log(a)
    console.log(typeof(a))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特殊数字值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

var max = Number.MAX_VALUE;
// 得到 Infinity
console.log(max * 2);
// 得到 -Infinity
console.log(-max * 2);
// 得到 NaN
console.log('hehe' - 10);

注意:

  1. 负无穷大 和 无穷小 不是一回事. 无穷小指无限趋近与 0, 值为 1 / Infinity

  2. ‘hehe’ + 10 得到的不是 NaN, 而是 ‘hehe10’, 会把数字隐式转成字符串, 再进行字符串拼接.

  3. 可以使用 isNaN 函数判定是不是一个非数字.

console.log(isNaN(10));  // false
console.log(isNaN('hehe' - 10));  // true
String
var a = "haha";
var b = 'hehe';
var c = hehe;    // 运行出错
var msg = "My name is "zhangsan"";    // 出错
var msg = "My name is \"zhangsan\"";  // 正确, 使用转义字符. \" 来表示字符串内部的引. 
var msg = "My name is 'zhangsan'";    // 正确, 搭配使用单双引号
var msg = 'My name is "zhangsan"';    // 正确, 搭配使用单双引号
转义字符

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

求长度

使用 String 的 length 属性即可

var a = 'hehe';
console.log(a.length);
//4
var b = '哈哈';
console.log(b.length);
//2

单位为字符的数量

字符串拼接

使用 + 进行拼接

var a = "my name is ";
var b = "zhangsan";
console.log(a + b);

数字和字符串也可以进行拼接

var c = "my score is ";
var d = 100;
console.log(c + d);

认准相加的变量到底是字符串还是数字

console.log(100 + 100);     // 200
console.log('100' + 100);   // 100100
布尔类型

表示 “真” 和 “假”

Boolean 参与运算时当做 1 和 0 来看待

console.log(true + 1);
console.log(false + 1)
undefined未定义数据类型

如果一个变量没有被初始化过, 结果就是 undefined, 是 undefined 类型

var a;
console.log(a)

undefined 和字符串进行相加, 结果进行字符串拼接

console.log(a + "10");  // undefined10

undefined 和数字进行相加, 结果为 NaN

console.log(a + 10);
null

null 表示当前的变量是一个 “空值”.

var b = null;
console.log(b + 10);    // 10
console.log(b + "10");  // null10

注意

  • null 和 undefined 都表示取值非法的情况, 但是侧重点不同.

  • null 表示当前的值为空. (相当于有一个空的盒子)

  • undefined 表示当前的变量未定义. (相当于连盒子都没有)

运算符

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • == 比较的是变量的内容
  • ===比较的是内容+数据类型
let a = 10
let b  = "10"
alert(a == b)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

let a = 10
let b  = "10"
alert(a === b)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

条件语句

if语句

基本语法格式

条件表达式为 true, 则执行 if 的 { } 中的代码

// 形式1
if (条件) {
    语句
}
// 形式2
if (条件) {
    语句1
} else {
    语句2
}
// 形式3
if (条件1) {
    语句1
} else if (条件2) {
    语句2   
} else if .... {
    语句...
} else {
    语句N
}
三元表达式

是 if else 的简化写法.

条件 ? 表达式1 : 表达式2

条件为真, 返回表达式1 的值. 条件为假, 返回表达式2 的值.

注意, 三元表达式的优先级是比较低的.

switch
switch (表达式) {
    case1:
        语句1;
        break;
    case2:
        语句2:
        break;
    default:
        语句N;
}
// 用户输入一个整数, 提示今天是星期几
    var day = prompt("请输入今天星期几:>")
    switch (parseInt(day)) {
        case 1:
            console.log("星期一");
            break;
        case 2:
            console.log("星期二");
            break;
        case 3:
            console.log("星期三");
            break;
        case 4:
            console.log("星期四");
            break;
        case 5:
            console.log("星期五");
            break;
        case 6:
            console.log("星期六");
            break;
        case 7:
            console.log("星期日");
            break;
        default:
            console.log("输入有误");
    }

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

循环语句

while循环
while (条件) {
    循环体;
}
continue

结束这次循环

吃五个李子, 发现第三个李子里有一只虫子, 于是扔掉这个, 继续吃下一个李子

var i = 1;
while (i <= 5) {
    if (i == 3) {
        i++;
        continue;
   }
    console.log("我在吃第" + i + "个李子");
    i++;
}
我在吃第1个李子
我在吃第2个李子
我在吃第4个李子
我在吃第5个李子
break

结束整个循环

吃五个李子, 发现第三个李子里有半个虫子, 于是剩下的也不吃了.

var i = 1;
while (i <= 5) {
    if (i == 3) {
        break;
   }
    console.log("我在吃第" + i + "个李子");
    i++;
}
我在吃第1个李子
我在吃第2个李子
for循环
for (表达式1; 表达式2; 表达式3) {
 循环体
}

数组

创建数组

使用 new 关键字创建

// Array 的 A 要大写
var arr = new Array();

使用字面量方式创建 [常用]

var arr = [];
var arr2 = [1, 2, 'haha', false]; // 数组中保存的内容称为 "元素"

注意:JS 的数组不要求元素是相同类型

获取数组元素

使用下标的方式访问数组元素(从 0 开始)

var arr = ['小猪佩奇', '小猪乔治', '小羊苏西'];
console.log(arr);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
arr[2] = '小猫凯迪';
console.log(arr);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果下标超出范围读取元素, 则结果为 undefined

console.log(arr[3]);   // undefined
console.log(arr[-1]);  // undefined

注意: 不要给数组名直接赋值, 此时数组中的所有元素都没了.

相当于本来 arr 是一个数组, 重新赋值后变成字符串了.

var arr = ['小猪佩奇', '小猪乔治', '小羊苏西'];
arr = '小猫凯迪';
新增数组元素
1. 通过修改length 新增

相当于在末尾新增元素. 新增的元素默认值为 undefined

var arr = [9, 5, 2, 7];
arr.length = 6;
console.log(arr);
console.log(arr[4], arr[5]);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.通过下标新增

如果下标超出范围赋值元素, 则会给指定位置插入新元素

var arr = [];
arr[2] = 10;
console.log(arr)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时这个数组的 [0] 和 [1] 都是 undefined

3. 使用 push 进行追加元素

代码示例: 给定一个数组, 把数组中的奇数放到一个 newArr 中.

var arr = [9, 5, 2, 7, 3, 6, 8];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
    if (arr[i] % 2 != 0) {
        newArr.push(arr[i]);
   }
}
console.log(newArr);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

删除数组中的元素

使用 splice 方法删除元素

var arr = [9, 5, 2, 7];
// 第一个参数表示从下表为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
arr.splice(2, 1);
console.log(arr);
// 结果
[9, 5, 7]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目前这已经用到了数组中的一些属性和方法.

arr.length, length 使用的时候不带括号, 此时 length 就是一个普通的变量(称为成员变量, 也叫属性)

arr.push(), arr.splice() 使用的时候带括号, 并且可以传参数, 此时是一个函数 (也叫做方法)

函数

语法格式
// 创建函数/函数声明/函数定义
function 函数名(形参列表) {
    函数体
    return 返回值;
}
// 函数调用
函数名(实参列表)           // 不考虑返回值
返回值 = 函数名(实参列表)   // 考虑返回值
  • 函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次.
function hello() {
    console.log("hello");
}
// 如果不调用函数, 则没有执行打印语句
hello();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 调用函数的时候进入函数内部执行, 函数结束时回到调用位置继续执行. 可以借助调试器来观察.

  • 函数的定义和调用的先后顺序没有要求. (这一点和变量不同, 变量必须先定义再使用)

// 调用函数
hello();
// 定义函数
function hello() {
    console.log("hello");
}
function helloSb(num, name) {
        console.log(num + "hello" + name)
        return 1
    }
    // hello()
    let a = helloSb(1, "sb")
    console.log(typeof(a))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参数个数

实参和形参之间的个数可以不匹配. 但是实际开发一般要求形参和实参个数要匹配

  1. 如果实参个数比形参个数多, 则多出的参数不参与函数运算
sum(10, 20, 30);    // 30
  1. 如果实参个数比形参个数少, 则此时多出来的形参值为 undefined
sum(10);    // NaN, 相当于 num2 为 undefined.

JS 的函数传参比较灵活, 这一点和其他语言差别较大. 事实上这种灵活性往往不是好事

函数表达式

另外一种函数的定义方式

var add = function() {
 var sum = 0;
    for (var i = 0; i < arguments.length; i++) {
        sum += arguments[i];
   }
    return sum;
}
console.log(add(10, 20));            // 30
console.log(add(1, 2, 3, 4));        // 10
console.log(typeof add);             // function

此时形如 function() { } 这样的写法定义了一个匿名函数, 然后将这个匿名函数用一个变量来表示. 后面就可以通过这个 add 变量来调用函数了.

JS中的`arguments`是一个特殊的对象,在函数内部可以访问到。它包含了函数被调用时传递的所有参数。

`arguments`对象类似于一个数组,但它并不是一个真正的数组。它可以用类似于数组的方式访问函数参数的值,例如`arguments[0]`表示第一个参数,`arguments[1]`表示第二个参数,以此类推。

`arguments`对象还有一个`length`属性,用于获取传递给函数的参数数量。

此外,`arguments`对象还有一些附加的方法和属性,例如`arguments.callee`表示当前正在执行的函数自身,`arguments.caller`表示调用当前函数的函数,但在严格模式下,访问`arguments.callee``arguments.caller`会导致错误。

JS 中函数是一等公民, 可以用变量保存, 也可以作为其他函数的参数或者返回值

作用域

某个标识符名字在代码中的有效范围.

在 ES6 标准之前, 作用域主要分成两个

  • 全局作用域: 在整个 script 标签中, 或者单独的 js 文件中生效.

  • 局部作用域/函数作用域: 在函数内部生效.

// 全局变量
var num = 10;
console.log(num);
function test() {
    // 局部变量
     var num = 20;
    console.log(num);
}
function test2() {
    // 局部变量
    var num = 30;
    console.log(num);
}
test();
test2();
console.log(num);
// 执行结果
10
20
30
10

创建变量时如果不写 var, 则得到一个全局变量.

function test() {
 num = 100;
}
test();
console.log(num);
// 执行结果
100

另外, 很多语言的局部变量作用域是按照代码块(大括号)来划分的, JS 在 ES6 之前不是这样的.

if (1 < 2) {
 var a = 10;
}
console.log(a)
作用域链

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内部函数可以访问外部函数的变量. 采取的是链式查找的方式. 从内到外依次进行查找.

var num = 1;
function test1() {
    var num = 10;
    function test2() {
        var num = 20;
          console.log(num);
   }
    test2();
}
test1();
// 执行结果
20

执行 console.log(num) 的时候, 会现在 test2 的局部作用域中查找 num. 如果没找到, 则继续去 test1 中查找. 如果还没找到, 就去全局作用域查找.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对象

基本概念

对象是指一个具体的事物.

“电脑” 不是对象, 而是一个泛指的类别. 而 “我的联想笔记本” 就是一个对象.

在 JS 中, 字符串, 数值, 数组, 函数都是对象.

每个对象中包含若干的属性和方法.

  • 属性: 事物的特征.

  • 方法: 事物的行为.

例如, 你有一个女票.

她的身高体重三围这些都是属性.

她的唱歌, 跳舞, 暖床都是方法.

对象需要保存的属性有多个, 虽然数组也能用于保存多个数据, 但是不够好.

例如表示一个学生信息. (姓名蔡徐坤, 身高 175cm, 体重 170斤)

var student = [‘蔡徐坤’, 175, 170];

但是这种情况下到底 175 和 170 谁表示身高, 谁表示体重, 就容易分不清

JavaScript 的对象 和 Java 的对象概念上基本一致. 只是具体的语法表项形式差别较大.

创建对象
1.使用字面量创建对象[常用]
var a = {};  // 创建了一个空的对象
var student = {
    name: '蔡徐坤',
    height: 175,
    weight: 170t,
    sayHello: function() {
        console.log("hello");
   }
};
  • 使用 { } 创建对象

  • 属性和方法使用键值对的形式来组织.

  • 键值对之间使用 , 分割. 最后一个属性后面的 , 可有可无

  • 键和值之间使用 : 分割.

  • 方法的值是一个匿名函数.

使用对象的属性和方法:

// 1. 使用 . 成员访问运算符来访问属性 `.` 可以理解成 "的"
console.log(student.name);
// 2. 使用 [ ] 访问属性, 此时属性需要加上引号
console.log(student['height']);
// 3. 调用方法, 别忘记加上 () 
student.sayHello();
2.使用new Object创建对象
var student = new Object(); // 和创建数组类似
student.name = "蔡徐坤";
student.height = 175;
student['weight'] = 170;
student.sayHello = function () {
    console.log("hello");
}
console.log(student.name);
console.log(student['weight']);
student.sayHello();

注意, 使用 { } 创建的对象也可以随时使用 student.name = “蔡徐坤”; 这样的方式来新增属性.

3.使用构造函数创建对象

前面的创建对象方式只能创建一个对象. 而使用构造函数可以很方便 的创建 多个对象.

function Prople(name,height,weight){
        this.name= name
        this.height = height
        this.weight  =weight
        this.Say = function(){
            console.log(name + "fuck you")
        }
    }
    let ikun = new Prople("ikun", 1, 1)
    let cxk = new Prople("cxk", 2, 2)
    let xhz = new Prople("xhz", 3, 3)
    console.log(ikun)
    ikun.Say()
    console.log(cxk)
    cxk.Say()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例如: 创建几个猫咪对象

var mimi = {
    name: "咪咪",
    type: "中华田园喵",
    miao: function () {
        console.log("喵");
   }
};
var xiaohei = {
    name: "小黑",
    type: "波斯喵",
    miao: function () {
        console.log("猫呜");
   }
}
var ciqiu = {
    name: "刺球",
    type: "金渐层",
    miao: function () {
        console.log("咕噜噜");
   }
}

此时写起来就比较麻烦. 使用构造函数可以把相同的属性和方法的创建提取出来, 简化开发过程.

基本语法
function 构造函数名(形参) {
    this.属性 =;
    this.方法 = function...
}
    
var obj = new 构造函数名(实参);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用构造函数重新创建猫咪对象

function Cat(name, type, sound) {
    this.name = name;
    this.type = type;
    this.miao = function () {
        console.log(sound); // 别忘了作用域的链式访问规则
   }
}
var mimi = new Cat('咪咪', '中华田园喵', '喵');
var xiaohei = new Cat('小黑', '波斯喵', '猫呜');
var ciqiu = new Cat('刺球', '金渐层', '咕噜噜');
console.log(mimi);
mimi.miao();
new关键字

new 的执行过程:

  1. 先在内存中创建一个空的对象 { }

  2. this 指向刚才的空对象(将上一步的对象作为 this 的上下文)

  3. 执行构造函数的代码, 给对象创建属性和方法

  4. 返回这个对象 (构造函数本身不需要 return, 由 new 代劳了)

new关键字文档

对象
JavaScript的对象和Java的对象的区别
1.JavaScript 没有类的概念

对象其实就是 “属性” + “方法” .

类相当于把一些具有共性的对象的属性和方法单独提取了出来, 相当于一个 “月饼模子”

在 JavaScript 中的 “构造函数” 也能起到类似的效果.

而且即使不是用构造函数, 也可以随时的通过 { } 的方式指定出一些对象

在 ES6 中也引入了 class 关键字, 就能按照类似于 Java 的方式创建类和对象了.

2.JavaScript对象不区分"属性"和"方法"

JavaScript中的函数是"一等公民",和普通的变量一样.存储了函数的变量能够通过()来进行调用执行.

3.JavaScript对象没有private/public等访问控制机制.

对象中的属性都可以被外界随意访问,

4.JavaScript对象没有"继承"

继承本质就是"让两个对象建立关联”.或者说是让一个对象能的够重用另一个对象的属性方法
JavaScript中使用"原型"机制实现类似的效果,

class关键字
class People {
        constructor(name, height, weight) {
            this.name = name
            this.height = height
            this.weight = weight 
        }

        Say(){
            console.log(this.name + "唱跳rap篮球")
        }
    }

    let ikun = new People("ikun",175,75)
    console.log(ikun)
    ikun.Say()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

static变量
class People {
        constructor(name, height, weight) {
            this.name = name
            this.height = height
            this.weight = weight
        }

        Say() {
            console.log(this.name + "唱跳rap篮球")
        }
        static other = "other"
    }

    let ikun = new People("ikun", 175, 75)
    console.log(ikun)
    ikun.Say()

    alert(People.other)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

class People {
        constructor(name, height, weight) {
            this.name = name
            this.height = height
            this.weight = weight
        }

        Say() {
            console.log(this.name + "唱跳rap篮球")
        }
        static other = "other"
        static Sum(){
            return 100;
        }
    }

    let ikun = new People("ikun", 175, 75)
    console.log(ikun)
    ikun.Say()

    alert(People.other)
    alert(People.Sum())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这里不能ikun.Sum(),因为Sum()没有定义

继承
class People {
        constructor(name, height, weight) {
            this.name = name
            this.height = height
            this.weight = weight
        }

        Say() {
            console.log(this.name + "唱跳rap篮球")
        }
        static other = "other"
        static Sum(){
            return 100;
        }
    }

    let ikun = new People("ikun", 175, 75)
    console.log(ikun)
    ikun.Say()

    alert(People.other)
    alert(People.Sum())

    class Student extends People{
        constructor(name, height, weight,number){
            super(name,height,weight)
            this.number = number
        }
    }

    let student = new Student("cxk",188,70,22202012)
        console.log(student)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

class People {
        constructor(name, height, weight) {
            this.name = name
            this.height = height
            this.weight = weight
        }

        Say() {
            console.log(this.name + "唱跳rap篮球")
        }
        static other = "other"
        static Sum() {
            return 100;
        }
    }

    let ikun = new People("ikun", 175, 75)
    console.log(ikun)
    ikun.Say()
      
    alert(People.other)
    alert(People.Sum())

    class Student extends People {
        constructor(name, height, weight, number) {
            super(name, height, weight)
            this.number = number
        }
        Say() {
            alert(this.name)
        }
    }

    let student = new Student("cxk", 188, 70, 22202012)
    console.log(student)
    student.Say()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

至此,前端三件套的基本知识到此完结,接下来还会更新JavaScript的webAPI,敬请期待~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法|贪心算法系列No.3】leetcode334. 递增的三元子序列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

[C++_containers]10分钟让你掌握vector

前言 在一个容器的创建或是使用之前&#xff0c;我们应该先明白这个容器的一些特征。 我们可以通过文档来来了解&#xff0c;当然我也会将重要的部分写在下面。 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c; vector 也采用的连续存储空间来存储元…

picoctf_2018_shellcode

picoctf_2018_shellcode Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位&#xff0c;啥都没开 这个看着挺大的&#xff0c;直接来个ROPchain&#xff0c;…

Mapfree智驾方案,怎样实现成本可控?

整理|睿思 编辑|祥威 编者注&#xff1a;本文是HiEV出品的系列直播「智驾地图之变」第二期问答环节内容整理。 元戎启行副总裁刘轩与连线嘉宾奥维咨询董事合伙人张君毅、北汽研究总院智能网联中心专业总师林大洋、主持嘉宾周琳展开深度交流&#xff0c;并进行了答疑。 本期元…

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程

前言 今天是国庆节&#xff0c;我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言&#xff0c;那么学习一门语言&#xff0c;光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码&#xff0c;就要像C语言那样搭建起语言的编译环境&…

USART串口协议

通信接口 •通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 • 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 全双工&#xff1a;指通信双方能够同时进行双向通信&#xff0c;一般来说&#xff0c;全双…

扩容领跑者 Arbitrum 抢占 Layer3 竞争高地

近段时间以来&#xff0c;Arbitrum 凭借创新技术和优越生态系统逐渐成为顶尖的以太坊扩容解决方案。当新一轮 Layer3 竞争在 Rollup 领域展开时&#xff0c;Arbitrum 和 Optimism 始终是备受瞩目的两大角色。Optimism 以独特的 OP Stack 进行水平扩展&#xff0c;而 Arbitrum 则…

K-Means(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

shell脚本使用(宿主机windows-服务器-centos)--用于使用shell脚本方式控制docker容器

需求: 我想要使得windows上编写shell脚本&#xff0c;并且在这个shell脚本在linux中也可用 shell脚本在windows上无法直接运行&#xff0c;但是有WSL这个linux子系统的工具 可以使得shell脚本在主机上执行 视频讲解连接 https://www.bilibili.com/video/BV1Tw411Y7FP/方式1 …

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 Object.defineProperty(),对于这个方法&#xff0c;更多的还是停留在面试的时候&#xff0c;面试官问你vue2和vue3区别的时候&#xff0c;不免要提一提这个方法…

【VIM】VIm-plug插件

如何查找需要的插件 https://github.com/mhinz/vim-startify https://github.com/vim-airline/vim-airline https://github.com/Yggdroot/indentLine github.com/w0ng/vim-hybrid github.com/altercationi/vim-colors-solarized guithub.com/morhetz/gruvbox github.com/sc…

cesium 雷达扫描 (波纹线性雷达扫描效果)

cesium 雷达扫描 (波纹线性雷达扫描效果) 1、实现方法 使用ellipse方法加载圆型,修改ellipse中material方法来实现效果 2、示例代码 2.1 <!DOCTYPE html> <html lang="en"><head>&l

NSSCTF做题(3)

[鹤城杯 2021]EasyP 代码审计 <?php include utils.php; if (isset($_POST[guess])) { $guess (string) $_POST[guess]; if ($guess $secret) {//两个变量相等 $message Congratulations! The flag is: . $flag; } else { $message Wron…

java多线程相关介绍

1. 线程的创建和启动 在 Java 中创建线程有两种方式。一种是继承 Thread 类并重写其中的 run() 方法&#xff0c;另一种是实现 Runnable 接口并重写其中的 run() 方法。创建完线程对象后&#xff0c;调用 start() 方法可以启动线程。 2. 线程的状态 Java 的线程在不同阶段会处于…

计算机竞赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

牛客网_HJ2_计算某字符出现次数

HJ2_计算某字符出现次数 原题思路代码运行截图收获 原题 HJ2_计算某字符出现次数 思路 把输入的字符串和字符都变成大写或小写&#xff0c;然后逐一计数 代码 #include <cctype> #include <iostream> #include <string> #include <algorithm> usi…

Python3数据科学包系列(二):数据分析实战

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 一&#xff1a;通过read_table函数读取数据创建(DataFrame)数据框 #…

数据结构:复杂度分析

目录 1 算法效率评估 1.1 实际测试 1.2 理论估算 2 迭代与递归 2.1 迭代 1. for 循环 2. while 循环 3. 嵌套循环 2.2 递归 1. 调用栈 2. 尾递归 3. 递归树 2.3 两者对比 3 时间复杂度 3.1 统计时间增长趋势 3.2 函数渐近上界…

Unity HDRP Custom Pass 实现场景雪地效果

先使用Shader Graph连一个使用模型法线添加雪地的shader&#xff0c;并赋给一个material。 1.1 先拿到模型世界坐标下的顶点法线&#xff0c;简单处理一下&#xff0c;赋给透明度即可。 给场景添加Custom Pass&#xff0c;剔除不需要的层级。 1.在Hierarchy界面中&#xff…

Ps:选择高光阴影中间调的方法

素描中的三大面&#xff1a;明面、灰面及暗面&#xff0c;基本上可对应数字图像中的高光、中间调和阴影。选出数字图像的这三大区域&#xff0c;可快速进行分级调色。 说明&#xff1a; 在练习过程中&#xff0c;为了更清楚地识别选择的范围&#xff0c;可以建立一个从黑到白的…