每日十条JavaScript经验技巧(一)


Posted in Javascript onJune 23, 2016

1. 不使用script自闭合标签

script中使用自闭合标签,虽然他在XHTML中合法,但是不符合HTML规范,而且得不到某些浏览器的正确解析。我曾经就在引入EXT时使用此方式,导致无法正确执行脚本。

<script src="example.js"/> --> <script src="example.js"></script>

2. 将脚本放到</body>前面

如果将脚本文件放到<head>中去,则在显示页面前先得下载执行脚本,增加了用户等待的时间。样式表放在<head>中防止内容显示不正常。一般方式如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <link rel="stylesheet" type="text/css" href="theme.css" />
</head>
<body>
 <!-- html代码 -->
 <script src="example.js"/>
</body>
</html>

3. 在函数内使用严格模式

如果在函数外部使用严格模式,则有可能会使第三方类库,和同事的代码不能正常工作,在函数内部则只能影响自己的代码,不至于影响到别人的代码。

function myfunction(){
 "use strict";
 //函数代码
}

4. 不要省略语句结尾的分号

代码结尾处没有分号容易引起压缩错误,另外在某些情况下可以增进代码的性能,应为解释器不比在花时间推测在什么地方插入分号。还有一种更常见的问题就是,自动插入分号有时会出错,所以并不建议省略分号。

5. 使用var定义变量

定义变量时使用var关键字,并且全部提前至函数的最开始。
这样做的好处就会避免无意识的创建出全局变量,而且让你的代码更容易理解。

function myfunction(){
 var result = 10 + value;
 var value = 10;
 return result;
}

这个函数语法上是没有问题的,但是不是很直观,不符合人的逻辑,修改如下会更好:

funciton myfunction(){
  var result;
  var value;
  result = 10 + value;
  value = 10;
  return result;
 }

给大家解释一下,上面两个代码是等价的,result的值都是NAN.JavaScript会把函数内所有的变量声明提升到函数的最开始,代码一在代码执行时会变成代码二的样子,当运行到result = 10 + value;时,value的值为undefined,和10相加为NAN,然后value被赋值为10。

关于全局变量带来的问题,大家想必也比较清楚,不然也不会出现命名空间的概念。

6. 函数先声明再使用

和变量声明一样,函数声明也会被JavaScript引擎提前,因此在代码中,函数的调用可以出现在函数的声明之前。 还有一点值得注意,函数声明不应该出现在语句块之内,比如:

if (condition) {
 function myfunction(){
  alert("true");
 }
}else{
 function myfunction(){
  alert("false");
 }
}
myfunction();

运行代码我们发现会输出会和浏览器有关,在Chrome 51和Firefox 46输出true,IE 10下输出false。所以尽量避免在语句块中声明函数。

7. 慎用typeof underfined null判断

null是一个特殊值,我们经常和undefined混淆,下列场景应使用null:

  1. 用来初始化一个变量,这个变量可能赋值为一个对象。
  2. 用来和一个已经初始化的变量比较。
  3. 当函数的参数期望传入对象时,用作参数传入。
  4. 当函数的返回值期望是对象时,用作返回值传出。

下面一些情况不应该使用null:

  1. 不要使用null来检查是否传入了某个参数。
  2. 不要用null来检查一个变量是不是初始化。

理解null最好的方式是将他当做对象的占位符。我们经常将null和undefined搞混的原因是我们认为null和undefined都是变量未初始化,但是只有undefin代表一个变量还没有被初始化,null代表初始化为对象。看如下代码:

var person;
console.log(typeof person);  //undefined
console.log(typeof foo);   //undefined
var house = null;
console.log(typeof house);  //object

所以尽量不要用typeof判断变量是否初始化,你并不能确定是变量不存在还是变量未初始化,返回null是你也不能确定变量有没有被正确的赋值,所以小心使用typeof。

8. 小心使用Number类型

想必大家也知道JavaScript整数支持十进制,八进制,和十六进制的字面值。八进制中如果字面值中的数值超过了范围,那么前导零将会被忽略,后面的数值当做十进制解析。

console.log(012);    //10
console.lgo(082);    //82

如果将八进制和十六进制用于小数则会语法错误。还有一点,八进制字面量在严格模式下是无效的。 关于浮点数计算误差的问题大家也都清楚,凡是基于IEEE754数值的浮点计算都是这样,所以永远不要测试某个特定的浮点数值。
在数值类型中有一个比较特殊的值,NaN(Not a Number),这个数值用于表示本来应该返回数值但是返回的不是数值类型。NaN和任何值都不相等,包括NaN本身。我们可以用isNaN()函数测试。

9. 使用逻辑运算动态赋值

大家比较喜欢的操作

var person={
  age:10
}
var condition;
var myVar = condition && person;
alert(myVar)

如果condition转为boolean类型为false,则myVar = condition,若为true,则myVar = person。

var person={
    age:10
  }
var condition;
var myVar = condition || person;
  alert(myVar)

如果condition转换为boolean为true,则myVar = condition,若为false,则myVar = person。

10. 不使用with语句

不使用with的一个重要原因是,在严格模式下语法本身就是禁用with语句的,这也表明ECMAScript委员会确信不应使用with。我们看如下例子:

var book = {
 title : "Maintainable JavaScript",
 author: "Nicholas C. Zakas"
};
var message = "The book is ";
with(book) {
 message += title;
 message += "by " + author;
}

上述代码的问题在于我们很难分辨title和author出现的位置,也难分辨出message到地址一个局部变量还是book的一个属性,而且JavaScript引擎和压缩工具无法对这段代码进行优化,应为它们无法猜出代码的正确含义。

好了,已经十条了,我们下一个十条再见。

Javascript 相关文章推荐
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
Mar 08 Javascript
JavaScript入门教程(8) Location地址对象
Jan 31 Javascript
IE6/7/8/9不支持exec的简写方式
May 25 Javascript
alert中断settimeout计时功能
Jul 26 Javascript
Mac/Windows下如何安装Node.js
Nov 22 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
May 13 Javascript
检查表单元素的值是否为空的实例代码
Jun 16 Javascript
JS模拟的Map类实现方法
Jun 17 Javascript
Node.js学习入门
Jan 03 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
Mar 16 Javascript
js实现tab栏切换效果
Aug 02 Javascript
Ext JS动态加载JavaScript创建窗体的方法
Jun 23 #Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 #Javascript
JavaScript基于原型链的继承
Jun 22 #Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 #Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 #Javascript
浅析jQuery Ajax通用js封装
Jun 22 #Javascript
Javascript如何判断数据类型和数组类型
Jun 22 #Javascript
You might like
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
jquery实现从数组移除指定的值
2015/06/24 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python的词法分析与语法分析
2013/05/18 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
大班上学期幼儿评语
2014/04/30 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
Python3 类型标注支持操作
2021/06/02 Python
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android