日期:2014-05-16  浏览次数:20389 次

JavaScript陷阱浅谈
1、变量   
看下面一段代码   
var t = "global";   
function test() {   
a = "global too";   
var t = "local";   
alert(t);   //output:"local"   
alert(a);   //output:"global too"   
t = "also local";   
}   
test();   
alert(t);   //output:"global"   
alert(a);   //output:"global too"  
为什么输出结果是这样的呢?可能局部变量和全局变量t比较容易理解。但是a是怎么回事呢。   
/*因为在JavaScript中,即使在函数中,没有var声明的变量作为全局对象“Globle”的属性。这也说明了一个问题。在JavaScript中所有的属性必须有相应的对象。*/  
关于变量,我们再来看这样的一段代码   
var t = "globle";   
if(true) {   
var a = "also global";   
var t = "..."  
alert(t);   //output:"..."   
}   
alert(t);   //output:"..."   
alert(a);   //output:"also global" 
/*  
*这段代码证明了2件事  
*1、javascript中没有块级的局部变量。就是说if、while、for、switch等语句中声明的变量也是全局的变量  
*2、javascript中声明重复变量的后果是后者覆盖了前者  
*同时,全局变量的调用window.t == t  
*/  
2、类型   
JavaScript中有以下类型数字型、字符型、布尔型、Undefined、Null、对象.其中前5个是储存属于值类型   
typeof 运算符是用来返回变量、值的类型的,但是他只会返回以下类型   
undefined、bool、string、number、object。这其中/*null会返回object。*/  
这里有一个令人费解的东西:如果声明(有的书或资料称作定义)了而未赋值的,alert()出来就是undefined、如果没有声明alert()会报error但是typeof却并不如此。即使未声明也不会报error。而是返回undefined   
所以/*未声明的变量只能使用typeof运算符,不能使用其他的任何运算符和方法*/  
null 与 undefined 之间的关系   
/*  
*首先,undefined实际上是从null派生来的,所以两者相等  
*其次,null表示尚未存在的对象(null可以理解为对象的占位符)  
*undefined表示声明但未初始化(赋值)的变量  
*/  
Boolean 我们来先看代码   
var obool = new Boolean(false);   
alert(obool&&true); //output:true   
这个输出有些惊讶吗?这个其实并不难理解。因为obool != obool.valueOf() .其实就是说obool是对象本身,他不代表他的值。所以慎用Boolean可以减少错误   
3、数字   
我最不满意的可能就是JavaScript的这个东西,连最基本的+、-、*、/都无法做到精确。同时JavaScript的数字又比较复杂,经常让人欲哭无泪,让我们一个一个来看吧   
a)   
var t1 = 56;   
var t2 = 070;   
var t3 = 0x38;   
alert(t1==t2); //output:true   
alert(t2==t3); //output:true   
这说明无论是8进制、16进制,其变量都保存的是10进制的值。   
b)   
var t1 = 1.0    //JavaScript高级程序设计中说,在进行计算前,浮点字面量储存的是字符串,但是我不清楚这意味着什么,期待大牛的解释   
Mark一下: Number.MAX_VALUE/Number.MIN_VALUE/Number.POSITIVE_INFINITY/Number.NEGATIVE_INFINITY 对应方法 isFinite()   
c)   
NaN != NaN //这点其实不难理解,非数字那么多,怎么能相等呢对吧,哈哈~~但是要补充下"123"这样的可转换为数字的字符串不是NaN。   
d)   
拥有一个比较华丽的toString()方法。toString(2/8/16==)可以转换为相应进制的字符串.   
e)   
parseInt() parseFloat() 对字符串进行转换的。   
/*  
*parseInt()转换的时候从0位置开始检测,如果是数字,则一直检测到非数字字符。  
*parseInt()可以识别16进制和8进制的数字并返回10进制数字  
*parseInt()有基模式,可以按进制解析。比如parseInt("AF",16) ==>returns 175  
*parseFloat()不认识其他进制  
*/  
Number 的强制转换却又与这2个方法不同,如果不是合法的数字,那么就得到NaN,不过false和true又返回0和1,同时null也是0   
f)   
alert(NaN<5) //output:false   
alert(NaN>=5)    //output:false   
4、类型转换   
toString() 与 String()不同   
String(null)    //output:"null"   
null.toString() //error   
变量相等性的时候   
/*  
*Boolean类型转换成1或0。即数字型的  
*字符串与数字比较,字符串先转换为数字(哪怕是NaN)  
*对象与字符串比较,对象执行toString()  
*对象与数字比较,对象尝试转换为数字  
*/  
5、slice() 与 substring()的区别   
都是参数都是正数的时候相同   
但是当为负数的时候处理方式不同。   
看代码先:   
var test = "Hello world!";   
alert(test.slice(-5));   //output:" world"   
alert(test.substring(-5));  //output:"hello world"   
由此可见如果遇见负数,那么slice会拿length加上参数。而substring则直接当为0处理   
6、前段时间有一个童鞋在CSDN上提问以下代码为什么delete不起作用   
var t = 5;   
alert(t);   //output:5   
delete t;   
alert(t);   //output:5   
这里解释delete的作用/*运算符删除对以前定义的对象属性或方法的引用*/  
那么下面的这段代码呢?   
TRY:   
t = 5;   
alert(t);   
delete t;   
alert(t);   
7、关于void我也遇到过一个疑问。当时代码大致是这样的   
<a href="javascript:window.open('http://www.baidu.com')" mce_href="javascript:window.open('http://www.baidu.com')">test</a>   
令我当时疑惑的是在父窗口中竟然输出了null//chrome下并不这样。   
后来看javascript高级程序设计,解释void()的时候介绍了这个问题   
void()始终返回 undefined.   
8、一个数字和一个字符串相加。+是字符串连接符合   
一个数字和一个字符串相比较(字符串是数字)。字符串转换为数字,如果不能转换为数字,那么就是NaN。   
9、function无返回值或者return的时候不带参数,那么返回始终是undefined   
10、字符串做加减运算时会默认执行Number强制转换。而不是parseInt(parseFloat),例如   
    var a = "123abc";   
    alert(typeof(a++));//output:??   
    alert(a);//output NaN   
    与下面相比
    var a = "123abc";  
    a=a+1;
    alert(typeof(a));//output:string   
    alert(a);//output 123abc1    
11、new String()是object,并非是string。例如   
alert(new String("abc") === "abc")  //output:false   
12、对象和字符串字面量的区别。   
    var a = "123abc";   
    a.val