编写可维护的JavaScript
第04章 变量、函数和运算符
4.1 变量声明
- 所有变量声明提前
- 将所有的var语句合并成一个,每个变量的初始化独占一行。赋值运算符对齐,没有赋值的变量放在末尾。注意每个变量之间用逗号“,”隔开,不能用分号
function movable(i,j){
// 我并不推荐这种写法 因为容易将末尾的逗号(,) 写成分号(;)
// 这会导致意外的创建全局变量
var i = 100,
j = 1001,
value = "fu2",
txt;
function test(){
}
}
- 这里推荐每一个变量都用一个 var 声明:
function movable(i,j){
var i = 100;
var j = 1001;
var value = "fu2";
var txt;
function test(){
}
}
4.2 函数声明
建议先声明再调用
4.3 立即调用的函数 匿名函数
匿名函数,即为没有函数名的函数
将匿名函数赋值给变量或者属性:
var doSomething = function() {
//函数体
};
将函数的执行结果赋值给变量(在函数后面加上一对圆括号)
var doSomething = function() {
//函数体
return {
message:"Hi"
}
}();
这种情况下,在没有读完整个代码,完全不知道是将函数整体赋值给变量,还是将函数执行结果赋值给变量。我们可以将整个函数用一对圆括号包裹起来,来做区分:
var doSomething = (function() {
//函数体
return {
message:"Hi"
}
}());
4.4严格模式
"use strict"
推荐在函数内部使用该语句。这样就只会在该函数内部使用严格模式。
ES6 已经完全使用严格模式
4.5 相等
JavaScript具有强制类型转换机制(type coercion)。
使用相等运算符==和!=做判断时,如果两个值得类型不同时,这两个运算符都会将做比较的两个值进行强制类型转换。这会导致在很多实际情况下,代码并不按照我们所期望的方式运行。
如果数字和字符串进行比较,字符串会搜西安转换为数字,然后进行比较:
// 比较数字5和字符串5
console.log(5 == "5"); // true
// 比较数字25和十六进制的字符串
console.log(25 == "0x19"); // true
当发生强制类型转换时,字符串会被转换成数字,类似使用Number()转换函数。因为Number()可以正确解析十六进制的格式,它会将看起来像十六进制的数字转换为十进制数,然后再进行比较。
如果一个布尔值和数字比较,布尔值会首先转换为数字,然后再进行比较。false:0,true:1。
// 数字 1 和 true 比较
console.log(1 == true); // true
// 数字 0 和 false 比较
console.log(0 == false); // true
// 数字 2 和 false 比较
console.log(2 == true); // false
如果其中一个值是对象而另一个不是,则会首先调用对象的valueOf()方法,得到原始类型值再进行比较。如果没有定义valueOf(),则调用toString()。
var object = {
toString:function(){
return "0x19";
}
};
console.log(object == 25); // true
null 和 undefined,根据ECMAScript标准规范的描述,这两个特殊值被认为是相等的。
console.log(null == undefined); // true
由于强制类型转换的缘故,我们推荐不要使用==和!=,而是使用===和!==。这两个运算符可以避免变量进行强类型转换。因此,如果两个值的类型不一样,则认为它们不相等,这样就可以让你的比较语句执行比较时行为一致。
// 比较数字5和字符串5
console.log(5 == "5"); // true
console.log(5 === "5"); // false
// 比较数字25和十六进制的字符串
console.log(25 == "0x19"); // true
console.log(25 === "0x19"); // false
// 数字 1 和 true 比较
console.log(1 == true); // true
console.log(1 === true); // false
// 数字 0 和 false 比较
console.log(0 == false); // true
console.log(0 === false); // false
// 数字 2 和 false 比较
console.log(2 == true); // false
console.log(2 === true); // false
var object = {
toString:function(){
return "0x19";
}
};
// 一个对象和 25 比较
console.log(object == 25); // true
console.log(object === 25); // false
// null 和 undefined 比较
console.log(null == undefined); // true
console.log(null === undefined); // false