JavaScript
1.理解语言
<script>
alert('Hello world!');
</script>
此处的alert意为弹出对话提示框 Hello world!
编程语言和标记语言区别
- 编程语言有很强的逻辑和行为能力(if else、for、while等主动性语言)
- 标记语言(html)不用于向计算机发出指令,常用于格式化和链接,标记语言存在是用于读取(被动)
总结
- 计算机刻意帮助人类解决某些问题
- 编程语言发出指令控制计算机实现这些任务
- 编程语言有机器语言、汇编语言和高级语言
2. JavaScript基础
2. 1. JavaScript是什么
JavaScript是一种脚本语言,运行过程中由js解释器逐行解释并执行
JavaScript的作用
- 表单动态校验(密码强度检测,这也是JS最初的目的)
- 网页特效
- 服务端开发(Node.js)
- 桌面程序(Electron)
- App(Cordova)
- 控制硬件——物联网
- 游戏开发(cocos2d-js)
JavaScript与HTML/CSS语言的关系
HTML/CSS标记语言——描述类语言
- HTML决定网页结构和内容
- CSS决定网页呈现给用户的外观
JS脚本语言——编程类语言
- 实现业务逻辑和页面控制(决定功能)
2. 2. 浏览器执行JS简介
- 渲染引擎: 用来解析HTML与CSS,俗称内核(谷歌浏览器中的blink)
- JS引擎: 也称为JS解释器。用来读取网页JavaScript代码,对其处理后运行(chrome浏览器的V8)
注:浏览器本身并不会执行JS代码,而是通过JavaScript引擎执行JS代码,进行逐行解释
2. 3. JS的组成
ECMScript(JavaScript语法)、DOM(页面文档对象模型)、BOM(浏览器对象模型)
2. 4. JS的三种书写方式
1. 行内式JS
<input type="button" value="js脚本" onclick="alert('Hello world!')"/>
- 可以将单行或少量JS代码写在HTML标签的事件属性(以on开头的属性),如:onclick
- 注意单双引号的使用:在HTML中我们推荐使用双引号,JS中我们推荐使用单引号
- 可读性差,在html中编写JS大量代码时,不方便阅读
- 引号易错,引号嵌套匹配时,非常容易混乱
- 特殊情况使用
2. 内嵌JS
<script>
alert('Hello world!');
</script>
- 可以将多行JS代码写到
<script>
标签中 - 内嵌JS是学习时常用的方式
3. 外部JS文件
<script src="my.js"></script>
- 利于HTML页面代码结构化,把大段JS代码独立HTML页面外
- 引用外部JS文件的script标签中间不可以写代码
- 适用于JS代码量比较大的情况
2. 5. JavaScript注释
//单行注释
/*多行注释 ctrl+shift+/*/
2. 6. JavaScript输入输出语句
方法 | 说明 | 归属 |
---|---|---|
alert(msg) | 浏览器弹出警戒框 | 浏览器 |
console.log(msg) | 浏览器控制台打印输出信息(直接输入log可简写) | 浏览器 |
prompt(info) | 浏览器弹出输出框,用户可以输入 | 浏览器 |
2. 7. 变量
1. 变量概念
- 本质:变量是程序在内存中申请的一块用来存放数据的空间
2. 变量的使用
变量在使用时分为两步:
//声明变量
var age; //声明一个叫做age的变量,此处不赋初值,值为“undefined”
var myname='柯罗伊',address='长空'; //声明多个变量
age = 10; //将变量赋值为10
age = prompt('请输入您的年龄'); //覆盖变量的原有值,并且接受用户的输入值(即:更新变量)
- 特殊情况:
情况 | 说明 | 结果 |
---|---|---|
var age;console.log(age); | 只声明 不赋值 | undefined |
console.log(age); | 不声明 不赋值 直接使用 | 报错 |
age=10;console.log(age); | 不声明 只赋值 | 10 |
2. 8. 数据类型
1. 变量的数据类型
JavaScript是一种弱数据类型或者说是动态数据类型,这也就意味着其变量数据类型是不确定的。
var num; //此处不确定num类型
num=10; //此处确定num为数字类型
//js 的变量数据类型是在程序运行过程中,根据等号右边值才确定的
2. 数据类型的分类
JS把数据类型分为两类:
简单数据类型 | 说明 | 默认值 |
---|---|---|
Number | 数字型,包含整数和浮点数 | 0 |
Boolean | 布尔型 | false |
String | 字符串型 | “” |
Undefined | 声明变量却不赋值 | undefined |
Null | 声明变量值为null | null |
var num=10; //整型
var Num=21.3 //小数
- 数字表示
/*1.八进制*/
var num1=07; //对应十进制中的7
var num2=019; //对应十进制中的17
var num3=010; //对应十进制中的8
/*2.十六进制*/
var num=0xA;
/*3.数字型最值*/
console.log(Number.MAX_VALUE); //最大值*n(n>1)返回值为无穷大
console.log(Number.MIN_VALUE);
/*4.数字特殊值*/
alert(Infinity); //无穷大
alert(-Infinity); //无穷小
alert*(NaN); //非数值
- 数字语法
isNaN(num); //用于判断变量num是否为非数字,有返回值(bool)
var str='我正在学习'; //单引号和双引号均可
因为HTML标签属性使用双引号,所以JS我们通常使用单引号
转义字符串
一般与C++相同
转义符 | 解释 |
---|---|
\n | 换行 |
\\ | 反斜杠 |
\' | 单引号 |
\" | 双引号 |
\t | tab制表 |
\b | 空格 |
//1.使用lenth获取长度
var str='我正在学习';
console.log(str.length);
//2.字符串拼接
var age=19;
console.log('我'+age+'正在' + '学习' + 2021 + true); //此处显示了js具有隐式转换的功能,且和C++类似的,允许在输出中使用变量改变输出
<script>
console.log(true+1); //此处代码结果为2,表明优先转换为Number型
</script>
//1. undefined的操作
var variable = undefined; //未定义值可以直接赋值给予
console.log(undfined+' Marry'); //输出结果被隐式转换做字符串
console.log(undefined+1); //输出NaN
//2. Null的操作
var space = null;
console.log(space+' Marry'); //此处依旧强制转换字符串
console.log(space+1); //此处的值为1,可看作拷贝构造
3. 获取变量数据类型
var num=10;
console.log(typeof num); //获取num变量数据类型
var timer=null;
console.log(typeof timer); //但此处输出为object,被称作对象
var age=prompt('请输入你的年龄:');
console.log(typeof age); //此处的输出为string,和python结果类似
4. 数据类型转换
方式 | 说明 | 代码 |
---|---|---|
toString() | 转换字符串 | var num=1;alert(num.toString()); |
String() | 强制转换为字符串 | var num=1;alert(String(num)); |
+字符串 | 隐式转换为字符串(加号拼接后都是字符串) | var num=1;alert('str:'+num); |
方式 | 说明 | 代码 |
---|---|---|
parseInt(string) | 将字符串类型转换为整数型 | paeseInt('78') |
parseFloat(string) | 将字符串类型转换 | parseFloat('78.21') |
Number() | 将字符串类型强制转换为数值型 | Number('12') |
(- * /) | 三种运算符隐式转换为数值型 | ‘12’-0 |
//1. parseInt()函数
console.log(parseInt('3.14')); //3取整
console.log(parseInt('120px')); //去掉后面的字母转换成整数
console.log(parseInt('rem120px')); //得到NaN
//2. parseFloat()函数 与上述函数类似
//3. Number()函数
console.log(Number('12'));
//4. 利用算术运算 - * / 隐式转换
console.log('12'-0);
console.log('123'-'120'); //输出为3,说明算术运算是作为数字输出的
方式 | 说明 | 代码 |
---|---|---|
Boolean() | 其他类型转换成布尔值 | Boolean('true'); |
- 代表空、否定值会被转换为false,如:‘’、NaN、nill、undefined
- 其余值均会转换为true
2. 9. 标识符、关键字、保留字
1. 标识符
标识符:就是指开发人员为变量、属性、函数、参数取的名字
标识符不能是关键字或保留字
2. 关键字
关键字:是指JS本身已经使用了的单词,不能再使用它们充当变量名和方法名
例如:break,case,catch,continue,default,delete,do,else,finally,for,function,if,in,instanceof,new,return,switch,this,throw,try,typeof,var,void,while,with等
3. 保留字
其实质上就是预留的“关键字”,即:未来可能使用的“关键字”
例如:boolean,byte,char,const,debugger,double,enum,export,extends,final,float,goto,implements,import,int,interface,long,mative,package,private,protected,public,short,static,super,synchronized,throws,transient,volatile等
2. 10. JavaScript运算符
1. 运算符
运算符(operator)也称操作符,用于实现赋值、比较和执行算数运算等功能的符号。
JavaScript常用运算符:(此部分与C++类似)
概念:基本运算和数学运算相同
运算符 | 实例 |
---|---|
+ | 10+20=30 |
- | 10-20=-10 |
* | 10*3=30 |
/ | 10/20=0.5 |
% | 10%3=1 |
注:0.1+0.2结果与python相同,所以可能使用相同运算方法,小数运算有显著误差
表达式与返回值
表达式:由数字、运算符、变量等以能求得数值的有意义排列方法所得的组合
返回值:表达式最终返回的结果
前置运算:在执行前先 加一 或 减一
后置运算:在执行后先 加一 或 减一
概述:此运算基本与C++一致,均返回布尔值
运算符 | 说明 |
---|---|
< | 小于 |
> | 大于 |
>= | 大于等于 |
<= | 小于等于 |
== | 判断等于(此处先进行隐式转换,待数据类型相同才判断) |
!= | 不等号 |
=== !== | 全等 要求值与数据类型均相同 |
概述:用于多条件的判断(与C++相同)
逻辑运算符 | 说明 |
---|---|
&& | 与 |
` | |
! | 非 |
概述:赋予变量数据的运算符
赋值运算符 | 说明 |
---|---|
= | 直接赋值 |
+= -= *= /= %= | 重新赋值 |
优先级顺序:
括号、一元运算符、算术运算符、关系运算符、等号判断运算符、逻辑运算符、赋值运算符、逗号运算符
- 一元运算符里逻辑非优先级高
- 逻辑与比逻辑或优先级高
2. 11. JavaScript流程控制
-_-# 很像C++简单记下
流程控制:顺序、分支结构和循环结构。
顺序流程控制
顺序结构是程序中最简单、最基本流程控制,它没有特定的语法结构,程序会按照代码的先后顺序、依次执行,程序中大多数的代码就是这样执行的。
分支流程控制if语句
分支结构
if语句
//1. if 语法结构,当条件为true时,执行大括号语句
if (){
}
//2. if else语句(双分支语句)
if (){}
else {}
//3. if else if语句(多分支语句)(判断器)
if (){}
else if(){}
···
else {}
三元表达式
//1. 有三元运算符组成的式子
++num 3+5 ? :
//2. 语法结构
条件表达式 ? 表达式1 : 表达式2
//3. 执行思路
//若条件为真,则返回表达式1结果,否则表达式2
switch语句(选择器)
switch(表达式){
case [值1]:
[执行语句1];
break;
···
default:
[执行语句n];
}
//一般来说,当变量值不为空的时候,我们的[值]必须全等于(值和类型相同)表达式
if语句和switch语句区别
1.多分支时,switch语句选择效率更高,因为if语句是自上而下执行的
~2.分支少时,if else效率会更高~
循环流程控制
//1. for循环
for(变量初始化;条件表达;操作表达){
//循环命令语句
}
//2. while循环
while(条件表达式){
//循环命令语句
}
//3. do-while循环
do{
//循环命令语句
}while(条件表达式)
//4. continue和break
continue; //跳过本次循环
break; //退出循环
2. 12. 数组
数组:数组是一组数据的集合,其中各个数据被称为元素,在其中可存放任意类型的元素。
1. 数组的创建方式
- 利用new创建数组
var arr=new Array(); //创建空数组
注:Array()是特定命令
- 利用数组字面量创建数组
var 数组名=[元素1,元素2,···];
注:数组中可以存在任意类型例如:字符串、数字、布尔值等。
2. 数组中的元素
- 数组索引(与C++相同)
- 遍历数组
var array=[1,3,"12"];
//此处使用了 变量.length
for(var i=0;i<=array.length;i++){
console.log(array[i]);
}
- 数组中新增元素
1.通过修改length长度扩容
var arr=[2,3,5];
arr.length=5; //扩容至5,未赋值显示为empty(默认为undefined)
2.修改数组索引新增数组元素
var arr=[2,3,5];
arr[3]=4;
//而且,数组可被整体覆盖
arr="Array"; //这里将数组覆盖作字符串
2. 13. 函数
1. 函数的使用(与C++类似)
- 声明函数
//1. 函数关键字自定义函数
function 函数名(形参1,形参2,···){
//命令整体
}
//2. 函数表达式(匿名函数)
var 变量名=function(){
//命令整体
}
-
函数调用(与C++相同)
-
形参和实参的匹配
1.形参和实参个数一致,输出正常结果
2.实参个数多于形参,则自动忽略多余实参
3.实参个数少于形参,使用的形参值可看作undefined
-
函数返回值
1.有返回值,结果我们使用return语句返回
2.return语句,会终止函数运行
注:当我们函数返回值时,return结果为undefined
- arguments的使用
当我们不确定参数传递个数时,可以使用arguents获取。在JS中,它时函数的内置对象(所有函数均有),arguments存储了传递的所有实参,其实质也是数组。
2. 作用域(与C++类似)
作用域:作用域限制了变量和函数体在某一范围发挥作用,意在提高程序效率、减少命令冲突。
- 基本分类:
作用域分类:局部作用域和全局作用域
变量分类:局部变量和全局变量
注:全局变量较为占用资源,因为其只在关闭浏览器才清除
-
特殊:JS是没有块级作用域的
块级作用域相当于C++内的自定义的“{}”
-
作用域链:
内部函数可访问外部函数变量,可形成一段继承关系。
2. 14. JavaScript预解析
1. 预解析
JavaScript代码是浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码时,分两步:预解析和代码执行。
预解析:虽然程序是按顺序执行的,但是函数声明(function)和变量声明(var)会被提升到当前作用域最前面。
- 变量提升
此方式只提升变量声明,不提升赋值操作,但匿名函数不能实现此操作。
fun();
var fun=function(){
//
}
相当于:
var fun;
fun();
fun=function(){
//
} //所以无法正常运行
另外,也造成了:
var num=10;
fun();
function fun(){
console.log(num);
var num=20;
} //此代码结果为:undefined
- 函数提升
此方式只提升变量至作用域最前,并不直接调用
2. 15. JavaScript对象(与C++面向对象相似)
1. 对象
对象是一组无序的相关属性和方法的集合
对象是由属性和方法组成的。
- 属性:事物的特征
- 方法:事物的方法
使用原因:使JS中针对特定事物特性描述更清晰
2. 创建对象的三种方式
- 利用字面量创建对象
var obj0={}; //创建一个空对象
var obj={
uname:"Ken-ky",
age:18,
gender:man,
text: function(){
//函数命令
}
}
//这里采取的方法类似于python中的 键值对(键:属性名,值:属性)
//但是,调用的方式依旧是 对象名.属性名(方法名(实参)),另一方法为:对象名['属性名']
- 利用new Object创建对象
var obj=new Object(); //创建一个空的对象
obj.uname="Ken-ky";
obj.age=18;
obj.gender="man";
obj.text=function(){
//函数命令
}
- 利用构造函数创建对象(减少创建对象相同的属性重复步骤)
//利用函数的方法,重复这些相同属性代码
//构造函数将对象相似属性和方法抽象后封装
function 构造函数名(实参1,···){
this.属性名=值;
this.方法=function(){
//函数命令
}
}
var 对象名=new 构造函数名(实参1,···);
//1.构造函数名需要首字母大写
//2.构造函数不需要return语句就可返回对象
//3.实际上,使用console.log(对象);可以直接查询所有属性
3. new关键字
new关键字:
-
new创建对象的过程
1.new构造函数在内存里创建一个空对象
2.this指向空对象空间
3.给空对象添加属性和方法
4、返回此对象
-
遍历对象
//for in遍历对象内容
for(变量 in 对象){
//变量作为属性和方法名(键),对象名[变量] 得到值
}
4. 属性有无的判别
var o={
age:18
}
if(o['age']){
console.log('此对象有该属性');
}
else {
console.log('此对象不具有该属性');
}
2. 16. 内置对象
JavaScript中对象分为自定义对象、内置对象和浏览器对象。
内置对象是JS语言自带的对象,这些对象供开发者使用,并提供了基本而必要的功能(属性和方法)
Math,Date,Array,String等均为内置对象
1. 查询MDN文档
包含了HTML、CSS和万维网及HTML5应用的APL
MDN网址
2. Math对象
Math的属性和方法是静态的(固定的),而且其并不是构造函数,所以不需要使用new
//基本使用
Math.PI
Math.floor() //向下取整
Math.ceil() //向上取整
Math.round() //四舍五入
Math.abs() //取绝对值,会隐式转换,所以说结果可能是NaN
Math.max()
Math.min()
Math.random() //返回浮点随机数,值[0,1)
3. 日期对象
日期对象是一个构造函数,只能通过Date构造函数(new)实例化日期对象
//1. 不添加形参
var date=new Date(); //不输入形参就用当前时间创建
//2. 参数常用写法 数字型:2022,8,19 或 字符串型:'2022-8-19 22:50:30'和'2022/8/19'
var date1=new Date(2022,8,19); //此处使用的月份从0开始,所以显示为9月
var date2=new Date('2022-8-19 22:50:30');
- 日期格式化
方法名 | 说明 | 代码 |
---|---|---|
getFullYear() | 获取当年 | dObj.getFullYear() |
getMonth() | 获取当月(从0至11) | dObj.getMonth() |
getDate() | 获取当天日期 | dObj.getDate() |
getDay() | 获取星期几(从0至6) | dObj.getDay() |
getHours() | 获取当前小时 | dObj.getHours() |
getMinutes() | 获取当前分钟 | dObj.getMinutes() |
getSeconds() | 获取当前秒数 | dObj.getSeconds() |
function Time(){
var time=new Date();
var h=time.getHours();
var m=time.getMinutes();
var s=time.getSeconds();
h=(h>9?h:('0'+h));
m=(m>9?m:('0'+m));
s=(s>9?s:('0'+s));
return (h+':'+m+':'+s);
}
- 日期总的毫秒形式(时间戳)
Date对象基于1970年1月1日(世界标准时间)起的毫秒数
//1. 通过valueOf() getTime()
var date=new Date();
console.log(date.valueOf());
console.log(date.getTime());
//2. 简单的复现方式(最常用的方法)
var date1= +new Date(); //+new Date()返回的就是总的毫秒数
console.log(date1);
//3. H5新增方式
console.log(Date.now());
4. 数组对象
- 数组对象的创建方式(与数组创建相同)
1.字面量方式
2.new Array()var arr=[1,2,3];
var arr1=new Array(2); //创建长度为2的空数组 var arr2=new Array(2,3); //等价于[2,3]
-
检测是否为数组
1.instanceof 运算符:它可以用于检测对象是否为数组var arr=[]; console.log(arr instanceof Array); //返回布尔值,true代表类型相同
2.Array.isArray(参数) (此方法在H5新增需要IE9以上支持)
var arr=[]; console.log(Array.isArray(arr)); //此方法同样返回布尔值,且true代表与Array类型相同
- 添加或删除数组元素
方法名 | 说明 | 返回值 | 代码 |
---|---|---|---|
push(参数1,···) | 末尾添加一个或多个元素,修改原数组 | 并返回新的长度 | arr.push('元素1','元素n'); |
pop() | 删除数组最后一个元素。数组长度减1,且不需参数。修改原数组 | 返回删除元素的值 | arr.pop(); |
unshift(参数1,···) | 向数组开头添加一个或多个元素,修改原数组 | 返回新的长度 | arr.unshift('元素1','元素n'); |
shift() | 删除数组第一个元素,数组长度减1,不需参数,修改原数组 | 返回第一个元素值 | arr.shift(); |
- 数组排序
方法名 | 说明 |
---|---|
reverse() | 颠倒数组中元素的顺序,无参数,改变原数组 |
sort() | 对数组元素进行排序,改变原有数组 |
- 数组索引方法
方法名 | 说明 | 返回值 |
---|---|---|
indexOf() | 数组中查找给定元素的第一个索引 | 如果存在,则返回索引号;不存在,则返回-1 |
lastIndexOf() | 在数组中的最后一个索引 | 如果存在,则返回索引号;不存在,则返回-1 |
//返回数组元素索引号方法(只返回第一个满足条件值,从前往后)
var arr=['red','green','blue','pink'];
console.log(arr.indexOf('blue'));
//从后往前查找
console.log(arr.lastIndexOf('biue'));
- 数组转换字符串
方法名 | 说明 | 返回值 |
---|---|---|
toString() | 把数组转换成字符串,逗号分隔每一项 | 返回一个字符串 |
join(‘分隔符’) | 方法用于把数组所有元素转换为一个字符串 | 返回一个字符串 |
//1. toString()使用
var arr=[1,2,3];
console.log(arr.toString());
//2. join('分隔符')
var arr=[1,2,3];
console.log(arr.join(',')); //此处使用了逗号(实际上可以选用其他字符)
- 其他重要方法
方法名 | 说明 | 返回值 |
---|---|---|
concat() | 连接两个或多个数组,不影响原数组 | 返回一个新的数组 |
slice() | 数组截取slice(begin,end) | 返回被截取的新数组 |
splice() | 数组删除splice(begin,num) | 返回被删后的数组,会影响新的数组 |
5. 字符串对象(有相关算法)
概述:一般来说,只有复杂数据类型才会有属性和方法,但是字符串拥有很多属性,而这一特殊情况被称作基本包装类型。
- 基本包装类型
三个特殊的引用类型:String、Number和Boolean
//系统转换简单类型至复杂包装类型过程:
//1. 把简单数据类型包装为复杂数据类型
var temp=new String('Andy');
//2. 把临时变量的值 给str
str=temp;
//3. 销毁临时变量
temp=null;
-
字符串的不可变
指的是里面的值不可变,虽然看上去可以改变内容,但实际上是地址改变了,内存中重新开辟新空间。(原地址的值不变)
这也就决定了字符串本身不可变,操作完成后,返回新的字符串
-
根据字符返回位置
方法名 | 说明 | 返回值 |
---|---|---|
indexOf() | 数组中查找给定元素的第一个索引 | 如果存在,则返回索引号;不存在,则返回-1 |
lastIndexOf() | 在数组中的最后一个索引 | 如果存在,则返回索引号;不存在,则返回-1 |
//字符串对象里 根据字符返回位置 str.indexOf('要查找的字符',[起始位置])
var str='I have a dream!';
console.log(str.indexOf('a',3)); //从索引号为3位置开始向后查找
- 根据位置返回字符(重点)
方法名 | 说明 | 使用 |
---|---|---|
charAt(index) | 返回指定位置的字符(index字符串的索引号) | str.charAt(0) |
charCodeAt(index) | 获取指定位置处的字符ASCII码(index索引号) | str.charCodeAt(0) |
str[index] | 获取指定位置处的字符 | HTML5、IE8+支持和charAt()等效 |
//1. charAt(index) 返回对应位置字符
var str='andy';
for(var i=0;i<str.length;i++){
console.log(charAt(i));
}
//遍历字符串
//2. charCodeAt(index) 返回对应位置字符ASCII码
var str='andy';
console.log(charCodeAt(3));
- 字符串操作方法(重点)
方法名 | 说明 |
---|---|
concat(str1,str2,···) | 相当于“+”连接字符串 |
substr(start,length) | 从start位置开始(索引号),length取的个数 |
slice(start,end) | 从start位置开始,截取到end位置,end处不取 |
substring(start,end) | 从start位置开始,截取到end位置,end不取,但不接受负值 |
replace(‘old’,‘new’) | 将字符串某个字符替换为新字符(只替换第一个) |
splite(‘分隔符’) | 将字符串转换成数组 |
toUpperCase() | 转换大写 |
toLowerCase() | 转换小写 |
简单数据类型和复杂数据类型
1. 数据类型和内存分配
-
简单类型和复杂类型
简单类型又叫基本数据类型或者值类型,在存储时变量中存储的是值本身 string,number,boolean,undefined,null
复杂类型又叫做引用类型,在存储时变量存储的只是地址(引用) 通过new创建对象(系统对象、自定义对象):Object,Array,Date等
-
堆和栈
分配区别:
栈(操作系统):由操作系统自动分配释放存放函数参数值、局部变量的值等,其操作方式类似数据结构的栈 简单数据类型存放到栈中
堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由系统·自动释放 复杂数据存放到堆中
注:数组是由栈寻址到堆处对应
2. 参数传递(相当于指针和普通变量)
-
简单类型传参
函数的形参作为单独的一个变量,其在传递过程中,重新复制了值,所以方法内值的改变,不会影响方法外部值
-
复杂类型传参
函数的形参传递了地址,因此方法内改变,其实会影响方法外值