JavaScript的基本规范
1.不要在同一行声明多个变量
在JavaScript中,使用关键字 var、let 或 const 来声明变量。这些关键字表示在当前作用域中创建一个新的变量,并可以选择性地给它们赋初始值。
然而,虽然你可以在同一行使用逗号分隔多个变量名,但每个变量都需要使用相应的关键字进行声明。这是因为 JavaScript 的语法规范要求每个变量声明都必须以关键字开始。
涉及知识点var let const
var 是声明变量的关键字。var 声明的变量具有函数作用域或全局作用域,并且可以被重新赋值。使用 var 声明的变量会存在变量提升的现象,即变量可以在声明之前使用
console.log(a); // 输出 undefined
var a = 10;
console.log(a); // 输出 10
let:在ES6引入的 let 是块级作用域的关键字,用于声明可变的变量。let 声明的变量只在块级作用域中有效,并且可以被重新赋值。与 var 不同,使用 let 声明的变量不存在变量提升,必须在声明后才能使用。
console.log(a); // 抛出错误,a未定义
let a = 10;
console.log(a); // 输出 10
const 同样在ES6引入,表示声明一个常量。const 声明的变量也具有块级作用域,并且不能被重新赋值,它是一个只读的常量。一旦被赋值后,就不能再改变其值。
const PI = 3.1;
PI = 3; // 抛出错误,常量不能被重新赋值
2.请使用===/!==
来比较true/false
或者数值
在JavaScript中,使用= = =和!= =来比较true、false或者数值,是因为它们是严格相等运算符和严格不相等运算符。
= = =用于判断两个值是否相等且类型也相同,如果相等且类型相同,则返回true,否则返回false。!==则表示两个值不相等或者类型不同时返回true,相等且类型相同时返回false。
与之相对的是相等运算符 = = 和不相等运算符 !=,它们允许进行隐式的类型转换。例如,使用等号比较数字和字符串时,会尝试将字符串转换为数字进行比较。而严格相等运算符 = = = 和严格不相等运算符 != = 不进行类型转换,只有在值和类型都相等时才返回true。
使用严格相等运算符 = = = 和严格不相等运算符 != = 可以避免一些常见的类型转换错误和意外情况。它们提供了更严格的比较方式,能够更准确地判断两个值是否完全相等,既包括值的内容,也包括值的类型。
console.log(5 === 5); // 输出 true
console.log("10" === 10); // 输出 false,类型不同
console.log(true === 1); // 输出 false,类型不同
console.log(5 !== "5"); // 输出 true,值和类型都不相等
console.log(null !== undefined); // 输出 true,值和类型都不相等
3.使用对象字面量替代new Array
这种形式
使用字面量替代new Array的好处有很多
1.语法简洁:对象字面量的语法更为简洁和直观。使用对象字面量创建数组只需使用方括号[],将元素用逗号分隔即可,而使用new Array则需要额外的构造函数调用和圆括号。
2.避免歧义:在一些情况下,使用new Array可能导致意外的结果。当传递单个数字参数给new Array时,它会创建一个具有指定长度的稀疏数组(Sparse Array)。例如,new Array(5)将创建一个长度为5的空数组。而使用对象字面量[5]则会创建一个只有一个元素的数组,元素的值为5。
3.初始化元素:通过对象字面量创建数组时,可以直接在方括号内指定数组的初始元素。例如,[1, 2, 3]将创建一个包含3个元素的数组,而不需要额外的语句来添加元素。
4.可读性:对象字面量的语法更加直观和易读。使用方括号和逗号表示数组元素,可以清晰地看出数组的内容,而不必将数组元素的值放在构造函数的参数中。
4.不要使用全局函数
也可以说成不推荐使用,为什么不推荐那?
1.命名冲突:在JavaScript中,全局作用域下的函数具有全局可见性,如果多个库或脚本都定义了相同名称的全局函数,就会发生命名冲突。这可能导致函数被覆盖或产生意想不到的错误。
2.隐式依赖:全局函数可以在任何地方被调用,这样就使得代码的依赖关系变得不明确。如果函数内部使用了其他全局变量或函数,那么就需要确保这些依赖项在调用之前已经存在。这增加了代码的复杂性,使得代码更难以理解和维护。
3.可维护性:通过将函数封装在特定的模块或命名空间中,可以提高代码的可维护性。将函数声明在局部作用域中,可以减少对全局状态的依赖,并且可以更好地控制函数的访问权限。
4.可测试性:全局函数难以进行单元测试,因为它们无法被轻易地模拟或替换。相反,将函数封装在模块中,可以更容易地进行单元测试,因为可以通过依赖注入或模块的替代实现来隔离和测试函数。
5.Switch
语句必须带有default
分支
原因无它,添加default分支是为了处理未匹配到任何case的情况
6.If
语句必须使用大括号
1.明确代码块范围:使用大括号可以明确指定if语句的代码块范围,即被执行的语句。这样可以避免代码在逻辑上被误解或产生错误的结果。如果省略了大括号,那么if语句只能包含单个语句,这可能导致混淆并引发潜在错误。
2.增加代码的可读性:使用大括号可以提高代码的可读性。通过明确定义代码块范围,在阅读代码时可以更清楚地理解逻辑和代码的意图。这对于团队合作、代码维护以及以后可能的更改非常重要。
3.避免错误:如果不使用大括号,当需要在if语句内添加更多的语句时,可能会犯下错误。因为没有大括号的限制,新添加的语句可能会被错误地视为与if无关的语句。这可能导致逻辑错误或产生预期之外的结果。
4.符合编码规范:许多编码规范和最佳实践要求在if语句中始终使用大括号。这是为了统一团队的代码风格,并减少潜在的错误。符合这些规范可以提高代码的一致性和可维护性。