困惑一:
先看一个例子:
function test(){ message = "hi"; } test(); alert(message);会输出字符串“hi"
在函数内部使用var定义的变量是局部变量,省略var操作符的变量是全局变量。
困惑二:
alert(undefined == null)结果是”true"
我们知道在js中分为基本类型和引用类型,基本类型包括number、string、boolean、undefined、null.如果一个基本类型没有初始化则会是undefined类型,而null代表空指针。实际上undefined值是派生自null的,因此返回true.
困惑三:
alert(isNaN(NaN)); //true alert(isNaN(10)); //false alert(isNaN("10")); //false 自动类型转换 alert(isNaN("blue")); //true alert(isNaN(true)); //false 自动类型转换NaN指非数值(Not a Number)是一个特殊的数值,在ECMAScript中,任何数值除以0返回NaN,而且任何涉及NaN的操作都会返回NaN. NaN与任何值不等,包括自身。
alert(NaN == NaN); // false困惑四:
for(var propName in window){ document.write(propName); }For - in 语句是一种精准的迭代语句,可以用来枚举对象的属性,类似于java中的for( String s : String[])
困惑五:
var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href; //等价于下面 with(location){ var qs = search.substring(1); var hostName = hostname; var url = href; }with语句的作用是将代码的作用域设置到一个特定的对象中,主要目的是为了简化多次编写同一个对象的工作。
困惑六:
function howManyArgs(){ alert(arguments.length); } howManyArgs("String", 45); //2 howManyArgs(); //0 howManyArgs(12); //1ECMAScript中的参数在内部是用一个数组来表示的,函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果没有参数的话)。
命名的参数只提供便利,但不是必须的。再看下面例子
function doAdd(num1, num2){ arguments[1] = 10; alert(arguments[0] + num2); }因为arguments对象中的值会自动反映到对应的命名参数,所以num2会变成10,但是他们的内存空间是独立的(不是引用),另外arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数个数决定的。
困惑七:
for(var i=0; i<10; i++){ } alert(i); //输出结果为 10JavaScript没有块级作用域。