百度SS Javascript编码规范

1、变量、方法命名必须匹配正则:/^[$_a-zA-Z]\w*$/

  1. /**
  2. * 虽然Javascript引擎支持多种格式命名的变量,
  3. * 比如下面这样的变量,Javascript引擎依然能正常解析
  4. * 但是,禁止这样定义!
  5. */
  6. var \u0041 = "A"; //最终会被解析为:var A = "A";
  7. var 中国 = "中国"; //以中文命名的变量

2、变量命名不能用关键字、保留字

  1. /**
  2. * Javascript关键字列表
  3. */
  4. [
  5. "break", "case", "catch", "const", "continue",
  6. "default", "delete", "do", "else", "finally",
  7. "for", "function", "if", "in", "instanceof",
  8. "new", "return", "switch", "throw", "try",
  9. "typeof", "var", "void", "while", "with",
  10. "false", "true", "null", "undefined"
  11. ]
  12.  
  13. /**
  14. * Javascript保留字列表
  15. */
  16. [
  17. "abstract", "boolean", "byte", "char", "class",
  18. "debugger", "double", "enum", "export", "extends",
  19. "final", "float", "goto", "implements", "import",
  20. "int", "interface", "long", "native", "package",
  21. "private", "protected", "public", "short", "static",
  22. "super", "synchronized", "throws", "transient", "volatile"
  23. ]

3、正则的修饰符只能是[i、g、m]组合

  1. /**
  2. * 下面的这个正则表达式修饰符不合法,只能有igm组成,或者无
  3. */
  4. var reg = /\d/abcdigm; //修饰符“abcdigm”不合法
  5.  
  6. //应该改为:
  7. var reg = /\d/igm;

4、数组字面量和json(object字面量)的最后一个item后,不能有多余的逗号“,”

  1. /**
  2. * 下面这个数组定义是不合法的,
  3. * 数组最后一项“3”后多了一个逗号“,”
  4. * 在IE下会报错
  5. */
  6. var arr = [1,2,3,]; //数组最后一项“3”后多了一个逗号“,”
  7.  
  8. //应该改为:
  9. var arr = [1,2,3];
  10.  
  11. /**
  12. * 下面这个json定义是不合法的,
  13. * json字面量的最后一个key,不能有多余的逗号“,”
  14. * 在IE下会报错
  15. */
  16. var obj = {
  17. a : "a",
  18. b : "b", //这是json字面量的最后一个key,不能有多余的逗号“,”
  19. };
  20.  
  21. //应该改为:
  22. var obj = {
  23. a : "a",
  24. b : "b"
  25. };

5、json字面量的key不能是javascript关键字或保留字

  1. /**
  2. * 下面的json定义是不合法的,因为采用了javascript关键字作为key
  3. * 这在IE下会报错,YUI压缩时也会报错
  4. */
  5. var obj = {
  6. var : 1 //这在IE下会报错
  7. };
  8.  
  9. //改成如下格式可以被正确解析,但依然不推荐这样做
  10. var obj = {
  11. "var" : 1
  12. };
  13. //因为在IE下,如果通过如下方式获取该值,依然会报错
  14. var value = obj.var; //error!
  15. //改为下面形式可以正确解析
  16. var value = obj["var"];

6、从json(object字面量)中获取value时,如果key为关键字或保留字,禁止用“obj.key”的方式

  1. /**
  2. * 如果有json对象为:obj = {float:1},
  3. * 在代码中要获取obj对象的float字段内容,不能通过obj.float的方式获取,
  4. * 这在YUI压缩的时候会报错
  5. */
  6. var obj = {
  7. float : 1
  8. };
  9. var value = obj.float; //这在YUI压缩时直接报错
  10.  
  11. //如果真有这样的case,应该改成这样:
  12. var obj = {
  13. "float" : 1
  14. };
  15. var value = obj["float"];
  16.  
  17. //PS:虽然上面的方式可以正确的通过编译,在各种浏览器中叶能正确的解析,但是依然不推荐使用!
  18. //json参考文档:http://www.json.org/

7、禁止在代码中出现仅IE支持的注释

  1. /**
  2. * 仅IE支持的javascript条件注释,是以"/ * @"开始,以"@ * /"结束的,
  3. * 比如下面的注释,在代码中严格禁止
  4. */
  5.  
  6. /*@cc_on alert(4 - @*/ 3 /*@)@*/
  7. //上面的这段注释,在IE浏览器中,将会被解释为:alert(4 - 3),最终alert(1)
  8. //而在其他浏览器中,会得到:3

8、function的定义方式

  1. /**
  2. * 只允许出现如下三种形式的function的定义
  3. */
  4. //方式一:
  5. function funcName(){
  6. //TODO
  7. }
  8.  
  9. //方法二:
  10. var funcName = function(){
  11. //TODO
  12. }; //注意,这里必须加分号“;”具体原因请看第13条关于分号“;”的解释
  13.  
  14. //方式三:(同二)
  15. ClassA.xxx = function(){
  16. //TODO
  17. };
  18.  
  19. /**
  20. * 下面这样的定义方式是禁止的
  21. */
  22. var funcName = function funcName2(){
  23. //TODO
  24. };
  25. //上面这样的定义,仅IE中会认为funcName和funcName2都存在,
  26. //FireFox、Chrome中仅你能解释funcName,而funcName2不存在
  27.  
  28. /**
  29. * 在IE里,var foo = function foo2(){}
  30. * foo2能被外部访问是IE的bug,且foo !== foo2,在IE6/7/8/9中的确不建议这么使用它。
  31. * 但是ES5中取消了arguments.callee,当使用use strict模式,这就意味着任何需要使用递归的地方都需要这么定义才能保证函数的安全性
  32. */

9、禁止在行尾用“\”来拼接字符串

  1. /**
  2. * 在行尾通过“\”的方式拼接字符串,在YUI压缩的时候,
  3. * 下一行开头的一片空白会被解析为正常的字符,而造成无法被压缩的现象!
  4. * 另外,下一行的空白字符在非IE浏览器中,会被当成TextNode而占位解析!
  5. * 影响页面布局
  6. */
  7. var str = '<div>\
  8. <div class="header"></div>\
  9. <div class="body"></div>\
  10. <div class="footer"></div>\
  11. </div>';
  12.  
  13. //一种比上面稍微好点儿的办法,是多个字符串“+”连接
  14. //但是这种方法会创建多个字符串常量,每次执行“+”操作都会创建新的常量
  15. //从而影响性能
  16. //uglifyjs会将多个字符串常量的加法优化成一个字符串常量
  17. var str = '<div>' +
  18. '<div class="header"></div>' +
  19. '<div class="body"></div>' +
  20. '<div class="footer"></div>' +
  21. '</div>';
  22.  
  23. //最好的大字符串拼接方法,是通过数组join方式
  24. var str = [
  25. '<div>' ,
  26. '<div class="header"></div>' ,
  27. '<div class="body"></div>' ,
  28. '<div class="footer"></div>' ,
  29. '</div>'
  30. ].join("");
  31.  
  32. /*
  33. * 关于字符串拼接,High performance Javascript 第五章已经对join和+情况作了对比说明。
  34. * join只在ie7或以下会更快,所以这个优化也许应该根据浏览器使用统计来定吧
  35. * 另可参见http://jsperf.com/string-concatenation-plus-vs-join
  36. */

10、禁止在代码中使用标签(label)

  1. /**
  2. * 标签一般配合goto,break,continue进行使用!
  3. * 但是使用标签,会让程序的逻辑变得混乱,所以程序中极端不推荐!
  4. * 比如下面的这段代码:
  5. */
  6. label_1 : for(var i = 0;i < 3;i++){ //这里声明了label_1标签
  7. //TODO...
  8. label_2 : for(var j = 0;j < 3;j++){ //这里声明了lable_2标签
  9. if(i * j > 6) {
  10. break label_2;
  11. }else if(i * j > 4){
  12. continue label_1;
  13. }else{
  14. alert(i * j);
  15. }
  16. }
  17. }

11、代码中避免使用void、eval、with

  1. /**
  2. * void表示某个方法或表达式无返回值!
  3. * 虽然javascript引擎能正常解析,但是完全不推荐这样使用!
  4. * 比如下面的这几个例子:
  5. */
  6. //这里表示方法无返回值
  7. var funcName = void function(){
  8. //TODO...
  9. };
  10.  
  11. //这里表示表达式无返回值
  12. var returnValue = void ( 2 > 1);
  13. var array = void [1,2,3];
  14.  
  15. //还有别的使用场景,不再穷举!不推荐使用!
  16.  
  17. /**
  18. * eval方法,是把一个字符串当作一个js表达式一样去执行它。
  19. * 在IE中,可以通过下面的方式获取一个DOM节点。
  20. * 但程序中不推荐使用eval
  21. */
  22. var dom = eval("DomId");
  23.  
  24. /**
  25. * with语句:为一个或一组语句指定默认对象,通常用来缩短特定情形下必须写的代码量。
  26. * 程序中不推荐使用with块
  27. */

12、禁止在return、continue、break、throw语句后写无法被执行到的代码

  1. /**
  2. * return、continue、break、throw这些语句都会作为一个程序块的最后一句代码来执行。
  3. * 比如,下面这样的代码都是禁止出现的!
  4. */
  5. for(var i = 0;i < 10;i++){
  6. if(i % 2 === 0){
  7. continue;
  8. alert(i); //这句代码永远都不可能被执行到!
  9. }else if(i % 3 === 0){
  10. break;
  11. alert(i); //这句代码永远都不可能被执行到!
  12. }else if(i % 5 === 0){
  13. throw new Error("error!");
  14. alert(i); //这句代码永远都不可能被执行到!
  15. }
  16. alert(i * 2);
  17. }

13、正确断句,正确使用分号

  1. /**
  2. * javascript引擎会自动的在语句结束的地方插入分号,然而,ECMAScript中也明确的解释到:
  3. * 空语句,变量语句,表达式语句,do-while 语句,continue 语句,
  4. * break 语句,return 语句,以及 throw 语句,这些确定的ECMAScript语句必须以分号结束。
  5. *
  6. * 看下面的例子,return后自动被插入分号造成的问题:
  7. */
  8. function funcName(){
  9. var i = 1,j = 2;
  10. return //这个地方会被自动插入分号
  11. (
  12. i + j
  13. );
  14. }
  15. alert(funcName()); //结果为“undefined”
  16.  
  17. //修改的办法可以是这样:
  18. function funcName(){
  19. var i = 1,j = 2;
  20. return (
  21. i + j
  22. );
  23. }
  24.  
  25. /**
  26. * 通过var定义function,function必须以“};”结束,否则,如果在function的定义之后紧跟着一个闭包,
  27. * 就会出现很严重的后果。
  28. * 比如下面的例子:
  29. */
  30. var funcName = function(){
  31. //TODO
  32. } //这里是不可能被自动插入分号的
  33. (function(){ //当上面的function结束标准"}"遇到了这里的"(",就会视为要执行这个function
  34. //TODO 1
  35. })()
  36. //上面的例子最终会被等价的解释为:
  37. var funcName = (function(){
  38. //TODO 1
  39. })(function(){
  40. //TODO 2
  41. })()
  42. //这样,程序加载就会出现异常情况!!!

14、关于闭包

  1. /**
  2. * 使用闭包时:
  3. * 1、要注意局部变量的释放,避免循环引用造成内存泄露!
  4. * 2、闭包后,注意分号的使用!
  5. */
  6. //下面的这段闭包的代码,就是由于没有添加适当的分号,而造成严重后果!
  7. (function (){
  8. var a;
  9. })() //同第13条,这里也不会自动插入分号
  10. (function (){
  11. var b;
  12. })()
  13.  
  14. //应该改成这样:
  15. (function (){
  16. var a;
  17. })(); //增加分号
  18. (function (){
  19. var b;
  20. })()

15、绕开浏览器差异,正确使用多行注释

  1. /**
  2. * 下面是一段非常正常的代码,在所有的浏览器中,result的结果均为:1
  3. */
  4. var result = (function(x){
  5. return (x > 1) ?
  6. 1 : 0;
  7. })(2);
  8.  
  9. /**
  10. * 但是项目维护的过程中,不能像下面这样做,
  11. * 否则各个浏览器处理兼容性不一致,会得到不一样的值
  12. */
  13. var result = (function(x){
  14. return /*(x > 1) ?
  15. 1 : 0*/ x;
  16. })(2);
  17. /**
  18. * WEB标准规定,对于多行注释中存在行终结符的情况,都是一致的,
  19. * 要求这个多行注释不是简单的被忽略,而是要被替换为一个行终结符插入到流中。
  20. * 所以上面的代码在遵守规范的浏览器中,最终将被解释为:
  21. */
  22. var result = (function(x){
  23. return ; x;
  24. })(2);

16、this指针的使用

  1. /**
  2. * 如果存在标签:<input type="button" value="Hello zxlie!" id="MyButton" >
  3. * 试图通过下面的方式,给MyButton添加click事件,是不正确的!
  4. */
  5. var EventHandler = (function () {
  6. this.info = "This is from event handler!";
  7. this.clickHandler = function() {
  8. alert(this.info );
  9. };
  10. return {
  11. clickHandler : clickHandler
  12. };
  13. })();
  14. document.getElementById("MyButton").onclick = EventHandler.clickHandler;
  15. /**
  16. * 会发现,每次点击这个按钮,得到的都是:undefined
  17. * 问题的根源,就是错误的使用了this指针,this指针具体指到什么对象,取决于调用者:caller
  18. * 应该像下面这样修改:
  19. */
  20. var EventHandler = (function () {
  21. var self = this;
  22. self.info = "This is from event handler!";
  23. self.clickHandler = function() {
  24. alert(self.info ); //主要是这里的self,不能用this
  25. };
  26. return {
  27. clickHandler : clickHandler
  28. };
  29. })();
  30. document.getElementById("MyButton").onclick = EventHandler.clickHandler;

17、switch块中只可以包含多个case分支,但是最后只能有一个default分支

  1. /**
  2. * 如果在switch块中可以不定义default分支,
  3. * 但如果定义了多个default分支,YUI压缩的过程中,就会报错!
  4. */

18、提测以及上线之前去掉代码中的console等调试语句

  1. /**
  2. * console对象主要用来在开发过程中进行程序调试,
  3. * 该语句在IE7及其以下版本无法被识别。
  4. * 所以提测和上线之前务必去掉这样的语句
  5. */
 

JS规范2的更多相关文章

  1. 前端开发规范:命名规范、html 规范、css 规范、js 规范

    上周小组的培训内容是代码可读性艺术,主要分享如何命名.如何优化代码排版,如何写好的注释.我们都知道写出优雅的代码是成为大牛的必经之路. 下面感谢一位前端开发小伙伴总结的前端开发规范,通过学习相关开发规 ...

  2. js规范

    js规范 Array 和 Object 直接量 为了避免这些歧义, 我们应该使用更易读的直接量来声明. var a = [x1, x2, x3]; var a2 = [x1, x2]; var a3 ...

  3. 【重点突破】—— Easy Mock的使用及Mock.js规范

    前言:在线使用Easy Mock可视化工具,可以提供快速生成“模拟数据”的持久化服务: Mock.js是一个JS插件,指定了一套规范,而Easy Mock工具就遵循这些规范.  一.Easy Mock ...

  4. 前端开发规范之命名规范、html规范、css规范、js规范

    在学习编程的时候,每次看到那些整齐规范的代码,心里顿时对这个程序员表示点点好感,有时,比如看到自己和朋友写的代码时,那阅读起来就是苦不堪言,所以,一些基本的开发规范是必须的,是为了自己方便阅读代码,也 ...

  5. 互联网部-供应商团队js规范

    文件命名 页面.js文件命名:采用中划线连接方式,比如说: error-report.html js文件夹命名:scripts 公共js命名:common.js 文件结构组织 每个页面中中独有的js文 ...

  6. angular.js规范写法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. js 规范

    1.原型链的弊端是不支持多重继承.记住,原型链会用另一类型的对象重写类的 prototype 属性 2.注意:调用 ClassA 的构造函数,没有给它传递参数.这在原型链中是标准做法.要确保构造函数没 ...

  8. js规范思维导图(仅限于自己)

  9. 模块化规范Common.js,AMD,CMD

    随着网站规模的不断扩大,嵌入网页中的javascript代码越来越大,开发过程中存在大量问题,如:协同开发,代码复用,大量文件引入,命名冲突,文件依赖. 模块化编程称为迫切的需求. 所谓的模块,就是实 ...

随机推荐

  1. 前端要革命?看我在js里写SQL

    在日新月异的前端领域中,前端工程师能做的事情越来越多,自从nodejs出现后,前端越来越有革了传统后端命的趋势,本文就再补一刀,详细解读如何在js代码中执行标准的SQL语句 为什么要在js里写SQL? ...

  2. d01

    基础 <head>   <meta http-equiv="Content-Type" content="text/html; charset=utf- ...

  3. win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置

    写在前面的话: 再弄这个之前,我对python也好,tensorflow也好几乎是0认知的,所以配置这个环境的时候,走了不少弯路,整整耗费了一个星期的时间才搭配完整这个环境,简直了...然而最气的是, ...

  4. Spring读书笔记——bean创建(上)

    通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...

  5. Java限流策略

    概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃.此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待.排队. ...

  6. Tomcat 笔记-设置虚拟主机

    通过作用虚拟主机,可以使多个不同域名的网站共存于一个Tomcat中 在tomcat的server.xml文件中添加主机名: <Host name="hostname" app ...

  7. enum(枚举类型)

    可以使用枚举类型声明代表整数常量的符号名称. 通过enum,创建一个新类型,并指定它可以拥有的值.(就像平常用一个整形变量,我们指定它等于0的时候代表什么,1呢,2呢...而通过枚举,就增加了程序的可 ...

  8. A - 棋盘问题 POJ - 1321

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

  9. html5页面实现点击复制功能

    在实际工作中,有时候会遇到这样的需求,页面上有一个链接,不需要选中链接内容,只需要点击复制按钮,就可以把链接内容复制到剪切板.这时候可以使用clipboard插件来实现.以下是一个简单的demo. 首 ...

  10. SVN Upgrade working copy

    出现这个的原因是因为你机器上安装的svn客户端版本过高,而你从别的地方拷贝代码中的svn版本过低,点击SVN Upgrade working copy可以将代码中的svn版本升级.