初识 JavaScript
JavaScript 是什么
- JavaScript (简称 JS)
- 是世界上最流行的编程语言之一
- 是一个脚本语言, 通过解释器运行
- 主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行.
- JavaScript 最初只是为了完成简单的表单验证(验证数据合法性), 结果后来不小心就火了.
- 当前 JavaScript 已经成为了一个通用的编程语言
JavaScript 的能做的事情:
- 网页开发(更复杂的特效和用户交互)
- 网页游戏开发
- 服务器开发(node.js)
- 桌面程序开发(Electron, VSCode 就是这么来的)
- 手机 app 开发
JavaScript 和 HTML 和 CSS 之间的关系
- HTML: 网页的结构(骨)
- CSS: 网页的表现(皮)
- JavaScript: 网页的行为(魂)
JavaScript 运行过程
- 编写的代码是保存在文件中的, 也就是存储在硬盘(外存上).
- 双击 .html 文件浏览器(应用程序)就会读取文件, 把文件内容加载到内存中(数据流向: 硬盘 => 内存)
- 浏览器会解析用户编写的代码, 把代码翻译成二进制的, 能让计算机识别的指令(解释器的工作)
- 得到的二进制指令会被 CPU 加载并执行(数据流向: 内存 => CPU)
- 渲染引擎: 解析 html + CSS, 俗称 "内核"
- JS 引擎: 也就是 JS 解释器. 典型的就是 Chrome 中内置的 V8
JavaScript 的组成
- ECMAScript(简称 ES): JavaScript 语法
- DOM: 页面文档对象模型, 对页面中的元素进行操作
- BOM: 浏览器对象模型, 对浏览器窗口进行操作
前置知识
第一个程序
<script>alert ( " 你好 !" );</script>
JavaScript 代码可以嵌入到 HTML 的 script 标签中.
JavaScript 的书写形式
1. 行内式
<input type = "button" value = " 点我一下 " onclick = "alert('haha')" >
2. 内嵌式
<script src = "hello.js" ></script>alert ( "hehe" );
注释
输入输出
输入: prompt
// 弹出一个输入框prompt ( " 请输入您的姓名 :" );
输出: alert
// 弹出一个输出框alert ( "hello" );
输出: console.log
// 向控制台输出日志console . log ( " 这是一条日志 " );
注意: 在 VSCode 中直接输入 "log" 再按 tab 键, 就可以快速输入 console.log
需要打开浏览器的开发者工具(F12) => Console 标签页 才能看到结果
变量的使用
基本用法
var name = 'zhangsan' ;var age = 20 ;
使用变量
console . log ( age ); // 读取变量内容age = 30 ; // 修改变量内容
eg:
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" );
理解 动态类型
var a = 10 ; // 数字var b = "hehe" ; // 字符串
2) 随着程序运行, 变量的类型可能会发生改变
var a = 10 ; // 数字a = "hehe" ; // 字符串
这一点和 C Java 这种静态类型语言差异较大.
基本数据类型
- number: 数字. 不区分整数和小数.
- boolean: true 真, false 假.
- string: 字符串类型.
- undefined: 只有唯一的值 undefined. 表示未定义的值.
- null: 只有唯一的值 null. 表示空值.
number 数字类型
数字进制表示
var a = 07 ; // 八进制整数 , 以 0 开头var b = 0xa ; // 十六进制整数 , 以 0x 开头var c = 0b10 ; // 二进制整数 , 以 0b 开头
特殊的数字值
- Infinity: 无穷大, 大于任何数字. 表示数字已经超过了 JS 能表示的范围.
- -Infinity: 负无穷大, 小于任何数字. 表示数字已经超过了 JS 能表示的范围.
- NaN: 表示当前的结果不是一个数字.
var max = Number . MAX_VALUE ;// 得到 Infinityconsole . log ( max * 2 );// 得到 -Infinityconsole . log ( - max * 2 );// 得到 NaNconsole . log ( 'hehe' - 10 );
console . log ( isNaN ( 10 )); // falseconsole . log ( isNaN ( 'hehe' - 10 )); // true
string 字符串类型
基本规则
如果字符串中本来已经包含引号咋办?
var msg = "My name is " zhangsan "" ; // 出错var msg = "My name is \"zhangsan\"" ; // 正确 , 使用转义字符 . \" 来表示字符串内部的引号 .var msg = "My name is 'zhangsan'" ; // 正确 , 搭配使用单双引号var msg = 'My name is "zhangsan"' ; // 正确 , 搭配使用单双引号
求长度
var a = 'hehe' ;console . log ( a . length );var b = ' 哈哈 ' ;console . log ( b . length );
结果:
42
字符串拼接
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 ); // 200console . log ( '100' + 100 ); // 100100
boolean 布尔类型
Boolean 参与运算时当做 1 和 0 来看待.
undefined 未定义数据类型
var a ;console . log ( a )
undefined 和字符串进行相加, 结果进行字符串拼接
console.log(a + "10"); // undefined10
undefined 和数字进行相加, 结果为 NaN
console.log(a + 10);
null 空值类型
var b = null ;console . log ( b + 10 ); // 10console . log ( b + "10" ); // null10
运算符
算术运算符
赋值运算符 & 复合赋值运算符
自增自减运算符
比较运算符
逻辑运算符
位运算
移位运算
条件语句
if 语句
基本语法格式
三元表达式
条件 ? 表达式 1 : 表达式 2
条件为真, 返回表达式1 的值. 条件为假, 返回表达式2 的值.
switch
循环语句
while 循环
while ( 条件 ) {循环体 ;}
- 先执行条件语句
- 条件为 true, 执行循环体代码.
- 条件为 false, 直接结束循环
continue
break
for 循环
for ( 表达式 1 ; 表达式 2 ; 表达式 3 ) {循环体}
- 表达式1: 用于初始化循环变量.
- 表达式2: 循环条件
- 表达式3: 更新循环变量.
- 先执行表达式1, 初始化循环变量
- 再执行表达式2, 判定循环条件
- 如果条件为 false, 结束循环
- 如果条件为 true, 则执行循环体代码.
- 执行表达式3 更新循环变量
数组
创建数组
// Array 的 A 要大写var arr = new Array ();
使用字面量方式创建 [常用]
var arr = [];var arr2 = [ 1 , 2 , 'haha' , false ]; // 数组中保存的内容称为 " 元素 "
注意: JS 的数组不要求元素是相同类型
获取数组元素
var arr = [ ' 小猪佩奇 ' , ' 小猪乔治 ' , ' 小羊苏西 ' ];console . log ( arr );console . log ( arr [ 0 ]);console . log ( arr [ 1 ]);console . log ( arr [ 2 ]);arr [ 2 ] = ' 小猫凯迪 ' ;console . log ( arr );
如果下标超出范围读取元素, 则结果为 undefined
新增数组元素
1. 通过修改 length 新增
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 进行追加元素
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 ]
函数
语法格式
// 创建函数 / 函数声明 / 函数定义function 函数名 ( 形参列表 ) {函数体return 返回值 ;}// 函数调用函数名 ( 实参列表 ) // 不考虑返回值返回值 = 函数名 ( 实参列表 ) // 考虑返回值
- 函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次.
- 调用函数的时候进入函数内部执行, 函数结束时回到调用位置继续执行. 可以借助调试器来观察.
- 函数的定义和调用的先后顺序没有要求. (这一点和变量不同, 变量必须先定义再使用)
关于参数个数
sum(10, 20, 30); // 30
2) 如果实参个数比形参个数少, 则此时多出来的形参值为 undefined
sum(10); // NaN, 相当于 num2 为 undefined.
函数表达式
var add = function () {var sum = 0 ;for ( var i = 0 ; i < arguments . length ; i ++ ) {sum += arguments [ i ];}return sum ;}console . log ( add ( 10 , 20 )); // 30console . log ( add ( 1 , 2 , 3 , 4 )); // 10console . log ( typeof add ); // function
作用域
- 全局作用域: 在整个 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 );// 执行结果10203010
创建变量时如果不写 var, 则得到一个全局变量
function test () {num = 100 ;}test ();console . log ( num );// 执行结果100
作用域链
- 函数可以定义在函数内部
- 内层函数可以访问外层函数的局部变量.
内部函数可以访问外部函数的变量. 采取的是链式查找的方式. 从内到外依次进行查找
var num = 1 ;function test1 () {var num = 10 ;function test2 () {var num = 20 ;console . log ( num );}test2 ();}test1 ();// 执行结果20
![](https://img-blog.csdnimg.cn/56c27056543e4462a4b09b698a6cbc32.png)
对象
基本概念
- 属性: 事物的特征.
- 方法: 事物的行为.
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 关键字.
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 关键字
JavaScript 的对象和 Java 的对象的区别
1. JavaScript 没有 "类" 的概念
2. JavaScript 对象不区分 "属性" 和 "方法"
3. JavaScript 对象没有 private / public 等访问控制机制.
4. JavaScript 对象没有 "继承"
![](https://img-blog.csdnimg.cn/ca192b989d3645988027dd46c5ac949f.png)
5. JavaScript 没有 "多态"
void add ( List < String > list , String s ) {list . add ( s );}
function add ( list , s ) {list . add ( s )}