从今天起我将通读Javascripts高级程序设计,并及时记录一些知识点与大家共享
关于标签
label 配合 continue break 可在嵌套循环中实现精准控制
xh1:for(.....){
xh2:for(....){
if(.){ continue xh1;}//退出循环2 执行循环1
if(.){ break xh1;}//退出循环2,循环1
}
}
//大量with 语句会导致程序性能下降
//switch 语句使用的是全等操作符,不进行自动类型转换
关于函数
//要么永远返回一个值,要么都不返回值
function(){
return;//返回undefined;
}
//函数参数只是提供便利,但不是必须的
//它们均可以通过一个叫arguments的类数组对象获得
function test(a,b){
alert(a+b);
}
//equals
function test(){
alert(arguments[0]+arguments[1]);
}
//So Js函数无法重载,只是覆盖
//函数参数传递的永远都是值
关于变量
//变量只是个名字,特定时间保存特定值
基本类型值是简单的数据段
引用类型值是指可能由多个值构成的对象
引用类型的值是按引用来访问的
变量复制
基本类型
老变量-复制值-创建新对象-赋值给新对象-赋值给新变量
var m=5;
var n=m; //n中的5只是m中5的副本
引用类型
复制后,值的副本是一个指针,两个对象变量因此指向同一个对象
var obj1=new Object();
var obj2=obj1;
obj1.name="change";
console.log(obj2.name)//change
执行环境
//在web环境中,window对象是全局执行环境,所有全局变量和函数都是作为window的属性和方法创建的。
代码执行结束后,环境销毁,保存在其中的所有变量和定义也随之销毁。
//当代码在一个环境中执行时,会创建变量对象的一个作用域链,
函数环境最开始只有一个变量即 arguments 对象,作用域链中下一个变量对象来自包含环境,。。。。一直延续到全局执行环境
作用域链自内而外搜索,访问局部变量要比访问全局变量快。
js 具有垃圾自动回收机制
引用计数策略导致循环引用bug
将变量设为null,切断变量与此前引用的值直接的连接。
管理内存
//一旦数据不再有用,最好通过将其值设为Null 来释放引用。尤其是全局变量及全局变量的属性
//基本类型的值保存在栈内存中,引用类型的值保存在堆内存中
引用类型
描述的是一类对象所具有的的属性和方法
var p=new Object(); //equals var p={};
p.n="ddd";
p.m=11;
//equals 对象字面量表示法
varp={
n:"ddd",
m:11
}
var arr=new Array() == var arr=[];==var arr=Array();
//数组的length 属性不是只读的
在数组末尾添加新项
var arr=[1,2,3,4];
arr[arr.length]=5;
检侧数组
if(arr instanceof Array)
if(Array.isArray(arr))
js为数组提供的栈方法
push 从数组末尾添加新项 返回 新数组长度
pop 从数组末尾移除项 返回移除项
shift 从数组顶端移除项 返回移除项
unshift 从数组顶端添加新项,返回新数组长度
排序方法
reverse
sort
操作方法
concat
slice
splice
位置方法
indexOf
lastIndexOf
数组迭代方法
var numbers=[1,2,3,4]
every
var result=numbers.every(function(item,index,array){return item>2});
alert(result);
false
filter
var result=numbers.filter(function(item,index,array){return item>2});
//返回result=[1,3,4]
some
var result=numbers.some(function(item,index,array){return item>2});
alert(result);
true
map
var result=map.filter(function(item,index,array){return item*2});
//返回result=[1,4,9,16]
forEach
归并方法
reduce
reduceRight