002 Javascript(025 - 044)
[A] 认识函数
1. 函数声明:
function 函数名(形参1,形参2,......){ 函数体;
return 表达式; }
【注】函数名最好要见名思意
整个函数在运行时,遇到return会终止函数运行,跳出函数
2. arguments讲解
【注】每一个函数内都有一个arguments,这是系统内置的
arguments是用来存储实际传入的参数
属性:
arguments.length 输出当前里面存储的参数的个数
【注】下标从0开始
3. 函数作用域
任何程序在执行的是偶都要占用内存空间的,函数调用的时候也是要占用内存空间的
函数调用时,系统会分配对应的空间给整个函数使用
【注】在函数外声明的变量,为全局变量,作用域是全局
在函数体内声明的变量,为局部变量,作用域为函数体内部
4. 递归
函数递归:在面试中,若面试官问及函数递归方面的知识,则对你的要求较高
大部分公司会明文禁止使用递归的
递归需满足以下三个特点:
1. 函数自己调用自己
2. 一般情况下是有参数的
3. 一般情况下有 return
【注】递归可以解决循环所能解决的所有的事
递归都可以被写出来,但是不知道为什么是对的
【注】递归会大量占用内存,尽量少用
[B] 认识数组
数组:用一个变量存储一堆数据的数据结构
数据类型:
基本数据类型
特殊数据类型
复合 / 引用数据类型
数组是符合 / 引用数据类型的一种
1. 数组声明:
a. 通过new创建数组
格式:var 数组名 = new Array(元素1,元素2,......)
var a = new Array(1,"true","hello");
b. 省略new创建数组
格式:var 数组名 = Array(元素1,元素2,......)
var a = Array(1,"true","hello");
c. 数组常量进行赋值(JS中一般用中括号[ ];)
格式:var a = [元素1,元素2,......]
var a = [1,"true","hello"];
【注】前两种方法中,当元素只有一个且为数字(如10)时,它表示创建了一个长度为定值(如5)的空数组。
2. 数组的属性
数组.length 返回数组元素的个数
数组元素:将存储在数组中的内一个元素叫做数组元素
3. 数组元素的访问
数组[下标] 下标从0开始,如:a[2]
4. 数组的遍历
a. for循环
// 依次输出数组中的元素
var a = [1,"true","hello",4,6,"29s"]; for(var k = 0; k < a.length; k++){ document.write(a[k],"<br>"); }
b. for...in 快速遍历
var a = [1,"true","hello",4,6,"29s"]; for(var k in a){ document.write(a[k],"<br>"); }
[C] 数组的方法
1. 栈结构:
结构:从一头进,从同一头出
特点:先进后出
数组的两个方法形成栈结构:
push()
格式: 数组.push(参数1,参数2,.......);
功能: 从数组尾部添加元素
返回值: 添加完元素之后的数组长度,标量
pop()
格式: 数组.pop() 无参数
功能: 去掉数组元素的最后一个元素
返回值: 取下的这个元素
2. 队列结构:
结构:从尾部进,从头部出
特点:先进先出
数组的两个方法形成队列结构:
push()
格式: 数组.push(参数1,参数2,.......);
功能: 从数组尾部添加元素
返回值: 添加完元素之后的数组长度,标量
shift()
格式: 数组.shift() 无参数
功能: 从数组头部取下一个元素
返回值: 取下的这个元素
unshift()
格式: 数组.unshift(参数1,参数2,......)
功能: 从数组头部插入元素
返回值: 插入元素后的数组
3. 数组的其他方法
concat()
功能:合并数组
语法: 数组.concat(数组1,数组2,.....)
返回值:合并后的新数组,原数组1,数组2不变
【注】被合并的数组是被当成一个数组进行合并,即将数组中的每个元素分别拆出来再合并,而不是将这个数组当成一个元素连接到原数组中
slice()
功能:获取数组中指定区域 [ start, end) 的元素
语法:数组.slice(start, end) 包含start,不包含end
返回值:提取出的新数组,原数组不变
splice()
功能:获取数组中指定区域 [ start, end) 的元素
语法:数组.splice(start, length, 数据1,数据2,.......)
start: 开始截取的位置
length:截取元素的长度
数据1,数据2,......:插入的数据
【含义】在数组中的start位置起截取length个长度的元素,若后面还有数据1,数据2....等多个数据,则是将start开始的length个长度的元素,替换为数组1,数组2,......
返回值:截取的数组,原数组不变
join()
功能:将字符串中的元素按照指定的连接符拼接起来
语法:数组.join(连接符)
返回值:返回拼接好的字符串
reverse()
功能:将数组元素进行逆序
语法:数组.reverse()
返回值:返回已经逆序的新数组,原数组已变为逆序后的数组
sort()
功能:将数组元素进行排序
语法:数组.sort()
返回值:已经排序好的新数组
【注】该默认的排序是将数组元素看做字符串,然后进行比较的,古对于纯数字把数组的比较会出错
解决办法:通过自定义函数来解决
var a = [2,95,62,34,6,42,15,83]; a.sort(function(value1, value2){ return value1 - value2; //若想从小到大排序,则为value2 - value1 }) var c = a.reverse(); document.write(c);
[D] 数组的引用
复合数据类型中,名与值的连接关系就是引用。即数据名中存储的是数据的引用
var a = [2,5,7]; var b = a; b = [7,4]; document.write(a,"<br>") document.write(b);
输出结果:
2,5,7
7,4
[E] 声明提升和省略var
1. 声明提升:所谓声明提升,是指在当前作用域,声明的变量和函数,会直接提升整个代码的最前面运行。
JavaScript中,一段程序在分配内存的时候会一次性全部分配配好,这一过程在代码的预编译阶段完成。
代码的预编译:在所有代码运行之前,计算机会将代码从头到尾看一遍
将这个程序运行所需要的空间一次性分配好。
2. 省略 var 声明变量
在声明变量时的常规语法是: var 变量名 = 变量值;
而当省略var声明变量时,变量会被系统强制认定为全局变量,不会报错
【注】不建议这样写
[F] 二维数组
数组存储数据是在同一个变量中存储多个元素,而这每些元素可以为任意的数据类型
故二维数据实际上也是一种维位数组,只不过该数组中的每一个元素都是一个一维数组
[G] 冒泡排序
规则:前后两个数,凉凉进行比较,若符合交换条件,则两个数交换位置,第一轮结束之后,第二轮从第二个数开始,以此类推
[H] 选择排序
规则:从现有的数中选择出最小(或最大)的一个元素,放在第一位,再从剩下的数中选择出最小(或最大)的一个元素,放在第二位,以此类推。
[ I ] 数组练习
1. 随机给出一个五位以内的数,然后输出这个数有多少位,每位是多少
2. 编写一个函数has(arr, 60),判断数组中是否存在60这个元素,返回布尔值
3. 条形码验证
[J] ECMAScrit5的严格模式
在正常运行模式下,某些不规范的写法会被系统自动矫正。
在ECMAScript5中增加了第二种运行模式:严格模式(Scrict mode),这就是让JavaScript在更严格的条件下运行。
严格模式的目的:
1. 消除JavaScript语法的一些不合理,不严谨之处,减少一些怪异行为;
2. 消除代码运行的不安全之处,保证代码运行的安全性;
3. 提高编译器效率,提高运行速度;
4. 为未来新版本的JavaScript做好铺垫。
【注】严格模式体现了JavaScript更合理,更安全,更严谨的发展方向,包括IE在内的主流浏览器,都已经支持它。
【使用】:在所需要的进行严格模式的作用域下,单独一行书写:"use strict"
【注】在当前作用域下,若使用了严格模式,则该作用域下运用的外部文件,也必须遵守严格模式,故尽量不要在全局使用严格模式
【严格模式的严格之处】
1. 变量使用前必须声明;
2. 函数的形参名不能重复(非严格模式下,形参名可以重复,不会报错,只不过后面的同名形参会覆盖掉前面的)
3. 非严格模式下,在函数内部修改形参值会同时改变arguments的值,反过来在函数内部修改arguments的值也会同时改变形参的值;
而在严格模式下,函数内部形参值的修改不会改变arguments的值,反过来在函数内部修改arguments的值也不会同时改变形参的值;
4. 新增了很多保留字
implements,interface,let,package,private,protected,static,yield
[K] ECMA5 新增数组的方法
1. indexOf()
格式:数组.indexof(item, start);
参数:item 任意数据
start 下标,可以不传入,默认为0
功能:在数组中查找第一次 item 出现的下标,从 start 开始去查找
返回值:-1 表示没查找到
>=0 表示查找到的元素首次出现的下标
2. forEach 数组遍历
forEach无返回值
使用方法:
// var arr = [10,20,30,40,50,60,70,80]; // arr.forEach(function(item, index, arr) { // item: 当前遍历到的元素 // index: 当前遍历到的元素的下标 // arr数组本身 // }); 【注】若数组arr为二维数组,则只会将其认定为一位数组进行操作
3. map() 映射
功能:实现映射,根据一段固定的运算公式,把原来的数组的每一个元素根据这个运算公式进行映射,然后放在新数组的同一个位置,而原数组不变。
返回值:映射后的新数组
使用方法:
var arr = [10,20,30,40,[2,5,8],50,60,70,80]; var qw = arr.map(function(item, index, arr) { // item: 当前遍历到的元素 // index: 当前遍历到的元素的下标 // arr数组本身
// 遍历要做的事情,也就是映射关系 return item * 2; }); document.write(arr,"<br>"); document.write(qw);
结果:
【注】可看出,map方法只能处理一维数组
4. filter() 过滤
var arr = [10,20,30,40, 50,60,70,80]; var qw = arr.map(function(item, index, arr) { // item: 当前遍历到的元素 // index: 当前遍历到的元素的下标 // arr数组本身 // 过滤的条件 return item > 20; }); document.write(arr,"<br>"); document.write(qw);
结果:
5. some() 查找是否有符合条件的元素
功能:查找数组中是否有符合条件的元素,若有,返回true,若无返回false
【注】该方法存在短路操作,即只要查找到一个存在的元素,后面的元素将不再被查找
var arr = [10,20,30,40, 50,60,70,80]; var qw = arr.some(function(item, index, arr) { // item: 当前遍历到的元素 // index: 当前遍历到的元素的下标 // arr数组本身 // 过滤的条件 return item > 20; }); document.write(arr,"<br>"); document.write(qw);
结果:
6. every() 查找每一个
功能:在数组中查找每一个元素是否符合条件,全部符合返回true,有一个不符合就返回false。
【注】该方法存在短路操作,即只要发现有一个不符合条件,则后面的元素将不再被遍历。
var arr = [10,20,30,40, 50,60,70,80]; var qw = arr.every(function(item, index, arr) { // item: 当前遍历到的元素 // index: 当前遍历到的元素的下标 // arr数组本身 // 过滤的条件 return item > 20; }); document.write(arr,"<br>"); document.write(qw);
结果:
7. reduce() 归并
newarr = arr.reduce(funcetion(pre, next, index, array){ // pre:上一次return后面的值 // next:从下表1开始,当前遍历到的元素 // index:当前遍历到的下标; // arr:当前数组; })