`
liu.da101
  • 浏览: 7828 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

JavaScript语言规范-来自Google

阅读更多

既然要写JS,必须要遵循一定的编程规范吧。以下是来自Google的JS语言规范,直接翻译过来的(可参考英文原版)。


1,变量:大部分情况下请使用var声明

如果不显示使用var,这个变量就会被附着在全局上下文中,可能引起重名的冲突。而且,如果不使用var声明,也 很难分辨这个变量的作用域(如:可能附着在Document或Window对象上,也可能附着在局部变量上)。所以,大部 分情况下使用var来声明变量。

当然,如果申请一个只属于某一个“类”的变量,则不要使用var。如jQuery(版本为1.6.4)中为jQuery的第41 行,要为jQuery对象增加属性,所以不能使用var来声明。

2,常量:使用NAME_LIKE_THIS的命名方法,适当使用@const,不要使用const关键词。

对于简单的“非引用”类型,这种命名方法足矣。如:


/**
* The number of seconds in a minute.
* @type {number}
*/
goog.example.SECONDS_IN_A_MINUTE = 60;

 


对于“引用”类型,使用@const注解。如:


/**
 * The number of seconds in each of the given units.
 * @type {Object.<number>}
 * @const
 */
goog.example.SECONDS_TABLE = {
  minute: 60,
  hour: 60 * 60
  day: 60 * 60 * 24
}


  这样可以保证编译器保证常量的意义。

至于const关键字,由于IE不支持,所以不要使用。

3,分号:使用之。

不显式使用分号,有可能导致难以察觉的问题。特别是如下几处:


//1.
MyClass.prototype.myMethod = function(){
    return 42;
}  // 这里没有分号
(function(){
    //初始化一些变量,作用域为该匿名函数
})();
var x = {
    'i':1,
    'j':2
}  //这里没有分号

//2.
[normalVersion,ffVersion][isIE]();

var THINGS_TO_EAT = [apples,oysters,sprayOnCheese] //没有分号

//3.
-1 == resultOfOperation() || die();


  发生什么呢?

第一处:JS错误-首先,返回24的函数会执行,因为后面有一个圆括号,而且参数是一个函数;然后返回值42 被调用,出错。

第二处:执行的时候你非常可能得到一个“no such property in undefined”的错误,因为实际上是在执行 x[ffVersion][isIE]()这个函数。

第三处:函数die只有在resultOfOperation()为NaN,THINGS_TO_EAT会被赋值成die()的返回值。


为什么呢?

JS的语法要求一个语句要以分号结尾,除非能安全的推断出分号的位置。在上述例子中,函数声明,对象声明, 数组等被用在一个语句中。类似如“}”,“]”的符号不足以证明语句的结束。如果下一个字符是运算符或者"{","[",则 JS会认为语句没有结束。


这写错误令人诧异,所以确保赋值语句以分号结尾。


4,嵌套函数:可以使用

嵌套函数非常有用,比如在创建持续任务或者隐藏工具函数的时候。不用担心,使用之。


5,在语言块中声明函数:不要使用!

不要写如下代码:


if(x){
    function ff(){}
}


  尽管大多数脚本引擎支持这种函数声明的方式,但是这并不是ECMAScript标准里面的。ECMAScript只支持在 根语句声明函数。如果需要,可以使用变量来保存这个函数。如下:


if(x){
    var ff = function(){}
}


 

6,异常:可以使用

如果不是从0开始写,那么基本上避免不了使用异常,如使用程序开发框架的时候。


7,自定义异常:可以使用

没有自定义异常,那么一个函数既可以返回正常值,又可以返回一个错误信息,这令人费解。不大优雅的解决方 法包括返回执行错误信息的引用类型和返回包含潜在错误的对象。这些可以说是比较古老的异常处理方法。所以,在 合适的情况下可以使用自定义异常。


8,标准特性:使用标准特性而不是使用非标准的

为了最大化的实现可移植和兼容。比如使用string.charAt(4),而不是使用string[4];访问元素要使用DOM函 数,而不是使用某个专属于一个工程的简写。


9,为原始类型包装:不要使用!

没有必要为原始类型包装,而且包装还很容易出错,如下:


var x = new Boolean(false);
if(x){
    alert('hi');//会执行
}


不要这样做!

然而,类型转换还是可以的。


var x = Boolean(0);
if(x){
    alert('hi');//不执行
}
typeof Boolean(0) == 'boolean';
typeof new Boolean(0) == 'object';


  这个特点在将对象转型成number,string,boolean的时候特别有用。


10,多级原型层次:不建议使用

多级原型层次可以用来实现继承。多级原型很难维护。

(这个本人保留意见)

11,方法定义:Foo.prototype.bar = function(){};

尽管有好几种方式将方法和属性绑定到一个类,最好的还是这种。


12,闭包:可以使用,但是要小心!

闭包也许是JS最有用的特点,或许也是最被滥用的特性。

但是,要记住,闭包持有对它的关闭范围的引用。如果将一个闭包赋值给DOM元素,则可能导致循环引用,从 而引起内存泄露,如:


function foo(element,a,b){
    element.onclick = function(){ /* 使用a和b */
}


  函数本身的闭包引用了element,a,和b,即使从来没有使用到element;因为element也保存了指向该闭 包的引用,所以形成了一个环,不能被GC回收。在这种情况下,可以这样:


function foo(element,a,b){
    element.onclick = bar(a,b);
}
function bar(a,b){
    return function(){/* 使用a和b*/}
}

 


13,eval():只用于反序列化

eval()会造成令人困惑的语义,而且如果包含用户输入的字符串的时候也很危险。通常会有更好的方法来写这种需求的代码,所以通常不 用。但是,eval使得反序列化非常简单,所以可以接受。

反序列化是将一系列的字符转换成内存的数据结构的过程。例如,你可能将下面的对象写到一个文件中去:


users = [
    {},
    {},
    ...
];


  要将这个对象读到内存中,就可以使用eval。

类似的,eval也可以简化解码RPC返回值的任务。如:


var userOnline = false;
var user = 'nusrat';
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', 'http://chat.google.com/isUserOnline?user=' + user, false);
xmlhttp.send('');
// Server returns:
// userOnline = true;
if (xmlhttp.status == 200) {
  eval(xmlhttp.responseText);
}
// userOnline is now true.



14,with(){}:不要使用!

使用with会使代码更有迷惑性。因为with里面的对象可能会有和局部变量冲突的属性,所以可能会导致程序的原 意完全变化。例如:


with(foo){
    var x = 3;
    return x;
}


局部变量x可能与foo的属性冲突,甚至如果foo的那个属性有setter,还会导致其他的代码去执行。所以,不要使 用with! 


15,this:只用在构造函数,方法,和构建闭包的时候

使用this容易使人产生疑惑。this可以指向全局对象(window),可以指向调用者,可以指向DOM节点,可以 指向新建的对象,可以指向别的对象(如果方法是用call或者apply调用的)。

因为this很容易出错,所以限制适用于以下情况:


  • 构造函数
  • 对象的方法(包括创建闭包)
16,for-in 循环
for-in循环经常被错误的用于遍历Array中的元素。错误原因在于并不只是遍历了从0到length-1的元素,而且 还遍历了原型链。以下是几个经常出错的:
function printArray(arr) {
  for (var key in arr) {
    print(arr[key]);
  }
}

printArray([0,1,2,3]);  // This works.

var a = new Array(10);
printArray(a);  // This is wrong.

a = document.getElementsByTagName('*');
printArray(a);  // This is wrong.

a = [0,1,2,3];
a.buhu = 'wine';
printArray(a);  // This is wrong again.

a = new Array;
a[3] = 3;
printArray(a);  // This is wrong again.
  所以,要使用普通的遍历。

17,数组:不要将数组作为map,哈希,联合的数组
数组不允许使用非数字的索引,如果需要非数字的索引,可以使用Object。Array可以,是因为Array继承自 Object。



18,多行字符串:不要使用

不要这样:


var myString = 'A rather long string of English text, an error message \
                actually that just keeps going and going -- an error \
                message to make the Energizer bunny blush (right through \
                those Schwarzenegger shades)! Where was I? Oh yes, \
                you\'ve got an error and all the extraneous whitespace is \
                just gravy.  Have a nice day.';


  每一行前面的空格在编译的时候不能被安全的跳过;\后面的空格也可能导致莫名其妙的错误;而且,这种语法在 ECMAScript中也是不支持的。

使用字符串相加即可:


var myString = 'A rather long string of English text, an error message ' +
    'actually that just keeps going and going -- an error ' +
    'message to make the Energizer bunny blush (right through ' +
    'those Schwarzenegger shades)! Where was I? Oh yes, ' +
    'you\'ve got an error and all the extraneous whitespace is ' +
    'just gravy.  Have a nice day.';

 


19,字面数组和对象:建议使用

通常使用字面数组和对象来代替构造器。

Array构造器会因为参数不当而出错。


// Length is 3.
var a1 = new Array(x1, x2, x3);

// Length is 2.
var a2 = new Array(x1, x2);

// If x1 is a number and it is a natural number the length will be x1.
// If x1 is a number but not a natural number this will throw an exception.
// Otherwise the array will have one element with x1 as its value.
var a3 = new Array(x1);

// Length is 0.
var a4 = new Array();


因为这个原因,如果有人更改代码传了一个参数进去,而不是两个参数,代码可能会背离原意。

为了避免这种情况,这样:

var a = [x1, x2, x3];
var a2 = [x1, x2];
var a3 = [x1];
var a4 = [];

   Object的构造器虽然没有这个问题,但是为了可读性和连贯性,建议使用字面对象。如:


var o = {};

var o2 = {
  a: 0,
  b: 1,
  c: 2,
  'strange key': 3
};



20,更改内置对象的prototype:禁止!

更改内置对象的原型是被严厉禁止的。



 

0
1
分享到:
评论
2 楼 gdwenjun 2011-09-30  
  o     ps:   
1 楼 gdwenjun 2011-09-30  
[b][/           b]

相关推荐

    基于三层感知机实现手写数字识别-内含源码和说明书.zip

    基于三层感知机实现手写数字识别-内含源码和说明书.zip

    setuptools-40.7.0.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    搭建VGG16神经网络实现图像分类-内含源码和说明书.zip

    搭建VGG16神经网络实现图像分类-内含源码和说明书.zip

    setuptools-40.6.1.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    华为OD机试D卷 - 判断字符串子序列 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    安享智慧理财测试项目Mock服务代码

    安享智慧理财测试项目Mock服务代码

    基于STM32单片机的智能晾衣架.zip

    基于单片机的系统

    Mamba selective-scan-cuda-linux-gnu.so

    安装成功后,还是遇到ImportError xxxx selective_scan_cuda.cpython-xxx-linux-gnu.so undefined symbol,用此编译好的文件进行替换即可

    基于Java EE的停车场管理系统.zip

    如今,我国现代化发展迅速,人口比例急剧上升,在一些大型的商场,显得就格外拥挤,私家车的数量越来越多,商场停车难得问题凸显,对于停车场的合理利用有助于缓解用户停车压力,鉴于这样的背景;初步设定系统功能主要包括,用户信息管理,违规车辆信息管理,刷卡停车牌管理,停车位信息管理,停车计费,信息查看管理等功能模块。本系统采用JAVAEE开发形式,利用数据库来完成数据存储功能,运用了B/S形式的开发模式,严格按照了软件工程的开发模式进行开发,保证系统的良好运行。

    华为OD机试D卷 - 免单统计 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    setuptools-2.2.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ASP.NET《数据库原理及应用技术》课程指导平台的开发(源代码)

    ASP.NET《数据库原理及应用技术》课程指导平台的开发(源代码)

    setuptools-40.4.2.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-54.0.0-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于SpringBoot+Hadoop的评价预测系统的设计与实现+部署文档+全部资料 高分项目.zip

    【资源说明】 基于SpringBoot+Hadoop的评价预测系统的设计与实现+部署文档+全部资料 高分项目.zip基于SpringBoot+Hadoop的评价预测系统的设计与实现+部署文档+全部资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    利用python的pyautogui函数实现简单的自动化操作

    1.安装python3.4以上版本,并配置环境变量(目前有装3.9遇到坑的,我个人用的3.7.6) 教程:https://www.runoob.com/python3/python3-install.html 2.安装依赖包 方法:在cmd中(win+R 输入cmd 回车)输入 pip install pyperclip 回车 pip install xlrd 回车 pip install pyautogui==0.9.50 回车 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 回车 pip install pillow 回车 这几步如果哪步没成功,请自行百度 如 pip install opencv-python失败 3.把每一步要操作的图标、区域截图保存至本文件夹 png格式(注意如果同屏有多个相同图标,回默认找到最左上的一个,因此怎么截图,截多大的区域,是个学问,如输入框只截中间空白部分肯定是不行的,宗旨就是“唯一”) 4.在cmd.xls 的sheet1 中,配置每一步的指令,如指

    setuptools-8.0.4.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-18.7.1.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    setuptools-20.6.7.zip

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    华为OD机试D卷 - 数据单元的变化替换 - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

Global site tag (gtag.js) - Google Analytics