【JavaScript】超全基础万字大总结

news2024/11/25 23:02:29

目录

一、初识 JavaScript  

1.1 JavaScript 是什么?

1.2 发展历史

1.3 JavaScript 和 HTML 和 CSS 之间的关系

1.4 JavaScript 运行过程

1.5 JavaScript 的组成

二、前置知识

2.1 第一个程序

 2.2 JavaScript 的书写形式

2.3 输入输出

 三、语法概览

3.1 变量的使用

3.2 理解动态类型

 3.3 基本数据类型

 string 字符串类型

转义字符

求长度

字符串拼接

boolean 布尔类型

undefined 未定义数据类型

null 空值类型

新增数组元素

 四、函数

4.1 语法格式

 4.2 关于参数个数

 4.3 函数表达式

4.4 作用域

4.5 作用域链

 五、对象

JavaScript 的对象和 Java 的对象的区别


一、初识 JavaScript 

1.1 JavaScript 是什么?

JavaScript ( 简称 JS)
  • 是世界上最流行的编程语言之一
  • 是一个脚本语言, 通过解释器运行
  • 主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行

 JavaScript 最初只是为了完成简单的表单验证(验证数据合法性), 结果后来不小心就火了.

当前 JavaScript 已经成为了一个通用的编程语言
JavaScript 的能做的事情:
  • 网页开发(更复杂的特效和用户交互)
  • 网页游戏开发
  • 服务器开发(node.js)
  • 桌面程序开发(Electron, VSCode 就是这么来的)
  • 手机 app 开发

1.2 发展历史

1995 年, JavaScript 之父 布兰登 * 艾奇 (Brendan Eich)
用 10 天时间完成 JS 的设计 ( 由于设计时间太短,语言的一些细节考虑得不够严谨,导致
后来很长一段时间, Javascript 写出来的程序混乱不堪 )
最初在网景公司 , 命名为 LiveScript, 一般认为,当时 Netscape 之所以将 LiveScript 命名为 JavaScript ,是因为 Java 是当时最流行的 编程语言,带有 "Java" 的名字有助于这门新生语言的传播。 其实 Java JavaScript 之间的语法风格相去甚远 .

 

 

 JavaScript 发展历史可以参考阮一峰大神的博客http://www.ruanyifeng.com/blog/2011/06/birth_of_javascript.html

1.3 JavaScript HTML CSS 之间的关系

  • HTML: 网页的结构()
  • CSS: 网页的表现()
  • JavaScript: 网页的行为()

HTML用于控制网页的结构,CSS用于控制网页的外观,JavaScript控制的是网页的行为。

很多同学可能不太清晰的了解这三者的关系。

HTML-----超文本标记语言,HTML是一门描述性语言。

CSS----层叠样式表,是用来控制网页外观的一种技术。

JavaScript----是一种嵌入到HTML页面中的语言,由浏览器一边解释一边执行。

我们用一种比喻来说明:咱们把制作网页来比作盖房子。

HTML就相当于钢筋水泥做出来的结构。

CSS比作粉刷、贴瓷砖等装修。

JavaScript就好比给房子通电,你按一下灯泡的开关,灯就亮了。

所以说:HTML用于控制网页的结构,CSS用于控制网页的外观,而JavaScript控制着网页的行为。

通过大脑的想像,大家对这三者的关系就有了更清晰的认知。

甚至你也可以想象这三者的关系是一只小鸟,HTML是没毛的鸟,加上CSS鸟就有了漂亮的羽毛,最后JavaScript就能让鸟儿飞起来。

在理解这三者关系后,熟悉基础语法,就能够编写静态页面了。
版权声明:此段为CSDN博主「爱学习滴小可桢」的原创文章

1.4 JavaScript 运行过程

  • 编写的代码是保存在文件中的, 也就是存储在硬盘(外存上).
  • 双击 .html 文件浏览器(应用程序)就会读取文件, 把文件内容加载到内存中(数据流向: 硬盘 => 内存)
  • 浏览器会解析用户编写的代码, 把代码翻译成二进制的, 能让计算机识别的指令(解释器的工作)
  • 得到的二进制指令会被 CPU 加载并执行(数据流向: 内存 => CPU)

 

浏览器分成渲染引擎 + JS 引擎 .
  • 渲染引擎: 解析 html + CSS, 俗称 "内核"
  • JS 引擎: 也就是 JS 解释器. 典型的就是 Chrome 中内置的 V8
JS 引擎逐行读取 JS 代码内容 , 然后解析成二进制指令 , 再执行

1.5 JavaScript 的组成

ECMAScript( 简称 ES): JavaScript 语法
DOM: 页面文档对象模型 , 对页面中的元素进行操作
BOM: 浏览器对象模型 , 对浏览器窗口进行操作
光有 JS 语法 , 只能写一些基础的逻辑流程 .
但是要想完成更复杂的任务 , 完成和浏览器以及页面的交互 , 那么久需要 DOM API BOM API. 这主要指在浏览器端运行的 JS. 如果是运行在服务端的 JS , 则需要使用 node.js API,
就不太需要关注 DOM BOM
重要概念 : ECMAScript
这是一套 " 标准 ", 无论是啥样的 JS 引擎都要遵守这个标准来实现 .
啥叫标准 ? 车同轨 , 书同文 . 秦始皇最大的贡献之一 , 就是制定了一套标准 .
三流公司做产品 , 一流公司做标准 .

二、前置知识

2.1 第一个程序

<script>
    alert("你好!");
</script>
JavaScript 代码可以嵌入到 HTML script 标签中 .

 2.2 JavaScript 的书写形式

2.2.1  行内式
直接嵌入到 html 元素内部
<input type="button" value="点我一下" onclick="alert('haha')">

注意, JS 中字符串常量可以使用单引号表示, 也可以 使用双引号表示.

HTML 中推荐使用双引号 , JS 中推荐使用单引号 .

 

2.2.2   内嵌式
写到 script 标签中
<script>
    alert("haha");
</script>

2.2.3 外部式

写到单独的 .js 文件中
<script src="hello.js"></script>
alert("hehe");

注意, 这种情况下 script 标签中间不能写代码. 必须空着(写了代码也不会执行).

适合代码多的情况.
注释
单行注释 // [建议使用 ]
多行注释 /* */
// 我是单行注释
/*
   我是多行注释
   我是多行注释
   我是多行注释
*/
使用 ctrl + / 切换注释 .
多行注释不能嵌套 . 形如这种代码就会报错

2.3 输入输出

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

输出: alert

弹出一个警示对话框, 输出结果

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

输出: console.log

在控制台打印一个日志 ( 供程序员看 )
// 向控制台输出日志
console.log("这是一条日志");

注意: VSCode 中直接输入 "log" 再按 tab , 就可以快速输入 console.log

需要打开浏览器的开发者工具 (F12) => Console 标签页 才能看到结果 .

 

重要概念 : 日志
日志是程序员调试程序的重要手段
去医院看病 , 医生会让患者做各种检查 , 血常规 , 尿常规 , B , CT ... 此时得到一堆检测结果 . 这些结果普通人看不懂, 但是医生能看懂 , 并且医生要通过这些信息来诊断病情 .
这些检测结果就是医生的 " 日志 "
PS: 相比于医生来说 , 程序猿多一个终极大招 , " 重启下试试 ".
重要概念 : .
console 是一个 js 中的 " 对象 "
. 表示取对象中的某个属性或者方法 . 可以直观理解成 " "
console.log 就可以理解成 : 使用 " 控制台 " 对象 " " log 方法 .

 

三、语法概览

 JavaScript 虽然一些设计理念和 Java 相去甚远, 但是在基础语法层面上还是有一些相似之处的.

有了 Java 的基础很容易理解 JavaScript 的一些基本语法 .

3.1 变量的使用

基本用法
创建变量 ( 变量定义 / 变量声明 / 变量初始化 )
var JS 中的关键字 , 表示这是一个变量 .
= JS 中表示 " 赋值 ", 相当于把数据放到内存的盒子中 . = 两侧建议有一个空格
每个语句最后带有一个 ; 结尾 . JS 中可以省略 ; 但是建议还是加上 .
注意 , 此处的 ; 为英文分号 . JS 中所有的标点都是英文标点 .
初始化的值如果是字符串 , 那么就要使用单引号或者双引号引起来 .
初始化的值如果是数字 , 那么直接赋值即可 .
使用变量
console.log(age); // 读取变量内容
age = 30;         // 修改变量内容
为啥动漫中的角色都是要先喊出技能名字再真正释放技能 ?
就是因为变量要先声明才能使用 .
代码示例 : 弹框提示用户输入信息 , 再弹框显示 .
var name = prompt("请输入姓名:");
var age = prompt("请输入年龄:");
var score = prompt("请输入分数");
alert("您的姓名是: " + name);
alert("您的年龄是: " + age);
alert("您的分数是: " + score);
也可以把三个输出内容合并成一次弹框
var name = prompt("请输入姓名:");
var age = prompt("请输入年龄:");
var score = prompt("请输入分数");
alert("您的姓名是: " + name + "\n" + "您的年龄是: " + age + "\n" + "您的分数是: " +
score + "\n");

3.2 理解动态类型

1) JS 的变量类型是程序运行过程中才确定的(运行到 = 语句才会确定类型)

var a = 10;     // 数字
var b = "hehe"; // 字符串

2) 随着程序运行, 变量的类型可能会发生改变.

var a = 10;    // 数字
a = "hehe";    // 字符串

这一点和 C Java 这种静态类型语言差异较大.

C, C++, Java, Go 等语言是静态类型语言 . 一个变量在创建的时候类型就确定了 , 不能在运行时发生改变. 如果尝试改变, 就会直接编译报错 .

 3.3 基本数据类型

JS 中内置的几种类型
  • number: 数字. 不区分整数和小数.
  • boolean: true , false .
  • string: 字符串类型.
  • undefined: 只有唯一的值 undefined. 表示未定义的值.
  • null: 只有唯一的值 null. 表示空值.

number 数字类型

JS 中不区分整数和浮点数, 统一都使用 "数字类型" 来表示.

数字进制表示
计算机中都是使用二进制来表示数据 , 而人平时都是使用十进制 .
因为二进制在使用过程中不太方便 (01 太多会看花眼 ).
所以在日常使用二进制数字时往往使用 八进制 和 十六进制 来表示二进制数字 .
var a = 07;      // 八进制整数, 以 0 开头
var b = 0xa;     // 十六进制整数, 以 0x 开头
var c = 0b10;    // 二进制整数, 以 0b 开头
特殊的数字值
  • Infinity: 无穷大, 大于任何数字. 表示数字已经超过了 JS 能表示的范围.
  • -Infinity: 负无穷大, 小于任何数字. 表示数字已经超过了 JS 能表示的范围.
  • NaN(Not a Number): 表示当前的结果不是一个数字.
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"';    // 正确, 搭配使用单双引号

转义字符

有些字符不方便直接输入 , 于是要通过一些特殊方式来表示 .
  • \n
  • \\
  • \'
  • \"
  • \t

求长度

使用 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 布尔类型

表示 " " " "
boolean 原本是数学中的概念 ( 布尔代数 ).
在计算机中 boolean 意义重大 , 往往要搭配条件 / 循环完成逻辑判断 .
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 表示当前的变量未定义 . ( 相当于连盒子都没有 )

 JS中的条件语句与Java类似,在此不做过多赘述

新增数组元素

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() 使用的时候带括号 , 并且可以传参数 , 此时是一个函数 ( 也叫做方法 )

 四、函数

4.1 语法格式

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

    • 调用函数的时候进入函数内部执行, 函数结束时回到调用位置继续执行. 可以借助调试器来观察.
    • 函数的定义和调用的先后顺序没有要求. (这一点和变量不同, 变量必须先定义再使用)
// 调用函数
hello();
// 定义函数
function hello() {
    console.log("hello");
}

 4.2 关于参数个数

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

1) 如果实参个数比形参个数多 , 则多出的参数不参与函数运算
sum(10, 20, 30);    //30
2) 如果实参个数比形参个数少 , 则此时多出来的形参值为 undefined
sum(10);    // NaN, 相当于 num2 为 undefined.
JS 的函数传参比较灵活 , 这一点和其他语言差别较大 . 事实上这种灵活性往往不是好事 .

 4.3 函数表达式

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
// 全局变量
var num = 10;
console.log(num);
function test() {
    // 局部变量
此时形如 function() { } 这样的写法定义了一个匿名函数 , 然后将这个匿名函数用一个变量来表示 .
后面就可以通过这个 add 变量来调用函数了 .
JS 中函数是一等公民 , 可以用变量保存 , 也可以作为其他函数的参数或者返回值 .

4.4 作用域

某个标识符名字在代码中的有效范围 .
ES6 标准之前 , 作用域主要分成两个
全局作用域: 在整个 script 标签中, 或者单独的 js 文件中生效.
局部作用域/函数作用域: 在函数内部生效.
 
// 全局变量
var num = 10;
console.log(num);
function test() {
    // 局部变量
    console.log(num);
}
function test2() {
    // 局部变量
    var num = 30;
    console.log(num);
}
test();
test2();
console.log(num);
// 执行结果
10
20
30
10
创建变量时如果不写 var, 则得到一个全局变量.另外 , 很多语言的局部变量作用域是按照代码块 ( 大括号 ) 来划分的 , JS ES6 之前不是这样的 .
if (1 < 2) {
 var a = 10;
}
console.log(a);

4.5 作用域链

背景:

  • 函数可以定义在函数内部
  • 内层函数可以访问外层函数的局部变量.
内部函数可以访问外部函数的变量 . 采取的是链式查找的方式 . 从内到外依次进行查找 .
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: 170,
   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. 使用 构造函数 创建对象
前面的创建对象方式只能创建一个对象 . 而使用构造函数可以很方便 的创建 多个对象 .
例如 : 创建几个猫咪对象
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 构造函数名(实参);

注意:

  • 在构造函数内部使用 this 关键字来表示当前正在构建的对象.
  • 构造函数的函数名首字母一般是大写的.
  • 构造函数的函数名可以是名词.
  • 构造函数不需要 return
  • 创建对象的时候必须使用 new 关键字.
this 相当于 " "
使用构造函数重新创建猫咪对象
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 代劳了 )
参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new

JavaScript 的对象和 Java 的对象的区别

1. JavaScript 没有 " " 的概念
对象其实就是 " 属性 " + " 方法 " .
类相当于把一些具有共性的对象的属性和方法单独提取了出来 , 相当于一个 " 月饼模子 "
JavaScript 中的 " 构造函数 " 也能起到类似的效果 .
而且即使不是用构造函数 , 也可以随时的通过 { } 的方式指定出一些对象
ES6 中也引入了 class 关键字 , 就能按照类似于 Java 的方式创建类和对象了 .
2. JavaScript 对象不区分 " 属性 " " 方法 "
JavaScript 中的函数是 " 一等公民 ", 和普通的变量一样 . 存储了函数的变量能够通过 ( ) 来进行调用执行 .
3. JavaScript 对象没有 private / public 等访问控制机制 .
对象中的属性都可以被外界随意访问 .
4. JavaScript 对象没有 " 继承 "
继承本质就是 " 让两个对象建立关联 ". 或者说是让一个对象能够重用另一个对象的属性 / 方法 .
JavaScript 中使用 " 原型 " 机制实现类似的效果 .
例如 : 创建一个 cat 对象和 dog 对象 , 让这两个对象都能使用 animal 对象中的 eat 方法 .
通过 __proto__ 属性来建立这种关联关系 (proto 翻译作 " 原型 ")

 

eat 方法被调用的时候,先在自己的方法列表中寻找, 如果找不到,就去找原型中的方法, 如果原型
中找不到, 就去原型的原型中去寻找 ...... 最后找到 Object 那里, 如果还找不到, 那就是未定义了。
关于原型链的内容比较复杂, 此处不做过多讨论

 

5. JavaScript 没有 " 多态 "
多态的本质在于 " 程序猿不必关注具体的类型 , 就能使用其中的某个方法 ".
C++ / Java 等静态类型的语言对于类型的约束和校验比较严格 . 因此通过 子类继承父类 , 并重写父类的方法的方式 来实现多态的效果.
但是在 JavaScript 中本身就支持动态类型 , 程序猿在使用对象的某个方法的时候本身也不需要对对象的类型做出明确区分. 因此并不需要在语法层面上支持多态 .
例如 :
Java 中已经学过 ArrayList LinkedList. 为了让程序猿使用方便 , 往往写作
List<String> list = new ArrayList<>()
然后我们可以写一个方法 :
void add ( List < String > list , String s ) {
list . add ( s );  
}
我们不必关注 list ArrayList 还是 LinkedList, 只要是 List 就行 . 因为 List 内部带有 add 方法 .
当我们使用 JavaScript 的代码的时候
function add ( list , s ) {
list . add ( s )
}
add 对于 list 这个参数的类型本身就没有任何限制 . 只需要 list 这个对象有 add 方法即可 . 就不必像 Java 那样先继承再重写绕一个圈子 .

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

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

相关文章

Linux(CentOS 7) 安装 Mysql8 、Java 以及 mycat2 详细流程

目录 一、Mysql8 安装 1.下载mysql8 2. 解压Mysql 压缩包 3.重名命mysql 文件 4.创建data文件夹 储存文件 5.创建用户组以及用户 6.授权用户 将mysql文件夹的所有者和所有组都改为mysql 7.mysql初始化进入bin目录执行mysqld文件进行初始化 8.编辑my.cnf 9.添加mysqld…

有哪些虚拟化和容器化工具推荐? - 易智编译EaseEditing

以下是几个常用的虚拟化和容器化工具推荐&#xff1a; VMware vSphere&#xff1a; VMware vSphere 是一套完整的虚拟化平台&#xff0c;包括虚拟化服务器、虚拟化存储和虚拟化网络。 它提供了高性能的虚拟机管理和资源调度功能&#xff0c;适用于企业级的虚拟化部署。 Docke…

IT知识百科:什么是跨站脚本(XSS)攻击?

跨站脚本&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者利用该漏洞在受害者的网页中插入恶意脚本&#xff0c;从而能够获取用户的敏感信息、劫持会话或进行其他恶意活动。本文将详细介绍跨站脚本攻击的原理、类型、常…

vue props传值层级多,子级孙子级怎么修改传参

vue props传值层级多了&#xff0c;子级孙子级怎么修改传参 1.出现背景2.怎么在孙组件里改变传过来的值呢2.1这样改是不行的2.2可行的方法2.2.1 引用对象只改变单属性2.2.2 provide和inject 1.出现背景 本来自己写页面的话是直接全部写在一个vue文件里&#xff0c;一个vue文件…

【solidworks】此文档 templates\gba0.drwdot 使用字体长仿宋体,而该字体不可用

一、问题背景 在SolidWorks中绘制工程图纸时&#xff0c;新建一个图纸&#xff0c;打开后就弹出字体错误 此文档 templates\gba0.drwdot 使用字体长仿宋体&#xff0c;而该字体不可用。 二、解决办法 点击选择新的字体&#xff0c;拖到最下面选择汉仪长仿宋体。 上面之所…

41 管理虚拟机可维护性-虚拟机NMI Watchdog

文章目录 41 管理虚拟机可维护性-虚拟机NMI Watchdog41.1 概述41.2 注意事项41.3 操作步骤 41 管理虚拟机可维护性-虚拟机NMI Watchdog 41.1 概述 NMI Watchdog是一种用来检测Linux出现hardlockup&#xff08;硬死锁&#xff09;的机制。通过产生NMI不可屏蔽中断&#xff0c;…

win10+tf2.x+cuda+cudnn踩坑记录( Loaded cuDNN version 8400)

项目场景&#xff1a; 项目用到了tensorflow2.x&#xff1a; 想要用GPU跑算法win10系统下需要安装cuda和cudnn配置带有tenserflow-gpu的环境 问题描述 jyputer运行错误提示&#xff1a;Loaded cuDNN version 8400 Could not locate zlibwapi.dll. Please make sure it is in…

智安网络|保护企业网络空间资产安全的重要性

在数字化时代&#xff0c;企业网络空间资产的安全和保护变得越来越重要&#xff0c;并且拥有安全性能优越、系统完整的企业网络系统&#xff0c;是企业发展的必要条件。但想要实现网络空间安全首先需要关注网络漏洞问题。 保护企业网络空间资产的重要性 网络空间资产安全是企…

【深度学习】跌倒识别(带数据集和源码)从0到1,内含很多数据处理的坑点和技巧,收获满满

文章目录 前言1. 数据集1.1 数据初探1.2 数据处理1.3 训练前验证图片1.4 翻车教训和进阶知识 2. 训练3.效果展示 前言 又要到做跌倒识别了。 主流方案有两种&#xff1a; 1.基于关键点的识别&#xff0c;然后做业务判断&#xff0c;判断跌倒&#xff0c;用openpose可以做到。…

Neural Architecture Search: A Survey

本文是神经架构搜索相关主题的第一篇文章&#xff0c;针对《Neural Architecture Search: A Survey》的一个翻译。 神经架构搜索&#xff1a;综述 摘要1 引言2 搜索空间3 搜索策略4 性能评估策略5 未来方向 摘要 过去几年&#xff0c;深度学习在图像识别、语音识别和机器翻译…

网络故障排除

计算机网络构成了数字业务的基础。为了确保业务连续性&#xff0c;需要日夜监控和管理这些网络背后的 IT 基础架构。IT 管理员在管理 IT 基础架构时经常遇到问题&#xff0c;这是他们工作的关键部分&#xff0c;更重要的部分是解决网络问题。 什么是网络故障排除 网络故障排除…

推动开源与商业共生共赢 | 2023开放原子全球开源峰会开源商业化创新发展分论坛即将启幕

开源具有利他性&#xff0c;专有软件或私有软件具有利己性&#xff0c;而开源的商业模式也具有利己性。利他性的开源与利己性的商业模式相结合&#xff0c;如何真正为开源做贡献&#xff1f; 由开放原子开源基金会主办&#xff0c;软通动力信息技术&#xff08;集团&#xff0…

【MySQL高级篇笔记-索引优化与查询优化(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引失效案例 二、关联查询优化 1、采用左外连接 2、采用内连接 3、join语句原理 1.驱动表和被驱动表 2.Simple Nested-Loop Join(简单嵌套循环连接) 3.Index Nested-Loop Join(索引嵌套循环连接) 4.Block Nested-Loop J…

【Web服务器】Nginx+Tomcat负载均衡、动静分离群集

文章目录 一、Tomcat 简介1. Tomcat 重要目录 二、Nginx 负载均衡1. Nginx 应用2. Nginx 负载均衡实现原理2.1 正向代理2.2 反向代理2.3 负载均衡原理总结2.4 配置方向代理的主要参数2.5 Nginx 代理转发类型 3. Nginx 负载均衡模式3.1 rr 轮询 负载均衡模式3.2 least_conn 最少…

优秀测试工程师简历要怎么写?为什么连面试都过不了?

目录 前言 简历请用数字化结果不要只是堆砌工作经历 简历一&#xff1a;我的工作内容有&#xff1a; 简历二&#xff1a;我的工作内容有&#xff1a; 千万别小瞧 了解你的过去是判断你未来的最好方式 增加好印象&#xff0c;记住这些小Tips 1&#xff09;了解公司的特点 2&…

sms开发文档

sms系统设计参考毕业设计-----------学生选课管理系统的设计 一、使用axios 来实现网页中ajax请求 首先说到axios&#xff0c;是一个类库&#xff0c;他的底层基于ajax库&#xff0c;通常用于ajax请求 ajax又是什么 ajax是一种创建快速动态网页的技术&#xff0c; 传统的页…

CiteSpace中心性\引文突现及S值和Q值含义

​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 中心性为0的解决方法 中文数据的作者&#xff0c;机构由于发文量太少&#xff0c;点过之后…

Linux:Mysql数据库的安装与简单部署。

涉及版本&#xff1a; 安装MySQL需要用到yum命令来安装。 但是yum的仓库内&#xff0c;并没有MySQL的压缩包&#xff0c;因此需要额外搞一个有MySQL的压缩包的远程yum仓库&#xff0c;进行安装MySQL。 想搞到这个yum仓库&#xff0c;就只能到网站下载。 5.7版本&#xff1a; …

Promise-用法

目录 1.处理异步的几种方案 2.理解 3.promise状态&#xff1a;初始化 4.执行异步任务 5.执行异步任务成功 6.执行异步任务失败 7.执行异步任务成功-返回 8.执行异步任务失败-返回 1.处理异步的几种方案 纯粹callback&#xff0c;会剥夺函数return的能力promise&#xf…

浅析kubernates的pv和pvc

文章目录 概要名词解释什么是Pod什么是StorgeClass静态PV和动态PVPV和PVC的生命周期 PVC &#xff0c; PV和 StorageClass的关系小结 概要 最近&#xff0c;在看许多Kubenates的相关文章的时候&#xff0c;了解到了一个概念&#xff0c;是我之前不清楚的。–PV&PVC 。那么今…