Javascript语法易出错方面总结

简介:

Javascript是一种语法自由度很高、设计不完全成熟的动态脚本语言。由于其语法高度灵活及其它种种原因,所以使用它编写的代码的可读性极差(至少我感觉如此)。相比之下,Python语言语法,在我所熟知的多种语言中,最值得推荐。

 

在本文中我尽量记录并逐渐补充使用js时容易出错的一些语法表达及一些难点,并尽量在每次补充后到置顶显示。

 

var使用

 

定义变量时省略var是不安全的,不过是合法的。定义的变量的作用域取决于定义的位置。这时无论该变量是在什么位置定义的,解释器都会赋予该变量以全局作用域

 

Crockford推荐的一些Javascript编程风格

 

注:此部分出自阮一峰的博客《http://www.ruanyifeng.com/blog/2012/04/javascript_programming_style.html》。

 

1.大括号的位置
===================

因为Javascript会自动添加句末的分号,导致一些难以察觉的错误。
return
{
key:value;
};
上面的代码的原意,是要返回一个对象,但实际上返回的是undefined,因为Javascript自动在return语句后面添加了分号。为了避免这一类错误,需要写成下面这样:
return {
key : value;
};


规则1:表示区块起首的大括号,不要另起一行。

2.圆括号
===============

圆括号(parentheses)在Javascript中有两种作用,一种表示调用函数,另一种表示不同的值的组合(grouping)。我们可以用空格,区分这两种不同的括号。

  规则2:调用函数的时候,函数名与左括号之间没有空格。
规则3:函数名与参数序列之间,没有空格。
规则4:所有其他语法元素与左括号之间,都有一个空格。

按照上面的规则,下面的写法都是不规范的:
foo (bar)
return(a+b);
if(a === 0) {...}
function foo (b) {...}
function(x) {...}

3.分号
====================

分号表示语句的结束。大多数情况下,如果你省略了句尾的分号,Javascript会自动添加。
var a = 1
等同于
var a = 1;
因此,有人提倡省略句尾的分号。但麻烦的是,如果下一行的第一个字元(token)是下面这五个字符之一,Javascript将不对上一行句尾添加分号:"("、"["、"/"、"+"和"-"。
x = y
(function (){
...
})();
上面的代码等同于
x = y(function (){...})();
因此,
规则5:不要省略句末的分号。

4.with语句
=====================

with可以减少代码的书写,但是会造成混淆。
with (o) {
foo = bar;
}
上面的代码,可以有四种运行结果:
o.foo = bar;
o.foo = o.bar;
foo = bar;
foo = o.bar;
这四种结果都可能发生,取决于不同的变量是否有定义。因此,

  规则6:不要使用with语句。

5.相等和严格相等
===================

Javascript有两个表示"相等"的运算符:"相等"(==)和"严格相等"(===)。
因为"相等"运算符会自动转换变量类型,造成很多意想不到的情况:
0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
" \t\r\n " == 0 // true
因此,
规则7:不要使用"相等"(==)运算符,只使用"严格相等"(===)运算符。

6.语句的合并
======================

有些程序员追求简洁,喜欢合并不同目的的语句。比如,原来的语句是
a = b;
if (a) {...}
他喜欢写成下面这样:
if (a = b) {...}
虽然语句少了一行,但是可读性大打折扣,而且会造成误读,让别人误以为这行代码的意思是:
if (a === b){...}
另外一种情况是,有些程序员喜欢在同一行中赋值多个变量:
var a = b = 0;
他以为,这行代码等同于
var a = 0, b = 0;
实际上不是,它的真正效果是下面这样:
b = 0;

  var a = b;
因此,

  规则8:不要将不同目的的语句,合并成一行。

7.变量声明
======================

Javascript会自动将变量声明"提升"(hoist)到代码块(block)的头部。
if (!o) {
var o = {};
}
等同于
var o;
if (!o) {
o = {};
}
为了避免可能出现的问题,不如把变量声明都放在代码块的头部。
for (var i ...) {...}
最好写成:
var i;

  for (i ...) {...,}
因此,
规则9:所有变量声明都放在函数的头部。
规则10:所有函数都在使用之前定义。

8.全局变量
===================

Javascript最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。

  规则11:避免使用全局变量;如果不得不使用,用大写字母表示变量名,比如UPPER_CASE。

9.new命令
===================

Javascript使用new命令,从建构函数生成一个新对象。
var o = new myObject();
这种做法的问题是,一旦你忘了加上new,myObject()内部的this关键字就会指向全局对象,导致所有绑定在this上面的变量,都变成全部变量。

  规则12:不要使用new命令,改用Object.create()命令。

如果不得不使用new,为了防止出错,最好在视觉上把建构函数与其他函数区分开来。
规则13:建构函数的函数名,采用首字母大写(InitialCap);其他函数名,一律首字母小写。

10.自增和自减运算符
==========================

自增(++)和自减(--)运算符,放在变量的前面或后面,返回的值不一样,很容易发生错误。
事实上,所有的++运算符都可以用"+= 1"代替。
++x
等同于
x += 1;
代码变得更清晰了。有一个很可笑的例子,某个Javascript函数库的源代码中出现了下面的片段:
++x;
++x;
这个程序员忘了,还有更简单、更合理的写法:
x += 2;
因此,

  规则14:不要使用自增(++)和自减(--)运算符,用+=和-=代替。

11.区块
=====================

如果循环和判断的代码体只有一行,Javascript允许该区块(block)省略大括号。
下面的代码
if (a) b(); c();
原意可能是
if (a) { b(); c();}
但是,实际效果是
if (a) { b();} c();
因此,

  规则15:总是使用大括号表示区块。

 

 

 



本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/1615048,如需转载请自行联系原作者







相关文章
|
3月前
|
存储 JavaScript 前端开发
Node.js的基本语法
【8月更文挑战第12天】Node.js的基本语法
119 1
|
19天前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
24天前
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
13 0
|
3月前
|
JavaScript 前端开发
JavaScript基础&实战(1)js的基本语法、标识符、数据类型
这篇文章是JavaScript基础与实战教程的第一部分,涵盖了JavaScript的基本语法、标识符、数据类型以及如何进行强制类型转换,通过代码示例介绍了JS的输出语句、编写位置和数据类型转换方法。
JavaScript基础&实战(1)js的基本语法、标识符、数据类型
|
3月前
|
前端开发 JavaScript 程序员
前端 JavaScript 的 _ 语法是个什么鬼?
前端 JavaScript 的 _ 语法是个什么鬼?
|
4月前
|
缓存 JavaScript 前端开发
前端框架与库 - Vue.js基础:模板语法、数据绑定
【7月更文挑战第14天】Vue.js 是渐进式框架,以简洁API和高效数据绑定知名。本文聚焦模板语法与数据绑定,解释常见问题和易错点,助力初学者避坑。模板语法中,{{ expression }} 用于渲染值,v-bind/: 用于动态绑定属性。数据绑定涉及文本、属性和事件,注意v-model适用于表单元素,计算属性有缓存。理解正确用法,借助文档和IDE,可提升开发质量和效率。善用Vue.js,打造响应式UI。
128 4
|
5月前
|
存储 JavaScript 前端开发
JavaScript 语法
JavaScript 语法
35 5
|
4月前
|
存储 JavaScript 前端开发
|
5月前
|
JavaScript 前端开发
JavaScript语法关键点:变量用`var`、`let`、`const`声明
【6月更文挑战第22天】JavaScript语法关键点:变量用`var`、`let`、`const`声明;七种数据类型包括`Number`、`String`、`Boolean`、`Null`、`Undefined`、`Symbol`和`Object`;运算符如算术、比较、逻辑和赋值;流程控制有`if...else`、`switch`和各种循环。了解这些是JS编程的基础。
58 3
|
4月前
|
前端开发 JavaScript
js【详解】Promise(含 Promise 的三种状态及其变化,创建 Promise, Promise.all 语法、Promise.all 实战范例、手写 Promise.all)
js【详解】Promise(含 Promise 的三种状态及其变化,创建 Promise, Promise.all 语法、Promise.all 实战范例、手写 Promise.all)
543 0
下一篇
无影云桌面