--总结来自:《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是一种运算符。无效无用费解,避免使用它。

javascript的优美与鸡肋的更多相关文章

  1. dart --- 更符合程序员编程习惯的javascript替代者

    dart是google在2011年推出的一门语言,提供较为丰富的lib,并支持将代码转变为javascript,其demo code 和 demo app 也是以web前端代码来展示的. 其语言特性较 ...

  2. 大神是怎样用函数式JavaScript计算数组平均值的

    译者按: 有时候一个算法的直观.简洁.高效是需要作出取舍的. 原文: FUNCTIONAL JAVASCRIPT: FIVE WAYS TO CALCULATE AN AVERAGE WITH ARR ...

  3. [No0000104]JavaScript-基础课程4

    要说 JavaScript 和其他较为常用的语言最大的不同是什么,那无疑就是 JavaScript 是函数式的语言,函数式语言的特点如下: 函数为第一等的元素,即人们常说的一等公民.就是说,在函数式编 ...

  4. 我所了解的JavaScript糟粕和鸡肋

    糟粕 全局变量 众所周知,全局变量在很小的程序中可能会带来方便,但随着程序变得越来大,全局变量将难以处理,全局变量将降低程序的可靠性. 在js中有3种方式定义全局变量 脱离任何函数安排一个var语句  ...

  5. 以优美方式编写JavaScript代码

    英文原文:CoffeeScript: The beautiful way to write JavaScript 我用 JavaScript 编程很多年了,写了大量的 JavaScript 代码,即便 ...

  6. CoffeeScript 更优美的Javascript

    CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. CoffeeScript 尝试用简洁的方式展 ...

  7. 如何写出优美的 JavaScript 代码?

    一.变量相关 (1)变量数量的定义 NO:滥用变量 let kpi = 4; // 定义好了之后再也没用过 function example() { var a = 1; var b = 2; var ...

  8. 【推荐】JavaScript的那些书

    又好久没写东西了,写上一篇的时候还以为接下来的工作会轻松一些,结果未从我所愿呐,又是一阵忙碌.而这段时间穿插着做了很多12年淘宝校园招聘的前端面试,很多同学都有问到,学校里没有前端的课程,那如何学习J ...

  9. 《JavaScript语言精粹》【PDF】下载

    <JavaScript语言精粹>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382204 内容简介 javascript曾是&q ...

随机推荐

  1. 【BZOJ4766】文艺计算姬(prufer序列)

    点此看题面 大致题意: 让你求一个两边各有\(n\)和\(m\)个点的完全二分图有多少个生成树. \(prufer\)序列 这是一道比较经典的利用\(prufer\)序列结论求解答案的计数题. 大致思 ...

  2. c#隐藏tabcontrol选项卡

    隐藏:Tab1.TabPage2.Parent = null;显示:Tab1.TabPage2.Parent =Tab1;tab1为tab控件名,TabPage2为选项卡名.

  3. sql字段为datetime,插入''的时候默认为1900年

    Microsoft SQL Server Database Engine 用两个 4 字节的整数内部存储 datetime 数据类型的值. 第一个 4 字节存储“基础日期”(即 1900 年 1 月  ...

  4. css的基础用法(上)

    css定义: CSS层叠式样表(Cascading  Style Sheets)是一种用来表现html或xml等文件样式的计算机语言.CSS不仅可以静态的修饰网页,还可以配合各种脚本语言动态地对网页个 ...

  5. MySQL配置和启动

    1.首先下载MySQl安装包,解压安装包 打开mysql下面的bin文件夹,双击如图标记的  .exe运行 2.配置Mysql (1)运行程序后点击 next (2)这里有精确配置和标准配置,根据情况 ...

  6. redis 高性能应用

    redis可达到512M/per key 512M=512*1024KB=512*1024*1000B=512*1024*1000*8bit=40亿+ 化整为零40亿,也就是说一位代表一个用户,40亿 ...

  7. js替换字符串中的空格,换行符\r\n或\n替换成<br>

    为了让回车换行符正确显示,需要将 \n 或 \r\n 替换成 <br>.同样地,将空格替换存  .这里我们通过正则表达式来替换. 一.替换所有的空格.回车换行符 //原始字符串 var s ...

  8. LeetCode 中级 - 第k个排列(60)

    可以用数学的方法来解, 因为数字都是从1开始的连续自然数, 排列出现的次序可以推 算出来, 对于n=4, k=15 找到k=15排列的过程: 1 + 对2,3,4的全排列 (3!个) 2 + 对1,3 ...

  9. Linux系统修改/etc/sysconfig/i18n文件,桌面无法正常显示

    在Windows环境下使用SSH Secure Shell Client登陆VMware Workstation中Linux系统查询hive表时,中文显示乱码:数字和url显示为NULL,网上说: 1 ...

  10. centos7中vsftp的搭建

    开启vsftpd:service vsftpd start关闭vsftp:service vsftpd stop 安装vsftpd: yum -y install vsftpd 建立vsftpd帐号: ...