JavaScript (简称 JS)
是世界上最流行的编程语言之一
是一个脚本语言, 通过解释器运行
主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行
一般认为,当时 Netscape 之所以将 LiveScript 命名为 JavaScript,是因为 Java 是当时最流行的
编程语言,带有 “Java” 的名字有助于这门新生语言的传播。
其实 Java 和 JavaScript 之间的语法风格相去甚远

这张图就非常生动的反映了Java和JavaScript的关系

这张图片也很好的反映了这个关系

JS是运行在浏览器上的
文档:网页(HTML就可以视为文档)
对象:浏览器把页面中的每个标签/元素都抽象成了一个对象,使用JS就可以直接拿到这些对象,也就可以基于JS来操作页面内容了
咱们这篇主要谈的是 DOM 和 JavaScript基本语法
<script>
// script 标签里的内容 就是JS代码
alert("你好!");
script>
JavaScript 代码可以嵌入到 HTML 的 script 标签中
从这个代码 我们可以获得下面的信息
// 和 /* */alert 是浏览器提供的函数,相当于BOM中的一个部分,效果是弹出一个对话框' ' 也可以使用" "
直接写到 script标签中
就是刚刚我们上面使用的
写到单独的文件中
这是实际开发中最主要的方式
<script src="hello.js">script>
alert("hehe");
注意:这种情况下 script 标签中间不能写代码. 必须空着(写了代码也不会执行).
适合代码多的情况
把JS代码直接嵌入到 html 标签里
<div onclick= "alert('就点你咋了')"> 点我就是小狗div>
注意:这个
onclick= "alert('就点你咋了')"是 div标签的属性(绝大部分的HTML标签都有这个属性)属性的值就是一段 JS 代码,里面不能放HTML,并且这段 JS 要使用
""引起来因此,如果JS里要使用字符串,建议使用
' ',否则需要用转义字符
输入: prompt
弹出一个输入框
// 弹出一个输入框
prompt("请输入您的姓名:");
弹出一个对话框, 输出结果
// 弹出一个输出框
alert("hello");
在控制台打印一个日志(供程序员看)
// 向控制台输出日志
console.log("这是一条日志");
注意:注意: 在
VSCode中直接输入 “log” 再按 tab 键, 就可以快速输入 console.log
重要概念: 日志
日志是程序员调试程序的重要手段
解释:
console是浏览器给JS提供的对象
.表示取对象中的某个属性或者方法. 可以直观理解成 “的”
console.log就可以理解成: 使用 “控制台” 对象 “的” log 方法
var name = 'zhangsan';
var age = 20;
var单纯的表示,这是一个变量这是支持类型自动推导的
JS变量的定义,还有另一种写法
var是老式写法,let是新式写法
let name = 'zhangsan';
let age = 20;
我们先介绍一下什么是动态类型
一个变量在运行过程中,类型可以发生改变,我们就称之为动态类型 (JS,Python,PHP)
如果不能发生改变,就称之为静态类型(C,C++,Java)
我们顺便也介绍一下强类型和弱类型
- 如果一个编程语言,不太支持隐式类型准换——强类型
- 如果一个编程语言,非常支持隐式类型准换 ——弱类型
网上很多人,把Java和 JS的语法差异归结为”强弱类型“,其实是不对的
其实语法差异大部分是”动态类型“带来的
反而弱类型强类型这个区别的语法差异不大
let a = 10; // 数字
let b = "hehe"; // 字符串
let a = 10; // 数字
a = "hehe"; // 字符串
数字number包含了整数和小数
特殊的数字值
字符串字面值需要使用引号引起来, 单引号双引号均可
JS里的字符串和Java很相似,也支持 ‘+’ 功能,即字符串的拼接功能
表示 “真” 和 “假”
Boolean 参与运算时当做 1 和 0 来看待
JS中特殊的类型
如果某个东西没有去定义或者初始化,直接去访问,那么一般不会报错,而是得到一个 undefined
undefined的值是undefined,类型也是undefined
示例:

console.log(a + "10"); // undefined10
console.log(a + 10);
null类型表示当前变量是一个空值
var b = null;
console.log(b + 10); // 10
console.log(b + "10"); // null10
注意:
null 和 undefined 都表示取值非法的情况, 但是侧重点不同.
null 表示当前的值为空. (相当于有一个空的盒子)
undefined 表示当前的变量未定义. (相当于连盒子都没有)
比较运算符
注意这个===
使用 new 关键字创建
// Array 的 A 要大写
let arr = new Array();
一般写代码不会用上面的方式创建数组,还有更简单的做法:
let arr = [1,2,3];
let arr2 = [1, 2, 'haha', false]; //JS中允许数组内容是不同类型
使用下标的方式访问数组元素(从 0 开始)
let arr = ['a', 'b', 'c'];
console.log(arr);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
arr[2] = 'd';
console.log(arr);
如果下标超出范围读取元素, 则结果为 undefined
console.log(arr[3]); // undefined
console.log(arr[-1]); // undefined
注意: 不要给数组名直接赋值, 此时数组中的所有元素都没了
相当于本来是一个数组, 重新赋值后变成字符串了
let arr = ['a', 'b', 'c'];
arr = 'd';
let arr = ['a', 'b', 'c'];
arr[-1] = 56;
arr[100] = 'hello';
arr['world'] = 5;
console.log(arr);

从这个示例中我们可以看出:
arr[100]赋值,则会多出中间97个undefined类型的元素
从以上我们可以看出,JS中的数组颠覆了我们对数组的认识
数组里存储的数据是两部分:
pushlet arr = [9, 5, 2, 7, 3, 6, 8];
let newArr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] % 2 != 0) {
newArr.push(arr[i]);
}
}
console.log(newArr);
var arr = [9, 5, 2, 7];
arr.splice(2, 1);// 第一个参数表示从下标为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
console.log(arr);
// 结果
[9, 5, 7]
var arr = [9, 5, 2, 7];
arr.splice(2, 1, 6);// 第一个参数表示从下标为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
console.log(arr);
// 结果
[9, 5 , 6, 7]
var arr = [9, 5, 2, 7];
arr.splice(2, 1, 6, 6, 6, 6, 6);// 第一个参数表示从下标为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
console.log(arr);
// 结果
[9, 5, 6, 6, 6, 6, 6, 7]
var arr = [9, 5, 2, 7];
arr.splice(2, 0, 6);// 第一个参数表示从下标为 2 的位置开始删除. 第二个参数表示要删除的元素个数是 1 个
console.log(arr);
// 结果
[9, 5 , 6, 2, 7]
// 创建函数/函数声明/函数定义
function 函数名(形参列表) {
函数体
return 返回值;
}
// 函数调用
函数名(实参列表) // 不考虑返回值
返回值 = 函数名(实参列表) // 考虑返回值
Java里面一个方法,只能返回一种类型的数据。约定了返回一个int,此时所有的return语句返回的结果都得是int类型!
JS里面则不要求.一个函数中,有多个return语句,这些return返回的类型可以不相同。包括函数形参,每个参数是啥类型,也是可以随意指定的

像这样也都是可以的
例如,想写一个函数,能够支持计算N个值相加

这里是6个参数,万一参数更多,或者想要任意个参数,咋办
JS函数的内部,有一个内置的变量 arguments 相当于一个数组,这个数组里放了所有的实参
function add(){
let sum = 0;
for(let i = 0; i< arguments.length; i++){
let n = arguments[i]||0;
sum += n;
}
return sum;
}
定义了一个匿名函数
创建了变量add,对add初始化,用一个函数对它初始化,add这个变量的类型,就是函数类型——function
这个设定就称为”函数是一等公民“
使用 let 定义的变量是 ”块级作用域“
是在当前 { } 里生效的
在使用某个变量的时候,就会先在当前{ }去找,如果找不到,就往外层{ }去找,一直找到最顶层还找不到,就认为变量未定义
从代码块里一级一级往外找变量的这个过程,称为”作用域链“
JS中的对象比Java中的要简单一些
JS中所有的对象都是Object类型,无论这个对象叫啥名字,有啥属性,都是相同类型。(此观点是站在传统的JS的语法的角度去考虑的,ES6开始也做出了一些区分)

我们写一个
对象里面的数据,就非常类似于”键值对结构“
每个键值对都是使用 , 来分割
键和值使用 : 来分割
值也可以是函数
定义好对象之后,就可以使用里面的属性和方法了
从这儿看,好像和 Java 没有啥区别,也是通过 . 来完成成员访问
上面这俩都比较旧,用的也不多,此处就不再赘述