首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript圈套浅谈

2012-11-19 
JavaScript陷阱浅谈1、变量看下面一段代码var t globalfunction test() {a global toovar t l

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.valueOf = function(){return parseInt(a);}       alert(++a);//output:NaN       alert(a-0);//output:NaN       var a = new Object();       a.toString = function(){return "123abc";}       a.valueOf = function(){return parseInt(a);}       alert(++a);//output:124       alert(a-0);//output:124。   本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cj205/archive/2010/10/31/5977876.aspx

热点排行