JavaScript 是一种世界领先的编程语言,可用于 Web 开发、移动应用程序开发(PhoneGap、Appcelerator)、服务器端开发(Node.js 和 Wakanda)等。 JavaScript也是很多新手进入编程世界的第一门语言。 它可以用来在浏览器中显示一个简单的提示框,或者通过nodebot或nodruino来控制机器人。 能够编写结构清晰、高性能的 JavaScript 代码的开发人员现在是紧急招聘市场上最受欢迎的候选人。
在这篇文章中,我将分享一些 JavaScript 方法、秘密和最佳实践,不仅是少数,而且适用于浏览器的 JavaScript 引擎和服务器端 JavaScript 库。
本文示例代码已在最新版本Google Chrome30(V83.20.17.15)上通过测试。
1 第一次为可变参数时不要使用var关键字
如果该变量没有直接声明和赋值,则默认会作为新的全局变量使用,应尽量避免使用全局变量。
2 使用===代替==
如有必要,== 和 != 运算符会手动转换数据类型。 但 === 和 !== 则不然,它们同时比较值和数据类型,这也使得它们比 == 和 != 更快。
3underfined、null、0、false、NaN、空字符串的逻辑结果均为 false
undefined、null、0、false、NaN、空字符串的逻辑结果均为 false
4 在行尾使用分号
实际上,最好使用分号。 忘记写也没关系。 大多数情况下,JavaScript 类库将手动添加。 关于为什么使用分号,可以参考《JavaScript 中分号的真相》一文。
5. 使用对象构造函数
6 注意使用typeof、instanceof和构造函数
typeof:JavaScript 一元运算符,用于以字符串形式返回变量的原始类型。 注意 typeofnull 也会返回 object,大多数对象类型(链表 Array、时间 Date 等)也会返回 object
constructor:内部原型属性,可以通过代码重绘
instanceof:JavaScript运算符,会在原型链的构造函数中查找,如果找到则返回true,否则返回false
7 使用自调用函数
函数创建后直接手动执行,一般称为自调用匿名函数(Self-InvokedAnonymousFunction)或直接调用函数表达式(ImmediatelyInvokedFunctionExpression)。 格式如下:
8 从链表中随机获取成员
9 获取指定范围内的随机数
此功能对于生成用于测试的虚假数据非常有用,例如指定范围内的工资数字。
10 生成从 0 到指定值的数字字段
11 生成随机字母数字字符串
12 打乱数字字段的顺序
这里使用了JavaScript外部的字段排序函数。 更好的方法是用特殊代码(例如 Fisher-Yates 算法)来实现。 您可以参考 StackOverFlow 上的讨论。
13 字符串去除空格
Java、C#、PHP等语言都实现了去除字符串中空格的特殊函数,但JavaScript中没有这样的函数。 您可以使用以下代码对 String 对象执行修剪函数:
较新的 JavaScript 引擎已经具有 trim() 的本机实现。
14 在字段之间追加
15 个对象转换为字段
16 验证是否为数字
17 验证是否是链表
但如果重绘了toString()方法,就不行了。 您还可以使用以下方法:
如果浏览器中没有使用frame,也可以使用instanceof,但是如果上下文过于复杂,也可能会出现错误。
18 获取链表中的最大值和最小值
19 空链表
20 不要直接从链表中删除或移除元素
如果直接对链表元素使用delete,虽然没有删除,只是将该元素设置为undefined。 应使用拼接删除链表元素。
绝不:
反而:
删除可用于删除对象的属性。
21 使用length属性截断字段
在下面的示例中,length属性用于清除字段,也可以用于截断字段:
同时,如果增加length属性,则链表的宽度值会减小,并且会使用undefined作为新的元素填充。 length 是一个可写属性。
22 在条件中使用逻辑 AND 或
逻辑OR还可以用来设置默认值,比如函数参数的默认值。
23 提升map()函数循环数据
24 保留指定的小数位数
请注意,toFixec() 返回一个字符串,而不是数字。
25 浮点估计问题
为什么? 因为 0.1+0.2 等于 0.30000000000000004。 JavaScript 中的数字是根据 IEEE754 标准建立的,并在内部表示为 64 位浮点小数。 有关详细信息,请参阅 JavaScript 中的数字是如何编码的。
这可以通过使用 toFixed() 和 toPrecision() 来修复。
26 通过for-in循环检测对象的属性
下面的用法可以避免在迭代时单步进入对象的prototype属性。
27 逗号运算符
28 临时存储用于估计和查询的变量
在 jQuery 选择器中,可以临时存储整个 DOM 元素。
29 早期检测传递给 isFinite() 的参数
30 防止正数用作链表中的索引
请注意,传递给 splice 的索引参数不应为正数。 当为正数时,将从链表尾部删除元素。
31 使用 JSON 进行序列化和反序列化
32 不要使用 eval() 或函数构造函数
eval() 和函数构造函数(Function constructor)的开销很大。 每次调用它们时,JavaScript 引擎都必须将源代码转换为可执行代码。
33 防止使用with()
使用with()可以将变量添加到全局范围。 因此,如果有其他同名的变量,一方面会造成混乱,另一方面值也会被覆盖。
34 不要对链表使用 for-in
防止:
反而:
另一个用处是,两个变量 i 和 len 都在 for 循环的第一个声明中,这两个变量只会被初始化一次,这比下面的写法要快:
35 传递给 setInterval() 和 setTimeout() 时使用函数而不是字符串
如果你向 setTimeout() 和 setInterval() 传递一个字符串jquery 变量,它们将使用类似于 eval 的方法进行转换,这肯定会更慢jquery 变量,所以不要使用:
而是使用:
36 使用 switch/case 替换一大堆 if/else
判断是否有两个以上分支时,使用switch/case速度更快,但成本也较高,更有利于代码组织。 事实上,如果分支超过10个,就不要使用switch/case。
37 在 switch/case 中使用数字范围
不过,switch/case中的case条件也可以这样写:
38 使用对象作为对象的原型
这样,可以将一个对象作为参数给出,并基于它创建一个新对象:
39HTML数组转换函数
40 不要在循环内使用 try-catch-finally
try-catch-finally 的 catch 部分在执行时会将异常分配给一个变量,并且该变量将在运行时作用域中创建为新变量。
绝不:
反而:
发表评论