避免全局变量,避免new
, 避免==
, 避免eval()
尽量减少全局变量的使用。
这包括所有数据类型、对象和函数。
全局变量和函数可以被其他脚本覆盖。
使用局部变量代替,并学习如何使用关闭。
函数中使用的所有变量都应声明为当地的变量。
局部变量必须被宣布与var
, 这let
, 或者const
关键字,否则它们将成为全局变量。
严格模式不允许未声明的变量。
将所有声明放在每个脚本或函数的顶部是一种很好的编码习惯。
这会:
// Declare at the beginning
let firstName, lastName, price, discount, fullPrice;
// Use later
firstName = "John";
lastName = "Doe";
price = 19.90;
discount = 0.10;
fullPrice = price - discount;
这也适用于循环变量:
for (let i = 0; i < 5; i++) {
在声明变量时对其进行初始化是一种很好的编码习惯。
这会:
// Declare and initiate at the beginning
let firstName = "";
let lastName = "";
let price = 0;
let discount = 0;
let fullPrice = 0,
const myArray = [];
const myObject = {};
初始化变量提供了预期用途(和预期数据类型)的想法。
使用 const 声明对象将防止任何类型的意外更改:
let car = {type:"Fiat", model:"500", color:"white"};
car = "Fiat"; // Changes object to string
const car = {type:"Fiat", model:"500", color:"white"};
car = "Fiat"; // Not possible
使用 const 声明数组将防止任何类型的意外更改:
let cars = ["Saab", "Volvo", "BMW"];
cars = 3; // Changes array to number
const cars = ["Saab", "Volvo", "BMW"];
cars = 3; // Not possible
""
代替new String()
0
代替new Number()
false
代替new Boolean()
{}
代替new Object()
[]
代替new Array()
/()/
代替new RegExp()
function (){}
代替new Function()
let x1 = ""; // new primitive string
let x2 = 0; // new primitive number
let x3 = false; // new primitive boolean
const x4 = {}; // new object
const x5 = []; // new array object
const x6 = /()/; // new regexp object
const x7 = function(){}; // new function object
亲自试一试 »
JavaScript 是松散类型的。
变量可以包含所有数据类型。
变量可以更改其数据类型:
请注意数字可能会意外转换为字符串或NaN
(不是数字)。
在进行数学运算时,JavaScript 可以将数字转换为字符串:
let x = 5 + 7; // x.valueOf() is 12, typeof x is a number
let x = 5 + "7"; // x.valueOf() is 57, typeof x is a string
let x = "5" + 7; // x.valueOf() is 57, typeof x is a string
let x = 5 - 7; // x.valueOf() is -2, typeof x is a number
let x = 5 - "7"; // x.valueOf() is -2, typeof x is a number
let x = "5" - 7; // x.valueOf() is -2, typeof x is a number
let x = 5 - "x"; // x.valueOf() is NaN, typeof x is a number
亲自试一试 »
从字符串中减去字符串,不会产生错误,而是返回NaN
(不是数字):
这个==
比较运算符始终在比较之前进行转换(转换为匹配类型)。
这个===
运算符强制比较值和类型:
0 == ""; // true
1 == "1"; // true
1 == true; // true
0 === ""; // false
1 === "1"; // false
1 === true; // false
亲自试一试 »
如果调用函数时缺少参数,则缺少参数的值将设置为undefined
。
未定义的值可能会破坏您的代码。为参数分配默认值是一个好习惯。
ECMAScript 2015允许在函数定义中使用默认参数:
function (a=1, b=1) { /*function code*/ }
阅读有关函数参数和参数的更多信息,请访问功能参数
永远结束你的switch
带有 a 的语句default
。即使你认为没有必要。
switch (new Date().getDay()) {
case 0:
day = "Sunday";
break;
case 1:
day = "Monday";
break;
case 2:
day = "Tuesday";
break;
case 3:
day = "Wednesday";
break;
case 4:
day = "Thursday";
break;
case 5:
day = "Friday";
break;
case 6:
day = "Saturday";
break;
default:
day = "Unknown";
}
亲自试一试 »
始终将数字、字符串或布尔值视为原始值。不作为对象。
将这些类型声明为对象会降低执行速度,并产生令人讨厌的副作用:
let x = "John";
let y = new String("John");
(x === y) // is false because x is a string and y is an object.
亲自试一试 »
或者更糟糕的是:
let x = new String("John");
let y = new String("John");
(x == y) // is false because you cannot compare objects.
亲自试一试 »
这个eval()
函数用于将文本作为代码运行。在几乎所有情况下,都没有必要使用它。
因为它允许运行任意代码,所以它也代表了一个安全问题。
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!