JavaScript编写高质量代码的核心技巧:变量、循环与类型转换

作者:工具松鼠时间:2026-10-26 19:25:53浏览:453

本文深入解析JavaScript编写高质量代码的关键实践。重点探讨变量声明的三种形式:全局变量陷阱、var的作用域差异以及单var声明模式;详细对比for循环与for-in循环的最佳使用场景及性能优化技巧;强调避免隐式类型转换和eval的使用,并规范parseInt基数参数设置,帮助开发者提升代码健壮性与执行效率。

变量声明与全局变量陷阱

一、变量



•全局变量


JavaScript具有两个显著特征,使得意外创建全局变量变得非常容易。首先,开发者甚至可以在不显式声明变量的情况下直接使用它;其次,JavaScript存在隐式全局的概念,即任何未被声明的变量都会自动成为全局对象的一个属性(注意:这并非严格意义上的全局变量,因为可以使用delete操作符将其删除)。


代码如下:

 
function sum(x,y) {
// result 未声明,为隐式全局变量
result = x + y;
return result;
} 
function foo() {
// 使用任务链进行部分var声明,b为隐式全局变量
var a = b = 1;
} 

建议:


代码如下:

 
function (x,y) {
var a ,b ;
a = b = 1;//a,b 为局部变量
} 

•var作用


通过var关键字创建的全局变量(即在函数外部程序中创建的变量)是无法被删除的。相反,未使用var创建的隐式全局变量(无论其是否在函数内部创建)是可以被删除的。



代码如下:

 
// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}()); 
// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"

•单var形式声明变量


在函数顶部使用单一的var语句是一种较为实用的编码形式。所有已声明但未初始化的变量,其初始值均为undefined。



代码如下:

 
function func() {
var a = 1,
b = 2,
sum = a + b,
myobject = {},
i,
j;
// function body...
} 

•var散布问题


代码如下:

 
// 反例
myname = "global"; // 全局变量
function func() {
alert(myname); //"undefined" var myname = "local"; alert(myname); // "local" } func();等同于:
myname = "global"; // global variable
function func() {
var myname; // 等同于 -> var myname = undefined;
alert(myname); // "undefined"
myname = "local";
alert(myname); // "local"}
func();

for循环优化与for-in使用规范

二 for循环



•建议使用


代码如下:

 
function looper() {
var i = 0,
max,
myarray = [];
// ... 
for (i = 0, max = myarray.length; i < max; i++) {
// 使用myarray[i]做点什么
} 
} 

使用以下表达式代替i++


代码如下:

 
i = i + 1
i += 1以下两种循环方式更快
//第一种变化的形式:
var i, myarray = [];
for (i = myarray.length; i–-;) {
// 使用myarray[i]做点什么
} 
//第二种使用while循环:
var myarray = [],
i = myarray.length;
while (i–-) {
// 使用myarray[i]做点什么
} 

•for-in循环


for-in循环主要应用于非数组对象的遍历,而对于数组则建议使用常规的for循环。在使用for-in循环遍历对象属性时,应结合hasOwnProperty()方法来过滤掉从原型链继承下来的属性。



类型转换、eval规避与编程规范

三 避免隐式类型转换



•坚持使用===和!==



四 避免使用eval,以及避免给setInterval(), setTimeout()和Function()构造函数传递字符串,用函数代替。



五 parseInt()数值转换



建议给基数参数赋值,


代码如下:

 
var month = "06",
year = "09";
month = parseInt(month, 10);//开头为0的字符串会被当做8进制处理
year = parseInt(year, 10);

六 编程规范



构造函数命名:MyConstructor();



一般函数命名:myFunction();



变量命名:firstName;



私有属性或方法:_secondeName,



常量:PI,MAX;

作者最新文章