JavaScript 数组
创建数组
<script>
var 数组名 = new Array();
var 数组名 = []; //[] 为数组字面量
</script>
新增数组元素
修改数组索引
追加到新数组
newArr[newArr.length] = arr[i];
//冒泡
<script>
var arr = [2, 3, 6, 1, 7];
for (i = 0; i <= arr.length - 1; i++) {
for (j = 0; j <= arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
var str = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = str;
}
}
return arr;
}
console.log(arr);
</script>
JavaScript 函数
//1.利用关键字
function 函数名(){ //声明
函数体;
}
函数名(); //调用
//2.函数表达式
var 变量名 = function() {};
注意:变量里存的是值,函数表达式里存的是函数
形参:函数定义时候传递的参数
实参:函数调用的时候传递的参数
函数形参和实参个数不匹配问题
<script>
//函数形参实参个数匹配
function getSum(num1,num2) {
console.log(num1 + num2);
}
// 1.如果实参的个数和形参的个数一致则正常输出结果
getsum(1,2);
// 2.如果实参的个数多于形参的个数会取到形参的个数
getSum(1,2,3);
//3.如果实参的个数小于形参的个数,多余的形参定义为undefined 最终的结果就是NaN
//形参可以看做是不用声明的变量 num2是一个变量但是没有接收值结果就是undefined
getsum(1);// NaN
//建议我们尽量让实参的个数和形参相匹配
</script>
注意: 形参的默认值为undefined
return终止函数
- return 后面的代码不会执行
- return只能返回一个值,返回的是最后一个值
function fn(num1,num2) {
return num1,num2; // 只返回num2
}
- 返回多个值可以用数组来表示
//求任意两数 加与减的结果
function fn(num1,num2) {
return [num1 + num2, num1 - num2];
}
- 如果没有return 则返回 undefined
break、continue、return区别
- break :结束当前的循环体(如for、while )
- continue :跳出本次循环,继续执行下次循环(如for、while )
- return:不仅可以退出循环,还能够返回return语句中的值,同时还可以结束当前的函数体内的代码
arguments对象
当我们不确定有多少个参数传递的时候,可以用arguments来获取。
在JavaScript中,arguments实际上它是当前函数的一个内置对象。只有函数有arguments对象。 所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
arguments展示形式是一个伪数组,因此可以进行遍历。
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
伪数组具有以下特点:
- 具有length属性
- 按索引方式储存数据
- 不具有数组的push , pop等方法
//利用函数求任意个数的最大值
function getMax() {
var max = arguments[o];
for (var i = 1; i < arguments.length; i++){
if (arguments[i] >max){
max = arguments[i];
}
}
return max;
}
console.log(getMax(1,2,3));
案例翻转数组:
function reverse(arr) {
var newArr = [];
for (var i = arr.length - 1; i > 0; i--) {
newArr[newArr.length] = arr[i];
}
return newArr;
}
console.log(reverse([1, 2, 3, 4]));
作用域
es6之前:
全局作用域 - 全局变量 (如果在函数内部没有声明的变量 也是全局变量)
局部作用域 -局部变量(函数的形参也是局部变量)
function fn() {
var num1 = 1; // 局部变量 函数内部使用
num2 = 2; //全局变量 全局可使用
}
es6新增块级作用域:{},if{}、for{} 大括号里面的变量外部不能使用
区别:
全局变量全局使用,只有在浏览器关闭才会被销毁,比较占内存
局部变量只有所在的代码被执行才会被初识化,当代码结束时就会被销毁 更节约空间
作用域链:
采用就近原则,内部函数先访问外部函数的变量 链式查找逐渐访问上一级
var num = 10;
function fn() {
var num = 20;
function fun() {
console.log(num); // num = 20
}
}
预解析
JavaScript引擎运行js分为两步:1.预解析 2.代码执行
1.预解析js引擎会把js里面所有的 var还有 function 提升到当前作用域的最前面
2.代码执行按照代码书写的顺序从上往下执行
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
- 变量提升就是把所有的变量声明提升到当前的作用域最前面不提升赋值操作
- 函数提升就是把所有的函数声明提升到当前作用域的最前面不调用函数
注意:
function fn() {
var a = b = c = 9; //相当于 var a = 9; b=9; c=9; b和c直接赋值属于全局变量
var a =9,b =9,c =9; //属于局部变量
}