1.函数(是引用类型的对象,函数名是指向函数对象的变量)
函数可以作为参数传递给另一个函数:js中函数本质是一个对像,函数名本质是指向函数对象的变量。
return单独使用,标识退出函数执行的意思。
参数变量是局部变量。
js中没有块级作用域,分支/循环结构中声明的变量,出了结构照样使用。
(1)声明提前:在程序执行前或函数被调用前,将 var 声明的变量 和 function 声明的函数提前到当前作用于的顶部集中创建;仅声明提前,赋值留在原地。
(2)按值传递:js 中无论变量间赋值或使用变量传递参数时,都是将变量中的值,复制一个副本给对方。
(3)全局函数:ES标准中定义好的,可直接调用的。
包含:parseInt(str)、parseFloat(str)、isNaN()、encodeURIComponent()/decodeURIComponent()、eval()等。
注:eval——计算字符串格式的表达式的值,或执行字符串格式的 js 语句。
2.数组(引用类型的对象)
一个数组中不限制数据类型(可以有多个数据类型存在于一个数组中)。
(0)js 数组 vs 其他语言的数组
js 数组下标越界不会出错。
为不存在的位置赋值:不会出错,会自动创建指定下标的新元素。
从不存在的位置取值:不会出错,也不会增加新元素,而是返回undefined。
(1)数组的创建
1.var arr = [ ];
2.var arr = [1,3,5,...];
3.var arr =new Array();
(2)null 和 undefined
undefined:是所有没有值的变量的默认值,自动赋值。
null:主动释放一个变量引用的对象。(当用完一个较大的对象时,使用 null 主动释放对象。)
垃圾回收器:专门释放对象内存的一个程序;在底层、后台,伴随当前程序同时运行;引擎会定时自动调用垃圾回收器;一个对象(比如数组对象)不再被任何变量引用时,才释放。例如:
var emps = ['Scott','Smith'];
emps = null; //释放指向数组的引用
(3)关联(Hash)数组
索引数组:自动生成下标的数组(常规数组)。
缺点:下标自动分配,无意义;要想按内容查找元素,只能从头开始遍历。
关联数组:自定义下标名称的数组。(.length失效);下标不能重复
优势:利用Hash算法,精确定位某个下标的位置,不用遍历就能按内容查找元素。
a.创建关联数组过程:即将 [下标,内容] 对儿存入内存中;首先利用Hash算法计算下标,得到将要存储的位置(唯一的),再将内容存入该位置。(即经Hash算法计算的位置与下标一一对应)
b.按内容查找元素过程:首先利用Hash算法计算下标,得到位置值,再到该位置直接获取要找的内容。(即,Hash算法计算结果与输入一一对应,所以要想找某个内容时计算的下标 与 存入时计算下标得到的结果一样,所以能够直接找到存储位置。)
遍历关联数组:依次遍历arr中每个元素,将当前元素的下标存入key中
for(var key in arr){
arr[key]; //key——当前元素的下标
}
//创建关联数组
var ABC = [];
ABC["sname"] = "刺猬";
ABC["song"] = "火车驶向云外,梦安魂于九霄";
//访问关联数组
ABC["sname"]
笔试题:去除数组中重复的元素
思路:1.依次遍历arr中每个元素
2.将元素值作为key,value默认都取1,放入Hash中
3.遍历结束后,输出Hash中的内容即是去掉重复的。
3.数组API
API:应用程序编程接口。(已实现的,现成的对象和方法。)
(1)数组对象的方法
1.arr to String:
var str = arr.toString() —>,逗号分隔
var str = arr.join("连接符") —>自定义连接符
固定套路:1)将字符拼接为单词 arr.join("");
2) 将单词拼接为句子 arr.join(" ");
问题:频繁的字符串拼接 “+” ,造成内存浪费
解决:先将要拼接的字符串放入数组,最后 arr.join("");
2.拼接和截取:原对象保持不变,返回新对象
var newArr = arr.concat(新值1,新值2,...)
var subArr = arr.slice(starti [,endi + 1] );
第二个参数可省略,如果省略表示从start一直取到结尾;
两个参数都可取负值,负值表示倒数(最后一个是 -1),就近使用下标。
含头不含尾(正负都是)。
3.arr.splice():删除、插入、替换
4.arr.reverse();
(2)数组排序
arr.sort();
问题:默认将所有元素转为字符串升序排列,故不能排序一组数字类型的数组。
解决:比较器函数(专门比较任意两个值大小的函数)
1.两个参数,分贝表示要比较的任意两个值
2.无论比较逻辑是什么,都要返回一个数字。
下面是实际中用的对数字、字符串,进行升、降序排列的代码:
var nums=[1,2,3,12,23,123,33];
var emps=["smith","john","eric","tom","jerry"];
/*专门比较任意两数字的大小*/
//升序的比较器函数
function compareNum(a,b){
return a-b;
}
//降序的比较器函数
function compareNumDesc(a,b){
return -(a-b);
}
//对nums指定,数字排序 + 升序
nums.sort(compareNum); //sort()方法是将任意类型的数组都转成字符串,再进行排序,所以需要指定为数字排序。
console.log(nums);
//对nums指定,数字排序 + 降序
nums.sort(compareNumDesc);
console.log(nums);
//对emps按字符串排序
emps.sort(); //sort()方法是将任意类型的数组都转成字符串,再进行排序。
console.log(emps);
(3)map()方法
map()
方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。
语法:array.map(callback [,thisArg])
参数:
callback
原数组中的元素经过该方法后返回一个新的元素。
currentValue:callback
的第一个参数,数组中当前被传递的元素。
index:callback
的第二个参数,数组中当前被传递的元素的索引。
array:callback
的第三个参数,调用 map
方法的数组