注:当对象的变量值为null或者为undefined时,for-in会发生错误,虽然ECMAScript5更改了这一错误,不过,为了最大限度的保证兼容性,在使用for-in循环之前,先检测该对象的值不是null或者undefined
label语句:标签语句
start:for(var I = 0;i<count;i++){ statement }
这个start标签可以在之后的break和continue语句中使用,标签语句一般与循环语句一起使用
with语句:
将代码的作用域设置到一个特定的对象中
with(expression) statement;
严格模式下不允许使用with语句,否则将被视为语法错误
大量使用with语句会导致性能下降以及代码调试困难,建议大型应用程序的开发不使用with语句
switch语句
switch(expression){ case selection:statement; break; …… default:statement; break; }
函数
严格模式对函数限制:
函数不能命名为eval和arguments
参数不能命名为eval和arguments
不能出现两个命名参数同名的情况
理解函数参数
js中的函数并不介意传进来多少个函数参数,即使与定义的情况不同,因为在函数接收到的永远都是一个类似数组形式的参数,函数并不关心数组包含的参数。可以在函数体内通过arguments对象来访问这个参数数组。
arguments只是与数组类似,因为可以使用方括号来访问它的元素,使用length来确定传进来的参数个数。arguments中的参数顺序与传进来的参数顺序一致,并且是同步改变的。
注:没有传递值的命名参数,将会被赋值为undefined值。
严格模式对arguments对象作出了一些限制:在函数中对arguments进行赋值将会变得无效,重写arguments值将会导致语法错误
使用arguments对参数的类型和数量进行判断,可以模仿重载
第4章,变量、作用域和内存问题
注:js中所有函数的参数都是按值传递的
检测类型:instanceof
instanceof操作符,只能操作引用类型,即对象,对基本数据类型的测试始终返回true,因为基本数据类型不是对象
result = variable instanceof constructor
若变量是给定的引用类型,则返回true
例:
person instanceof Object; //person是Object类型吗?
color instanceof Array; //color是Array类型吗?
没有块级作用域
if(true){ var j = “blue”; } alert(j); //将会得到输出blue
如果在C/C++中将会出现错误,而js并不会出现错误,在块里面定义的变量将会添加到当前的花括号之外的作用域中。
垃圾收集
标记清除
引用计数
第5章,引用类型
Object类型
两种创建实例方式:
一、使用new操作符后跟Object构造函数
var obj = new Object(); obj.name = “name”; obj.age = 23;
二、使用对象字面量(通过对象字面量定义对象时,实际上并不会调用Object构造函数)
var obj = { name : “name”; age : 23 }
可以使用点表示法和方括号表示法访问对象的属性
点表示法: 方括号表示法:(必须以字符串的形式表示要访问的属性名)
obj.name obj[“name”]
注:当属性名包含会导致语法错误的字符,或属性名使用的是关键字或保留字时,可以使用方括号表示法,还可以通过变量访问属性
建议:除非必须使用变量访问属性,否则最好使用点表示法
Array类型
创建方式:
一、使用Array构造函数
var arr = new Array(); //创建一个空数组 var arr = new Array(20); //创建一个包含20个项的数组 var arr = new Array(“one”,”two”,”three”); //创建包含one,two,three三项的数组 还可以将new操作符省略
二、使用数组字面量表示法
var color = [“red”,”blue”]; //创建包含两个项的数组 var color = [“yellow”,”green”,]; //不要这样创建数组,浏览器的解析不同,结果会不同
注:使用数组字面量创建数组时,也不会调用Array构造函数
arr.length,将会返回数组的项数,即将返回数组的大小