日期:2014-05-16 浏览次数:20414 次
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