标签:
var result1 = ("55" == 55); // true,因为转换后相等
var result2 = ("55" === 55); // false,因为不同数据类型不相等
for (property in expression) statement
with (expression) statement;
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
上面几行代码都包含location对象。如果使用with语句,可以把上面的代码改写成如下形式:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
这意味着在with语句的代码库内部,每个变量首先被认为是一个局部变量,而如果在局部变量中找不到该变量的定义,就会查询location对象是否由同名的属性,如果发现了同名属性,则以location对象属性的值作为变量的值。
严格模式下不允许使用with语句,否则将视为语法错误。
有序大量使用with语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用with语句。
ECMAScript中的函数在定义时不必指定是否返回值。函数在任何时候都可以通过return语句后跟要反悔的值来实现返回值。位于return语句之后的任何代码都永远不会执行,例如:
function sum(num1,num2){
return num1 + num2;
alert("Hello world"); // 永远不会执行
}
一个函数也可以包含多个return语句,例如:
function diff(num1,num2){
if (num1 < num2) {
return num2 - num1;
} else {
return num1 - num2;
}
}
这个函数用于计算两个数值的差。
另外,return语句也可以不带有任何的返回值。这种情况下,函数在停止执行后返回undefined值。这种做法一般用在需要提前停止函数执行而不需要返回值的情况下。
function sayHi(name,message) {
return;
alert("Hello " + name + "," + message); // 永远不会执行
}
推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。
严格模式对函数的一些限制:
不能出现两个命名参数同名的情况。
如果发生以上情况,就会导致语法错误。
理解参数:
ECMAScript函数不介意传递来多少个参数,也不在乎传进来参数是什么数据类型。原因是ECMAScript中的参数在内部使用一个数组表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话。),实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
arguments对象只是与数组类似(它并不是Array的实例),因为可以使用方括号方位它的每一个元素,使用length属性来确定传递进来多少个参数。
前面的例子中,sayHi()函数的第一个参数名字叫name,而该参数的值也可以通过访问argument[0]来获取。因此,函数可以被改写为:
function sayHi() {
alert("Hello " + arguments[0] + "," + arguments[1]);
}
这个事例反映了ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。
通过访问arguments对象的length属性可以获知有多少个参数传递给了函数,可以利用这点让函数能够接收人一个参数并分别实现适当的功能。
function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2)
{
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); // 20
doAdd(30,20); // 50
arguments对象可以与命名参数一起用,如:
function doAdd(num1,num2) {
if(arguments.length == 1) {
alert(num1 + 10);
} else if (arguments.length == 2)
{
alert(arguments[0] + num2);
}
}
arguments的值永远与对应命名参数的值保持同步,例如:
function doAdd(num1,num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
每次执行doAdd()函数都会重写第二个参数,将其改为10.但这种影响是单向的,修改命名参数不会改变arguments中对应的值。如果只传入一个参数,那么为arguments[1]设置的值不会反映到命名参数。
没有传递值的命名参数将自动被赋予undefined值。例如,如果只给doAdd()函数传递了一个参数,则num2中就会自动保存undefined值。
严格模式下,不能像前面例子哪样赋值,会无效,就是说,即使将arguments[1]设置为10,num2的值仍然还是undefined。重写arguments的值会导致语法错误(代码将不会执行)。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num){
return num + 200;
}
var result = addSomeNumber(100); // 300
如前所述,通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。
ECMAScript中的函数与其他语言中的函数有诸多不同之处:
标签:
原文地址:http://www.cnblogs.com/echovic/p/1cf06e50c5f40a5ea557fb472976d56c.html