复制变量值分为两种情况
复制基本类型值变量:
var num1 = 5;
var num2 = num1;
此处num1与num2的值均为5,但是两个独立的Number类型,参与任何操作互不影响
复制引用类型的值:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "mark";
alert(obj2.name); //"mark"
这说明obj1与obj2指向了同一个对象。 (这里要搞清楚两者的区别!)
检测基本数据类型时,用typeof
检测引用类型的值时,用instanceof
执行环境和作用域
当代码在一个环境中执行时,会创建变量对象的一个作用域链;用于保证对执行环境有权访问的所有变量和函数的有序访问。
全局执行环境的变量对象始终是作用域链中的最后一个对象。
js没有块级作用域(ES6中补充了!)
对于if语句或者for循环语句创建的变量即使语句执行结束,也会存在于循环外部的执行环境中;
不同的是,在函数体内部用var定义的局部变量,在函数体外是无法访问的。
查询标识符的搜索过程从作用域链的前端开始,向上逐级查询;即先从局部环境中找,若找到则停止,若找不到则在全局环境中找。
垃圾收集方式:标记清除、引用计数
标记清除是指当变量进入环境时,加上标记“进入环境”,此时不能释放内存,直到变量离开环境,将其标记为“离开环境”。策略是给存储内存的所有变量加上标记,然后去掉环境中变量及其引用变量的标记,这时仍有标记的变量被视为准备删除的变量。
引用类型
创建Object类型实例的两种方法:
1、使用new操作符后跟Object构造函数;var person = new Object();
2、对象字面量表示法;var person = { ..... };
Array类型
数组的length属性不是只读的,可以通过设置这个属性,从数组末尾移除或者向数组添加新项。
var array = ["a", "b", "c"];
array.length = 2;
alert(array[2]); //undefined
分割线——
var array = ["a", "b", "c"];
array[array.length] = "d"; //在位置4添加字符串d
alert(array.length); // 4
栈方法
push()方法将参数添加到数组末尾,并返回修改后数组的长度;
pop()方法从数组末尾移除最后一项,减少数组的length值,并返回移除的项。
队列方法
shift()方法移除数组的第一个项并返回该项,同时数组长度减1;
unshift()方法在数组前端添加任意个项并返回新数组的长度。
重排序方法
reverse()方法反转数组项的顺序;
sort()方法默认按升序(从小到大)排列数组项;sort()方法会调用每个数组项的toString()转型方法,比较得到的字符串确定排序。
sort()方法可以接受一个比较函数function compare()作为参数,接收小于0的数,不改变顺序;接收大于0的数,交换顺序;
这里的compare函数有三种写法:
function compare(a,b) {
return a < b ? 1 : -1;
}
function compare(a,b){
if(a < b){
return -1;
}else if(a > b){
return 1;
}else{
return 0;
}
}
function compare(a,b){
return b - a;
}
操作方法
conncat()创建当前数组的一个副本,将接收到的参数添加到这个副本的末尾,返回新构建的数组;
slice()基于当前数组的一个或多个项创建一个新数组,可接收一或两个参数,分别表示返回项的起始和结束位置(返回起始位置和结束位置之间的项,不包括结束位置的项) slice(0)经常用于数组的浅拷贝!
splice()主要用途是向数组中部插入项,始终会返回一个数组,包含从原始数组中删除的项
删除:指定两个参数,要删除的第一项和删除的项数;
插入:指定三个参数,起始位置、0(要删除的项数)、要插入的项;
替换:指定三个参数,起始位置、要删除的项数、要插入的任意数量的项
位置方法
indexOf()接收两个参数,要查找的项和(可选)表示查找起点的位置;从开头向后找;
lastIndexOf()从末尾向前找
两个方法都返回要查找的项在数组中的位置,若没有找到则返回-1