文章目录
1.for 循环语句
语法:
for(初始化表达式;条件表达式;更新表达式){
语句... ...
}
在执行时先执行初始化表达式(只会执行一次),初始化变量,再执行条件表达式,如果结果为true则执行循环,再循环结束后执行更新表达式,任何依次再次执行条件表达式,直到结果为false则跳出循环
for循环中的三个部分都可以省略不写(容易死循环)
2.break
可以为循环语句创建一个 label ,来标识当前循环
label :循环语句
使用 break 语句时,可用在 break 后跟着一个 label
这样 break 将会结束指定的循环,而不是最近的
例:
for1:
for(var i = 0;i<10;i++) {
console.log("###"+i);
for(var j = 0;j<10;j++) {
console.log("$$$"+j);
if(j==3){
break for1;
}
}
console.log("\n");
}
3.continue
continue 可以跳过当次循环
例:
for(var i = 0;i<5;i++) {
if(i==2){
continue;
}
console.log("###"+i);
console.log("\n");
}
同样 continue 也是默认只会对离他最近的循环起作用
并且也可以对 continue 设置label
4.console.time : 计时器
在测试程序的性能时,可以在程序执行前,开启计时器
console.time("计时器名字") //可以用来开启一个计时器
... ...
console.timeEnd("计时器名字") //可以用来停止一个计时器
它需要一个字符串作为参数,这个字符串将会作为计时器的标识
5.函数(function)
函数也是一个对象
函数中可以封装一些 功能(代码),在需要时可以执行这些功能(代码)
函数中可以保存一些代码在需要的时候调用
使用 typeof 检查一个函数对象时,会返回 function
创建一个函数对象
函数对象具有所以普通对象拥有的功能
var fun = new Function("console.log('Hello 这是我的第一个函数');");
封装到函数中的代码不会立即执行
函数中的代码会在函数调用的时候执行
当调用函数时,函数中封装的代码会按顺序执行
调用函数的语法:
函数对象 ( )
示例:
var fun = new Function("console.log('Hello 这是我的第一个函数');");
console.log(typeof fun);
for(var i=0;i<2;i++) {
console.log("这是第"+(i+1)+"次调用");
fun();
}
fun.gender = "男";
console.log(fun.gender);
用函数声明来创建一个函数对象
语法:
function 函数名 ([形参1,形参2,... ... ,形参n]){
语句
}
示例:
function fun1(){
console.log("这是一个函数");
for(var i=0;i<3;i++) {
console.log("i = "+i);
}
}
for(var i=0;i<3;i++){
console.log("这是第"+(i+1)+"次调用");
fun1();
}
使用函数表达式来创建一个函数
语法:
var 函数名 = function([形参1,形参2,... ... ,形参n]) {
语句... ...
}
示例:
var fun1 = function() {
console.log("这是一个函数");
for(var i=0;i<3;i++) {
console.log("i = "+i);
}
};
for(var i=0;i<3;i++){
console.log("这是第"+(i+1)+"次调用");
fun1();
}
6.函数的参数
可以在函数的()中来指定一个或多个形参
多个形参之间用逗号隔开,声明形参就相当于在函数内部声明了对应的变量,但是还没赋值
在调用函数时,可以在()指定实参
注意:调用函数时解析器不会检查实参类型
所以,要检查是否可能会接受到非法的参数,如果有可能则需对参数进行类型的检测
函数的实参可以是任意的数据类型
调用函数时,解析器也不会检查实参的数量,多余的实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参则是 Undefined
例如:
function sum(x,y){
alert(
"a = "+x+"\n"+
"b = "+y+"\n"+
"a + b ="+(x+y));
}
var a = +prompt("请输入a的值");
var b = +prompt("请输入b的值");
sum(a,b);
sum(100,"hello");
实参可以是任意数据类型,也可以是一个对象
当我们参数过多时,可以将参数封装到一个对象中,然后通过对象传递
function fun(o) {
console.log("我的名字是"+obj.name+",我今年"+obj.age+"岁了,我是一个"+obj.gender+"生,我目前住在"+obj.address);
};
function fun2(a) {
console.log("a = "+a);
a(obj);
}
var obj = {
name:"牛马",
age:19,
gender:"男",
address:"扬州通达"
};
fun2(fun);
7.函数的返回值
可以使用 return 来设置函数的返回值
return 后的值将会作为函数的执行结果返回
可以定义一个变量接受该结果,函数的返回值是什么,该变量的值就是什么
如果 return 后面没有跟值或者没有写 return,那么函数的返回值就是 Undefined
注意:在函数中 return 后的语句都不会执行
语法:
return 值;
function sum(a,b,c) {
return a+b+c;
}
for (var i = 0;i<3;i++){
var j= sum(i,2*i,3*i);
console.log("j = "+j);
}
使用 return 可结束整个函数
例如:
function fun() {
console.log("函数要开始执行了");
for(var i=0;i<5;i++){
console.log("i = "+i);
if(i==3){
return i;
}
}
console.log("函数已经执行完了");
}
var a = fun();
console.log("a = "+a);
函数的返回值可以是一个对象
例如:
function fun() {
var obj = {
name:"唐僧",
age:18,
gender:"女",
}
return obj;
}
var a = fun();
console.log(a.name);
8.立即执行函数
函数定义完,立即被调用,这函数叫做立即执行函数
立即执行函数往往只会执行一次
例如:
(function(){
for(var i=0;i<3;i++){
console.log("我是一个立即执行函数"+i);
}
})();
console.log("我应该是后面执行的");
立即函数自调用:
(function(a,b){
console.log("a = "+a);
console.log("b = "+b);
})(6,666);
# 12.作用域 作用域指的是一个变量的作用范围 在JS中有两种作用域 ## 1.全局作用域 直接编写在script标签中的JS代码,都在全局作用域中 全局作用域在我们页面打开时创建,在我们页面关闭时销毁 在我们全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,它由浏览器创建), 我们可以直接使用 在我们全局作用域中,我们创建的变量都会作为window对象的属性保存 全局作用域中的变量都是全局变量,在我们页面的任意部分都可以访问到
var a = 1;
var b = 2;
console.log(window.a);
console.log(window.b);
创建的函数都会作为window对象的方法保存
function fun(){
alert("我是fun函数");
}
window.fun();
变量的声明提前
使用var关键字声明的变量,会在所有代码执行之前被声明(但不会赋值)
但是声明变量时不适用var关键字,则变量不会被声明提前
fun();
fun2();
function fun(){
console.log("我是fun函数");
}
var fun2 = function(){
console.log("我是fun2函数");
}
函数的声明提前
使用函数声明形式创建的函数: function() { }
他会在所有的代码执行之前就被创建,所有我们可以在函数声明前来调用函数
使用函数表达式创建的函数,不会被提前声明,所以不能在声明前调用
2.函数作用域(局部作用域)
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
当在函数作用域操作一个变量时,他会现在自身作用域中寻找,如果有就直接使用,如果没有则向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中依旧没有找到,则会报错
也可以直接访问全局作用域的a。 例如:console.log("a = "+window.a);
在函数作用域中也有声明提前的特性,使用var关键字声明的变量,会在函数中所有的代码执行前被声明
函数声明也会在函数中的所有代码执行前执行
在函数中不使用var声明的变量都会成为全局变量
定义形参就相当于在函数作用域中用var声明了变量
9.数组(Array)
数组也是一个对象
他和我们普通的对象功能类似,也是用来存一些值的
不同的是普通对象是使用字符串作为属性名
而数组是使用数字索引来操作元素
索引:
从0开始的整数就是索引
数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据
向数组中添加元素
语法:
数组 [ 索引 ] = 值
读取数组中的元素
语法:
数组 [ 索引 ]
var arr = new Array();
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
console.log(arr);
console.log(arr[1]);
获取数组长度
语法:
数组.length
对于连续的数组,使用length可以获取到数组的长度(元素个数)
但对于非连续的数组,使用length会获取到数组的最大索引+1
还可以使用length设置数组长度
向数组最后一个位置添加元素
var arr = new Array();
arr[0] = 1;
arr[arr.length] = 2;
arr[arr.length] = 3;
arr[arr.length] = 4;
arr[arr.length] = 5;
arr[arr.length] = 6;
console.log(arr);
使用构造函数创建数组
使用构造函数创建数组时,也可以同封添加元素,将要添加的元素作文构造函数的参数传递,元素之间使用,隔开
var arr =new Array (10, 20, 30);
//创建一个长度为10的数组
var arr =new Array (10);
使用字面量创建数组
使用字面量创建数组时,可以在创建时就指定数组中的元素
var arr = [1,2,3,4,5,10];
数组中的元素可以是任意类型,包括函数,对象,数组…
arr = [ "he1lo",1,true, null, undefined,obj,[1,2,3],fun(){aleat(1)}];
push()
该方法可以向数组的末尾添加一个或多个元素,并返回敬组的新的长度,可以将要添加的元素作为方法的参数传递,这样这些元素将会自动添加到数组的末尾
pop()
该方法可以册除数组的最后一个元素,并将被删除的元素作为返回值回
unshift()
向数组开头添加一个或多个元素,并返回新的数组长度
向前边插入元素之后,其他的元素索引会依次调整
shift()
可以删除数组的第一个元素,并将被删除的元素作为返回值返回
var arr = [0];
arr.push("牛马","大牛马","小牛马","巨牛马");
console.log(arr);
console.log(arr.push());
console.log(arr.pop());
console.log(arr);
arr.unshift("特牛马");
console.log(arr);
console.log(arr.unshift());
console.log(arr.shift());
console.log(arr);
10.数组的遍历
所谓的遍历数组就是把数组中的所有元素都取出来
var arr = [1,2,3,4,5,6,7,8,9,10];
for(var i=0;i<arr.length;i++) {
console.log(arr[i]);
}
小练习:
创建Person构造函数的实例,并将这些实例放到一个数组之中
创建一个函数,可以将Person 中age 大于等于18 的Person 提取出来
然后封装到一个新的数组中,并返回
function Person(name,age){
this.name = name;
this.age = age;
}
var per1 = new Person("一号",18);
var per2 = new Person("二号",28);
var per3 = new Person("三号",8);
var per4 = new Person("四号",16);
var per5 = new Person("五号",38);
var per6 = new Person("六号",22);
var perArr = [per1,per2,per3,per4,per5,per6];
console.log(perArr);
function get(arr){
var newArr = [];
for(var i=0;i<arr.length;i++) {
if(perArr[i].age>=18){
newArr.push(perArr[i]);
}
}
return newArr;
}
console.log(get(perArr));