javascript的优美与鸡肋

--总结来自:《javascript语言精粹》
任何语言都有其优美的地方和其鸡肋的地方。避归一些语言的糟粕,能相应的下降bug出现的概率。
优美处:
函数是头等对象
基于原型继承的动态对象
对象字面量和数组字面量
 
糟粕:
1. 全局变量
全局变量有三种表达方式:
    var声明:var foo = value;
    添加属性到全局对象上,即添加到window上:window.foo = value;
    未经声明的变量:foo = value;
虽然变量能够未经声明就使用,可是这会致使后期的不少的bug出现,而且这些bug很难被发现。
 
2. 做用域
javascript中,没有块级做用域,代码块中声明的变量在包含此代码块的函数的任何位置都是可见的。
因此,在js中最好的方式是在每一个函数开头的部分声明全部变量。
 
3. 自动插入分号
javascript能够经过自动插入分号来修正有缺损的程序,可是这样会致使不少严重的bug,而且不易发现。
return
{
    status:     true
}
上面的例子中实际返回的是undefined,由于这个值表达式的开始部分必须和return在同一行上,不在一行,js就会自动补全,致使错误。
正确应该以下写法:
return {
    status:     true
}
 
4.保留字
保留字即在语言中未使用,可是保留下来为了之后可能会使用到。他们不能用来命名变量或参数。当保留字被用做对象字面量的键值时,他们必须被引号括起来。
1 关键字
break case catch continue default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with
2 保留字
abstract boolean byte char class const debugger double enum export extends fimal float goto implements import int interface long mative package private protected public short static super synchronized throws transient volatile 
 
5. Unicoe
javascript是16位的。Unicoe把一对字符视为一个单一的字符,而javascript认为一对字符是两个不一样的字符。具体不详...
 
6. typeof
typeof运算符返回一个用于识别其运算数类型的字符串。可是没法是别null。
 
7. parseInt
parseInt('16')和parseInt('16 tons')结果同样。若是字符串第一个字符是0,那么该字符串将被基于8进制而不是10进制,因此标准的写法是parseInt('08',10);
 
8. +
+ 运算符能够用于加法运算和字符串链接,如何执行取决于其参数的类型。只有当两个数都是整数型时才作加法运算。
 
9.浮点数
二进制的浮点数不能正确的处理十进制的小数,在javascript中,0.1 + 0.2不等于0.3。可是这个问题能够避免。如,美圆能够经过乘以100而所有转成美分,而后进行加减,再将他们的和除以100来换回美圆。
 
10. NaN
NaN是IEEE753中定义的一个特殊的数量值。它表示的不是一个数字,可是typeof NaN === 'number'返回的是true。在代码的转换运算中会产生NaN,而且NaN不等于它本身。NaN出现不易排查,幸亏isNaN()能够识别数字和NaN
 
11. 伪数组
javascript中没有正真的数组,它的数组是伪数组,性能不好。
type不能辨别数组和对象,须要判断是否为数组,须要检查他的constructor属性:
if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' && !(my_value.propertyIsEnumerable('length'))) {
    //my_value 确实是一个数组
}
 
12. 假值
javascript有一堆的假值。
如0 NaN ‘’ false null undefined辨别他们的时候要特别的当心
 
13. hasOwnProperty
hasOwnProperty方法被用做一个过滤器去避开for in语句的一个问题。不幸的是,hasOwnProperty是一个方法,而不是一个运算符,因此在任何对象中,他均可能会被不一样的函数甚至一个非函数的值所替换。
 
14. 对象
javascript的对象不会有空对象,由于他们能够从原型链中取得成员元素。而且伴随着不少bug的出现。
 
鸡肋:
1. ==
不要使用== 和 !=,应该使用===和!==,===和!==将两个值的数据类型和值都进行了比较。
 
2. with语句
不要使用with,由于它会有bug的出现
 
3. eval
eval会使代码更加难以阅读,安全性和性能也都不太好。
 
4. continue语句
continue语句跳到循环的顶部。使用continue会使性能下降
 
5. switch贯穿
switch条件贯穿会致使其余的问题。有用,可是很危险。
 
6. 缺乏的块语句
if / while / do 和 for语句均可以接受一个括号中的代码块,也能够接受单行语句。可是它模糊了程序的结构。严格规范并始终使用代码块会使得代码更容易理解。
 
7. ++--
这两个运算符容易促成一种不谨慎的编程风格。大多数的缓冲区溢出错误所形成的安全漏洞,都是因为像这种编码而致使的。
 
8. 位运算符
&     and按位与
|      or按位或
^      xor按位异或
        not按位非
>>    带符号的右移
>>>  无符号的右移
<<    左移
在大多数的语言中,这些位运算符接近于硬件处理而很是的快,在javascript中,位运算符不是硬件处理,速度很是的慢。它下降了这门语言的冗余度,使得bug更不易被发现。
 
9. function 语句对比函数表达式
一个function语句就是其值为一个函数的var语句的速记形式。function语句在解析时会发生被提高的状况。意味着无论function被放置在哪里,它会被移动到被定义时所在做用域的顶层。在if语句中使用function语句是被禁止的。由于大多数的浏览器都容许在if语句中使用function语句,但它们在解析时处理上各不相同。就形成了可移植性的问题。
 
10. 类型的包装对象
new Boolean(false)
会返回一个对象,该对象有一个alueOf方法会返回被包装的值。不要使用new Boolean/new Number / new String
避免使用new Object和new Array,可以使用{}和[]来代替。
 
11. new
javascript的new运算符建立一个继承于其运算数的原型的新对象,而后调用该运算数,把新建立的对象绑定给this。在new和初始化的过程当中会出现不少的问题。最好是不去使用new。
 
12. void
在javascript中,void是一种运算符。无效无用费解,避免使用它。
相关文章
相关标签/搜索