js08
-
条件分支语句也叫switch语句
- 语法:switch(条件表达式){case 表达式:语句...break;case 表达式:语句...break;default:语句...break;}
- 执行流程
- 在执行时会依次将case后的表达式的值和switch后的条件表达式的值进行全等比较
- 如果比较结果为true,则从当前case处开始执行代码
- 当前case后的所有代码都会执行,我们可以在case后边跟着一个break关键字
- 这样可以确保只会执行当前case后的语句,而不会执行其他的case
- 如果比较结果为false,则继续向下比较
- 如果所有的比较结果都为false,则只执行default后的语句
- switch语句和if语句的功能实际上有重复的,使用switch可以实现if的功能
- 同样使用if也可以实现switch的功能,所以我们使用时,可以根据自己的习惯选择
- 如果比较结果为true,则从当前case处开始执行代码
- 在执行时会依次将case后的表达式的值和switch后的条件表达式的值进行全等比较
-
循环语句
- 创建一个循环需要三步
- 初始化一个变量
- 在循环中设置一个条件表达式
- 定义一个更新表达式,每次更新初始化变量
- 通过循环语句可以反复的执行一段代码多次
- while循环
- 语法:while(条件表达式){语句...}
- while语句在执行时,先对表达式进行求值判断
- 返回值为true,则执行循环体
- 循环体执行完毕以后,继续对表达式进行判断
- 如果为true,则继续执行循环体,以此类推
- 返回值为false,则终止循环
- 返回值为true,则执行循环体
- 将条件表达式写死为true的循环,叫做死循环
- 该循环不会停止,除非浏览器关闭,死循环在开发中慎用
- 可以使用break,来终止循环
- do...while循环
- 语法:do{语句...}while(条件表达式)
- 执行流程:
- do...whlie语句在执行时,会先执行循环体,
- 循环体执行完毕以后,在对while后的条件表达式进行判断
- 结果为true,则继续执行循环体,执行完毕继续判断以此类推
- 结果为false,则终止循环
- 实际上这两个语句功能类似,不同的是while是先判断后执行,而do...while会先执行后判断
- do...while可以保证循环体至少执行一次,而while不能。
- 创建一个循环需要三步
-
prompt()可以弹出一个提示框,该提示框中会带有一个文本框
-
用户可以在文本框中输入一段文字,该函数需要一个字符串作为参数
-
该字符串将会作为提示框的提示文字
-
用户输入的内容将会作为函数的返回值返回,可以定义一个变量来接受该内容
-
while (true) { //score就是小明的期末成绩 var score = prompt("请输入小明的期末成绩(0-100):"); //判断用户输入的值是否合法 if (score >= 0 && score <= 100) { //满足该条件则证明用户的输入合法,退出循环 break; } alert("请输入有效的分数!!!"); } //判断值是否合法 if (score > 100 || score < 0 || isNaN(score)) { alert("~~~"); } else {拉出去毙了 //根据score的值来决定给小明什么奖励 if (score == 100) { //奖励一台宝马 alert("宝马,拿去~~~"); } else if (score >= 80) { //奖励一个手机 alert("手机,拿去玩~~~"); } else if (score >= 60) { //奖励一本参考书 alert("参考书,拿去看~~~"); } else { alert("棍子一根~~"); } }
-
-
for循环语句
- 在for循环中,为我们提供了专门的位置用来放三个表达式
- 初始化表达式
- 条件表达式
- 更新表达式
- 语法for(初始化表达式;条件表达式;更新表达式){语句}
- for循环的执行流程
- 执行初始化表达式,初始化变量(初始化表达式只会执行一次)
- 执行条件表达式,判断是否执行循环
- 如果条件为true,则执行循环
- 如果为false,终止循环
- 执行更新表达式,更新表达式执行完毕继续重复
- for循环中的三个部分都可以省略,也可以写在外部
-
如果在for循环中不写任何的表达式,只写两个;
-
此时循环是一个死循环会一直执行下去,慎用
-
for(;;){alert('hello')};
-
//创建一个执行10次的while循环 //初始化表达式 /*var i = 0; //创建一个循环,定义条件表达式 while(i < 10){ //设置更新表达式 alert(i++); }*/ for (var i = 0; i < 10; i++) { alert(i); }
-
- 在for循环中,为我们提供了专门的位置用来放三个表达式
-
break和continue
-
break关键字可以用来退出switch或循环语句
- 不能在if语句中使用break和continue
- break关键字,会立即终止离他最近的那个循环语句
-
特殊用法:
-
可以为循环语句创建一个label,来标识当前的循环
-
label:循环语句
-
使用break语句时,可以在break后跟一个label
-
这样break将会结束指定的循环,而不是最近的
-
outer: for(var i=0 ; i<5 ; i++){ console.log("@外层循环"+i) for(var j=0 ; j<5; j++){ break outer; console.log("内层循环:"+j); } }
-
-
continue关键字可以用来跳过当次循环
- 同样continue也是默认只会对离他最近的循环起作用
-
-
测试程序性能的方式
-
在程序执行前,开启定时器
-
console.time("计时器的名字")可以用来开启一个定时器
-
他需要一个字符串作为参数,这个字符串将会作为计时器的标识
-
console.timeEnd()用来停止一个计时器,需要一个计时器的名字作为参数
-
console.time("test"); //打印2-100之间所有的数 for (var i = 2; i <= 100000; i++) { var flag = true; for (var j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { //如果进入判断则证明i不是质数,修改flag值为false flag = false; //一旦进入判断,则证明i不可能是质数了,此时循环再执行已经没有任何意义了 //使用break来结束循环 break; //不加break 215ms //加break 25ms //修改j<=后 2.6 } } //如果是质数,则打印i的值 if (flag) { //console.log(i); } }
-
js09
-
JS中的数据类型
- String 字符串
- Number 数值
- Boolean 布尔值
- Null 空值
- Undefined 未定义
- 以上五种类型属于基本数据类型,以后我们看到的值,只要不是上边的五种,全都是对象
- Object 对象
-
基本数据类型都是单一的值"hello" 123 true,
- 值和值之间没有任何联系
-
在JS中来表示一个人的信息(name gender age):
- var name = "孙悟空"
- var gender = "男"
- var age = 18;
- 如果使用基本数据类型的数据,我们所创建的变量都是独立,不能成为一个整体
- 对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
-
对象的分类:
- 内建对象
- 由ES标准中定义的对象,在任何的ES的实现中都可以使用
- 比如:Math String Number Boolean Function Object...
- 宿主对象
- 由JS的运行环境提供的对象,目前来讲主要是由浏览器提供的对象
- 比如BOM DOM
- 自定义对象
- 由开发人员自己创建的对象
- 内建对象
-
创建对象
- 使用new关键字调用的函数,是构造函数constructor
- 构造函数是专门用来创建对象的函数
- 使用typeof检查一个对象时,会返回object
-
在对象中保存的值为属性
- 向对象添加属性
- 语法:对象.属性名 = 属性值
- 读取对象中的属性
- 语法:对象.属性名
- 修改对象中的属性
- 语法:对象,属性名 = 新值
- 删除对象的属性
- 语法:delete 对象.属性名
- 向对象添加属性
-
向对象中添加属性
-
属性名
-
对象的属性名不强制要求遵守标识符的规范
- 什么乱七八糟的名字都可以使用
-
但是我们使用时还是尽量按照标识符的规范去做
-
如果要使用还是尽量按照标识符的规范去做
-
如果非要使用特殊的属性名,不能采用 . 的方式来操作
-
需要使用另一种方式
- 语法:对象["属性名"] = 属性值
- 读取时也需要采用这种方式
-
使用[]这种形式去操作属性,更加的灵活
-
在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性
-
obj["123"] = 789; obj["nihao"] = "你好"; var n = "nihao"; console.log(obj[n]);
-
-
-
-
属性值
- JS对象的属性值,可以是任意的数据类型,甚至也可以是一个对象
-
-
in运算符
-
通过该运算符可以检查一个对象中是否含有指定的属性
-
如果有返回true,没有则返回false
-
语法
-
“属性名” in 对象
-
console.log("test2" in obj); console.log("test" in obj); console.log("name" in obj);
-
-
-
-
基本数据类型
- String Number Boolean Null Undefined
-
引用数据类型
- Object
-
JS中的变量都是保存到栈内存中的
-
基本数据类型的值直接在栈内存中储存
-
值与值之间是独立存在,修改一个变量不会影响其他的变量
-
对象是保存在堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间
而变量保存的是对象的内存地址(对象的引用),
如果两个变量保存的是同一个对象引用时,当一个通过一个变量属性时,另一个也会受到影响
-
== 当比较两个基本数据类型的值时,就是比较值
而比较两个引用数据类型时,它是比较的对象的内存地址
如果两个对象是一模一样的,但是地址不同,他也会返回false -
创建一个对象:var obj = new Object();
-
使用对象字面量来创建一个对象
- 语法:var obj = {}; obj.name = "孙悟空";
-
使用对象字面量,可以在创建对象时,直接指定对象中的属性
-
语法:{属性名:属性值,属性名:属性值....}
对象字面量的属性名可以加引号也可以不加,建议不加
如果要使用一些特殊的名字,则必须加引号
-
属性名和属性值是一组一组的名值对结构
名和值之间使用 : 连接,多个名值对之间使用 , 隔开
如果一个属性之后没有其他的属性了,就不要写 ,
-
var obj2 = { name: "猪八戒", age: 13, gender: "男", test: { name: "沙僧" } }; console.log(obj2.test.name);
-
-
-
-
函数 function
- 函数也是一个对象
- 函数中可以封装一些功能(代码),在需要时可执行这些功能(代码)
- 函数中可以保存一些代码在需要的时候调用
- 使用typeof检查一个函数对象时,会返回function
-
我们在实际开发中很少使用构造函数来创建一个函数对象
-
创建一个函数对象,可以将要封装的代码以字符串的形式传递给构造函数
- var fun = new Function{"console.log('Hello 这是我的第一个函数');"};
-
封装到函数的代码不会立即执行,函数中的代码会在调用的时候执行
- 语法:函数对象();
- 当调用函数时,函数中的封装的代码会按照顺序执行
-
使用 函数声明 来创建一个函数
- 语法:
- function 函数名([形参1,形参2,,,形参N]){语句...}
- 语法:
-
使用函数表达式来创建一个函数
- 语法:
- var 函数名 = function([形参1,形参2...形参N]){语句...}
- 语法:
-
定义一个用来求两个数和的函数
-
可以在函数的 () 中来指定一个或多个形参(形式参数)
-
多个形参之间使用 , 隔开,声明形参就相当于在函数内部声明了对应的变量 但是并不赋值
-
在调用函数时,可以在()中指定实参(实际参数)
实参将会赋值给函数中对应的形参
-
-
调用函数时解析器不会检查实参的类型
- 所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
- 函数的实参可以是任意的数据类型
-
调用函数时,解析器也不会检查形参的数量
- 多余实参不会被赋值
- 如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
js10
-
返回值
-
创建一个函数,过来计算三个数的和
-
可以使用 return 来设置函数的返回值
-
语法
- return 值
-
return 后的值将会作为函数的执行结果返回,可以定义一个变量,来接收该结果
在函数中,return 后的语句都不会执行
如果 return 语句后不跟任何值就相当于返回一个 undefined
如果函数中不写 return,则也会返回 undefined
return 后可以跟任意的值
-
-
-
mianji()
- 调用函数
- 相当于使用该函数的返回值
-
mianji
- 函数对象
- 相当于直接使用函数对象
-
break 和 continue , return的区别
- 使用 break 可以退出当前的循环
- 使用 continue 用于跳过档次循环
- 使用 return 可以结束整个函数
-
函数对象()
- 立即执行函数
- 函数定义完,立即被调用,这种函数叫做立即执行函数
- 立即执行函数往往只会执行一次
-
对象
- 对象的属性值可以是任何的数据类型,也可以是个函数
- 函数也可以成为对象的属性
- 如果一个函数作为一个对象的属性保存
- 那么我们称这个函数是这个对象的方法
- 调用这个函数就说调用这个对象的方法
- 但是它只是名称上的区别没有其他的区别
-
枚举对象中的属性
-
使用for ... in 语句
-
语法
- for(var 变量 in 对象){}
-
对象有几个属性,循环体就会执行几次,
每次执行时,会将对象中的一个属性的名字赋值给变量
-
for (var n in obj) { console.log("属性名:" + n); console.log("属性值:" + obj[n]); }
-
-
作用域
-
作用域指一个变量的作用的范围
-
在JS 中一共有两种作用域
-
全局作用域
- 直接编写在script 标签中的JS代码,都在全局作用域
- 全局作用域在页面打开时创建,在页面关闭时销毁
- 在全局作用域中有一个全局对象window
- 它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
- 在全局作用域中
- 创建的变量都会作为 window 对象的属性保存
- 创建的函数都会作为 window 对象的方法保存
- 全局作用域中的变量都是全局变量
- 在页面的任意的部分都可以访问的到
-
函数作用域
-
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
-
每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的
-
在函数作用域中可以访问到全局作用域的变量
- 在全局作用域中无法访问到函数作用域的变量
-
当在函数作用域操作一个变量时,他会现在自身作用域中寻找,如果有就直接使用
- 如果没有则向上一级作用域中寻找,直到找到全局作用域
- 如果全局作用组中依然没找到,则会报错 ReferenceError
- 在函数中要访问全局变量可以使用 window 对象
-
在函数作用域也有声明提前的特性
- 使用 var 关键字声明的变量,会在函数中所有的代码执行之前被声明
- 函数声明也会在函数中所有的代码执行之前执行
-
在函数中,不使用 var 声明的变量都会成为全局变量
-
定义形参就相当于在函数作用域中声明了变量
-
-
-
-
变量的声明提前
用 var 关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值)
- 但是如果声明变量时不使用 var 关键字,则变量不会被声明提前
-
函数的声明提前
-
使用函数声明形式创建的对象,function 函数(){}
它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
使用函数表达式创建的函数,不会被声明提前,所以我们不能在声明前调用
-
-
//函数声明,会被提前创建 function fun() { console.log("我是一个fun函数"); } //函数表达式,不会被提前创建 var fun2 = function () { console.log("我是fun2函数"); }; -
this
- 解析器在调用函数每次都会向函数内部传递进一个隐含的参数
- 这个隐含的参数就是this,this指向的是一个对象
- 这个对象我们称为函数执行的上下文对象
- 根据函数的调用方式不同,this会指向不同的对选哪个
- 以函数的形式调用时,this永远都是window
- fun();
- 以方法的形式调用时,this就是调用方法的那个对象
- obj.name();
- 以函数的形式调用时,this永远都是window
- 解析器在调用函数每次都会向函数内部传递进一个隐含的参数
-
使用工厂模式创建的对象,使用的构造函数都是Object
-
所以创建的对象都是Object这个类型
-
就导致我们无法区分出多种不同类型的对象
-
/* * 创建一个对象 */ var obj = { name: "孙悟空", age: 18, gender: "男", sayName: function () { alert(this.name); } }; /* * 使用工厂方法创建对象 * 通过该方法可以大批量的创建对象 */ function createPerson(name, age, gender) { //创建一个新的对象 var obj = new Object(); //向对象中添加属性 obj.name = name; obj.age = age; obj.gender = gender; obj.sayName = function () { alert(this.name); }; //将新的对象返回 return obj; } /* * 用来创建狗的对象 */ function createDog(name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.sayHello = function () { alert("汪汪~~"); }; return obj; } var obj2 = createPerson("猪八戒", 28, "男"); var obj3 = createPerson("白骨精", 16, "女"); var obj4 = createPerson("蜘蛛精", 18, "女");
-
-
构造函数
- 创建一个构造函数,专门用来创建Person对象的
- 构造函数就是一个普通的函数,创建方式和普通函数没有区别
- 不同的是构造函数习惯上首字母大写
-
构造函数和普通函数的区别
- 就是调用方式的不同
- 普通函数是直接调用,而构造函数需要使用new关键字来调用
-
构造函数的执行流程
- 创建一个新的对象
- 将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象
- 逐行执行函数中的代码
- 将新建的对象作为返回值返回
-
类的实例
- 使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
- 我们将通过一个构造函数创建的对象,称为是该类的实例
-
this的情况
-
当以函数的形式调用时,this是window
-
当以方法的形式调用时,谁调用方法this就是谁
-
当以构造函数的形式调用时,this就是新创建的那个对象
-
function Person(name , age , gender){ this.name = name; this.age = age; this.gender = gender; this.sayName = function(){ alert(this.name); }; }; function Dog(){ }; var per = new Person("孙悟空",18,"男"); var per2 = new Person("玉兔精",16,"女"); var per3 = new Person("奔波霸",38,"男"); var dog = new Dog();
-
-
instanceof
-
使用 instanceof 可以检查一个对象是否是一个类的实例
-
语法:
- 对象 instanceof 构造函数
- 如果是返回true,否则返回 false
- 对象 instanceof 构造函数
-
console.log(per instanceof Person); console.log(dog instanceof Person); -
所有的对象都是Object 的后代
-
所以任何对象和Object 做instanceof 检查时都会返回 true
-
console.log(dog instanceof Object);
-
-
js11
-
构造函数
-
在 Person 构造函数中,为每一个对象都添加了一个 sayName 方法
-
目前我们的方法是在构造函数内部创建的
- 也就是构造函数每执行一次就会创建一个新的 sayName 方法
-
也就是所有实例的 sayName 都是唯一的
-
这样就导致了构造函数执行一次就会创建一个新的方法
- 执行一万次就会创建一万个新的方法,而一万个方法都是一模一样的
- 这样完全没有必要,完全可以使所有的对象共享同一个方法
-
function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; //向对象中添加一个方法 //this.sayName = fun; }
-
-
将 sayName 方法在全局作用域中定义
-
将函数定义在全局作用域,污染了全局作用域的命名空间
-
而且定义在全局作用域中也很不安全
-
解决方法是向原型中添加 sayName 方法
-
Person.prototype.sayName = function () { alert("Hello大家好,我是:" + this.name); };
-
-
创建一个Person的实例
-
var per = new Person("孙悟空", 18, "男"); var per2 = new Person("猪八戒", 28, "男"); per.sayName(); per2.sayName();
-
-
-
-
-
原型
-
我们所创建的每一个函数,解析器都会向函数中添加一个属性 prototype
- 这个属性对应着一个对象,这个对象就是我们所谓的原型对象
-
如果函数作为普通函数调用 prototype 没有任何作用
-
当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性
- 指向该构造函数的原型对象,我们可以通过 _proto_ 来访问该属性
-
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
- 我们可以将对象中共有的内容,统一设置到原型对象中
-
当我们访问对象的一个属性或方法时,它会现在对象自身中寻找,如果有则直接使用
- 如果没有则会去原型对象中寻找,如果找到则直接使用
-
以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中
- 这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法
-
//向MyClass的原型中添加属性a MyClass.prototype.a = 123; //向MyClass的原型中添加一个方法 MyClass.prototype.sayHello = function(){ alert("hello"); }; var mc = new MyClass(); var mc2 = new MyClass();
-
-
原型对象
-
原型对象也是对象,所以它也有原型
- 当我们使用一个对象的属性或方法时,会先在自身中寻找
- 自身中如果有,则直接使用
- 如果没有则去原型对象中寻找,如果原型对象中有,则使用
- 如果没有则去原型的原型中寻找,直到找到Object对象的原型
- Object对象的原型没有原型,如果再Object原型中依然没有找到,则返回undefined
- 当我们使用一个对象的属性或方法时,会先在自身中寻找
-
使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
-
console.log("name" in mc);
-
-
hasOwnProperty()
-
可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性
-
使用该方法只有当对象自身中含有属性时,才会返回true
-
语法:console.log(mc.hasOwnProperty("age"));
-
console.log(mc.__proto__.hasOwnProperty("hasOwnProperty")); console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty")); console.log(mc.__proto__.__proto__.__proto__); console.log(mc.hello); console.log(mc.__proto__.__proto__.__proto__)
-
-
-
当我们直接在页面打印一个对象时,实际上是输出的对象的toString()方法的返回值
-
如果我们希望在输出对象时不输出[object Object],可以为对象添加一个toString()方法
-
per.toString = function(){ return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"; };
-
-
垃圾回收(GC)
-
就像人生活时间长了会产生垃圾一样,程序运行过程中也会产生垃圾
- 这些垃圾积攒过多以后,会导致程序运行的速度过慢
- 所以我们需要一个垃圾回收机制,来处理程序运行过程中产生垃圾
-
当一个对象没有任何的变量或属性对它进行引用,此时我们将永远无法操作该对象
- 此时这种对象就是一个垃圾,这种对选哪个过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理
-
在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁
- 我们不需要也不能进行垃圾回收的操作
-
我们需要做的只是要将不再使用的对象设置null即可
-
var obj = new Object(); obj = null;
-
-
对象
- 内建对象,宿主对象,自定义对象
-
数组(Array)
-
数组也是一个对象
-
他和我们普通对象功能类似,也是用来储存一些值的
-
不同的是普通对象是使用字符串作为属性名的
- 而数组是使用数字来作为索引操作元素
-
索引:
- 从0开始的整数就是索引
-
数组的储存性能比普通对象要好,在开发中我们经常使用数组来储存一些数据
-
typeof
- 在使用typeof来检查一个数组时,会返回object
-
向数组中添加元素
- 语法:
- 数组[索引] = 值
- 语法:
-
读取数组中的元素
- 语法:
- 数组[索引]
- 如果读取不存在的索引,他不会报错而是返回undefined
- 数组[索引]
- 语法:
-
获取数组的长度
- 语法
- 数组.length
- 对于连续的数组,使用length可以获取到数组的长度(元素的个数)
- 对于非连续的数组,使用length可以获取到数组的最大的索引+1
- 尽量不要创建非连续的数组
- 修改length
- 如果修改的length大于原长度,则多出部分会空出来
- 如果修改的length小于原长度,则多出的元素会被删除
- 向数组的最后一个位置添加元素
- 语法:
- 数组[数组.length] = 值
- 语法:
- 语法
-
创建数组
-
var arr = new Array();
-
使用字面量来创建数组
-
语法:
- var arr = [];
-
使用字面量创建数组时,可以在创建时就指定数组中的元素
-
var arr = [1,2,3,4,5,10]
-
-
-
使用构造函数创建数组时,也可以同时添加元素,将要添加的元素作为构造函数的参数传递,元素之间使用 , 隔开
-
var arr2 = new Array(10,20,30)
//创建一个数组数组中只有一个元素10
arr = [10];
//创建一个长度为10的数组
arr2 = new Array(10);
-
-
数组中的元素可以是任意的数据类型
-
arr = ["hello",1,true,null,undefined]; //也可以是对象 var obj = {name:"孙悟空"}; arr[arr.length] = obj; arr = [{name:"孙悟空"},{name:"沙和尚"},{name:"猪八戒"}]; //也可以是一个函数 arr = [function(){alert(1)},function(){alert(2)}]; //console.log(arr); //arr[0](); //数组中也可以放数组,如下这种数组我们称为二维数组 arr = [[1,2,3],[3,4,5],[5,6,7]]; console.log(arr[1]);
-
-
-
-
数组方法
-
push()
- 该方法可以向数组的末尾添加一个或多个元素,并返回数组的新的长度
- 可以将要添加的元素作为方法的参数传递
- 这样这些元素将会自动添加到数组的末尾
- 该方法会将数组新的长度作为返回值返回
-
pop()
- 该方法可以删除数组的最后一个元素,并将删除的元素作为返回值返回
-
unshift()
- 向数组开头添加一个或多个元素,并返回新的数组长度
- 向前边插入元素以后,其他的元素索引会依次调整
-
shift()
- 可以删除数组的第一个元素,并将被删除的元素作为返回值返回
-
-
一般我们都是使用for循环去遍历数组
-
JS中还为我们提供了一个方法,用来遍历数组
-
arr.forEach(function (item, index, arr) {
console.log(item + index + arr); }); -
这个方法只支持IE8以上的浏览器
-
IE8及以下的浏览器均不支持这个方法,如果需要兼容IE8,则不要使用foreach
-
还是使用for来进行遍历
-
需要一个函数作为参数
- 像这种函数,由我们创建但是不由我们调用的,我们称为回调函数
-
数组中有几个元素函数就会执行几次,每次执行时,浏览器会将遍历到的元素
以实参的形式传递回来,我们可以来定义形参,来读取这些内容
-
浏览器会在回调函数中传递三个参数
- 第一个,当前遍历的元素
- 第二个,当前正在遍历的元素的索引
- 第三个,就是正在遍历的数组
-
-
-
-
filter()
-
//返回一个新的数组 不改变原来的规则 var arr2 = arr.filter(function (item, index) { // console.log(item); if (item == 'a') { // return true; return false; } else { return true; } }); console.log(arr2);
-
-
map()
-
var arr3 = arr.map(function (item, index) { // console.log(item, index); return item + 1; })
-
-
reduce()
-
//pre reduce 初始值 计算后的结果 (pre 没有初始值 那它就是初始值) //100 是初始值(不是必传) 不传的话 数组的第一个数值就是初始值 // var ar = [5, 2, 3, 4, 1]; var arr4 = ar.reduce(function (pre, now, index, arr) { console.log(pre, now, index, arr); return now; }, 100) console.log(arr4);
-
-
every()
-
//判断 返回真假 只要有一个假 就返回假 var n = ar.every(function (item, index) { // console.log(item,index); return item <= 5; }); console.log(n);
-
-
some()
-
//判断 返回真假 只要有一个真 就返回真 var n = ar.some(function (item, index) { return item > 5; }); console.log(n);
-
-
slice()
-
可以用来从数组提取指定元素
-
该方法不会改变元素数组,而是将截取到的元素封装到一个新数组中返回
-
参数
-
截取开始位置的索引,包括开始索引
-
截取结束位置的索引,不包含结束索引
- 第二个参数可以省略不写,此时会截取从开始索引往后的所有元素
-
索引可以传递一个负值,如果传递一个负值,则从后往前计算
-
var result = arr.slice(1,4); result = arr.slice(3); result = arr.slice(1,-2);
-
-
-
splice()
-
可以用于删除数组中的指定元素
-
使用splice()会影响到原数组,会将指定元素偶从原数组中删除
- 并将被删除的元素作为返回值返回
-
参数:
-
第一个,表示开始位置的索引
-
第二个,表示删除的数量
-
第三个及以后。。
- 可以传递一些新的元素,这些元素将会自动插入到开始位置索引前边
-
arr = ["孙悟空","猪八戒","沙和尚","唐僧","白骨精"]; var result = arr.splice(3,0,"牛魔王","铁扇公主","红孩儿");
-
-