JavaScript中存在问题但却难以避免的功能特性

一,全局变量
1.全局变量可以被任何部分在任意时间改变,复杂化,降低可靠性
2.可能与子程序变量名相同,冲突可能导致程序无法运行,难以调试

三种声明全局变量模式
1.脱离任何函数的var foo = value
2.直接添加属性至全局对象,全局对象是所有全局变量的容器,在web浏览器中全局对象名为window,window.foo = value
3.直接未经声明的变量 - 隐式的全局变量 foo = value

二,没有块作用域,有函数作用域

函数中定义的参数和变量在函数外部不可见,而在一个函数中任何位置的定义的变量在该函数的任何地方可见。

function f1(){
    var a=1;
    function f2(){
        if(false){
            var a=2;    //变量基于函数,而非基于语句块,没有块作用域
        }
        console.log(a); //undefined 未定义
    }
    f2();
    console.log(a);//1
}
f1();

大多数语言中,一般声明变量都是在第一次用到它的地方,在javascript中是一个坏习惯,因为没有块作用域,更好的是在每个函数开头声明所有变量。

三,return语句返回一个值,值表达式必须和return在同一行上

return {
    status:true
};

返回包含status成员元素的对象。

如果用

return
{
    status:true
};

会返回undefined。

四,保留字不能用来命名变量或函数,当保留字被用作对象字面量的键值时,必须用引号,而且不能用点表示法,必须使用括号表示法。

var object = {case:value}; //非法
var object = {'case':value}; //ok
object.case = value;       //非法
object['case'] = value;    //ok

各浏览器对保留字使用限制上实现不同,以上语法在FF中合法,但其他浏览器不合法;再有不同的保留字行为也不相同。类似int/long/float等保留字在各浏览器中都可以做变量名及对象字面量的键值。但不建议使用任何保留字。

五,typeof - 识别运算数类型的字符串

但typeof null返回'object',更好的检测null的方法: my_value === null

对于正则表达式 typeof /a/,一些浏览器返回'object',另一些返回'function'

六,parseInt - 将字符串转换为整数

1.此函数遇到非数字时就停止解析,即parseInt('16')和parseInt('16 abc')产生结果相同,都是16.
2.如果字符串第一个字符是0,则基于八进制解析,而不是十进制。八进制中没有8,9数字,所以parseInt('08')和parseInt('09')结果为0。此函数可以接收一个基数作为参数,parseInt('08',10)结果为8。

七,浮点数

0.1+0.2不等于0.3

八,NaN

function isNumber(value){
    return typeof value === 'number' && isFinite(value);
}

isFinite筛调NaN和Infinity,但是isFinite会试图把它的运算数转换为一个数字,如果运算数事实上不是一个数字,就会报错,所以加上typeof value === 'number'。

九,假值

0,NaN,'',false,null,undefined全部等于假,但它们是不可互换的。

posted on 2011-07-18 20:09 *** 阅读(192) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜