在JavaScript中声明多个variables
在JavaScript中,可以像这样声明多个variables:
var variable1 = "Hello World!"; var variable2 = "Testing..."; var variable3 = 42;
…或者像这样:
var variable1 = "Hello World!", variable2 = "Testing...", variable3 = 42;
一种方法比另一种方法更好/更快吗?
第一种方法更容易维护。 每一个声明都是单一行中的单个声明,因此您可以轻松地添加,删除和重新sorting声明。
第二种方法,因为它们包含var
关键字和分号,所以删除第一个或最后一个声明是令人讨厌的。 每次添加一个新的声明时,都必须将旧行中的分号更改为逗号。
除了可维护性,第一种方法消除了事故全局variables创build的可能性:
(function () { var variable1 = "Hello World!" // semicolon is missed out accidently var variable2 = "Testing..."; // still a local variable var variable3 = 42; }());
而第二种方式则不那么宽容:
(function () { var variable1 = "Hello World!" // comma is missed out accidently variable2 = "Testing...", // becomes a global variable variable3 = 42; // a global variable as well }());
对于组织来说, 每个作用域使用一个var
语句是很常见的。 所有的“范围”都遵循类似的模式,使代码更具可读性。 另外,发动机“升降”他们无论如何顶部。 所以保持你的声明模仿真正发生的事情更密切。
这样做时可读性更好:
var hey = 23; var hi = 3; var howdy 4;
但是用这种方式占用更less的空间和代码行:
var hey=23,hi=3,howdy=4;
它可以节省空间的理想select,但让JavaScript压缩机为您处理。
这只是个人喜好的问题。 这两种方式之间没有区别,除了用第二种forms保存的几个字节,如果你去掉空白。
var variable1 = "Hello World!"; var variable2 = "Testing..."; var variable3 = 42;
比以下更具可读性:
var variable1 = "Hello World!", variable2 = "Testing...", variable3 = 42;
但他们做同样的事情。
也许这样
var variable1 = "hello world" , variable2 = 2 , variable3 = "how are you doing" , variable4 = 42;
除了更改第一个或最后一个variables时,它很容易维护和读取。
我唯一用于逗号的基本用法是在for循环中:
for (var i = 0, n = a.length; i < n; i++) { var e = a[i]; console.log(e); }
我去了这里看看这是否在JavaScript中可以。
即使看到它的工作,一个问题仍然是n是否是本地的function。
这个validation,n是本地的:
a=[3,5,7,11]; (function l () { for (var i = 0, n = a.length; i < n; i++) { var e = a[i]; console.log(e); }}) (); console.log(typeof n == "undefined" ? "as expected, n was local" : "oops, n was global");
有一段时间我不确定,在语言之间切换。
虽然两者都是有效的,但是使用第二种方法阻碍了没有经验的开发者将var语句放在整个地方并引起提升问题。 如果每个函数只有一个variables,那么在函数的顶部就可以更容易地debugging整个代码。 这可能意味着声明variables的行不像某些人所希望的那样明确。
我觉得这样做是值得的,如果这意味着要让开发商脱离他们想要的任何地方的“var”,那么这个开发人员就不行了。
人们可能会抱怨JSLint,我也是这么做的,但是它的很多东西并不是为了解决语言问题,而是纠正编程人员的坏习惯,从而防止他们编写的代码出现问题。 因此:
“在使用块范围的语言中,通常build议在首次使用的站点声明variables,但是由于JavaScript没有块范围,所以在函数顶部声明一个函数variables是明智的。build议每个函数使用一个var语句。“ – http://www.jslint.com/lint.html#scope
我认为这是个人喜好的问题。 我更喜欢以下面的方式来做:
var /* Vars */ me = this, that = scope, temp, tempUri, tempUrl, videoId = getQueryString()["id"], host = location.protocol + '//' + location.host, baseUrl = "localhost", str = "Visit W3Schools", n = str.search(/w3schools/i), x = 5, y = 6, z = x + y /* End Vars */;
ECMAScript6引入了解构赋值 ,这很好用:
[a, b] = [1, 2]
a
等于1, b
等于2。
使用ES6解构 赋值 :它将从数组中解压值,或从对象中解压缩到不同的variables中。
let [variable1 , variable2, variable3] = ["Hello World!", "Testing...", 42]; console.log(variable1); // Hello World! console.log(variable2); // Testing... console.log(variable3); // 42
“内聚衔接”的概念可以比对象/模块/function更普遍地应用。 它也可以用于这种情况:
OPbuild议的第二个例子已经把所有的variables连接到了同一个语句中,这使得不可能将其中的一行移动到别的地方而不会破坏内容(高耦合)。 他给出的第一个例子使variables赋值相互独立(低耦合)。
“低耦合通常是一个结构良好的计算机系统和良好的devise的标志,并与高凝聚力相结合,支持高可读性和可维护性的总体目标。”
http://en.wikipedia.org/wiki/Coupling_(computer_programming);
所以select第一个。
我认为第一种方法(多个variables)是最好的,因为你可能会以此结束(从使用Knockout的应用程序),这在我看来很难理解:
var categories = ko.observableArray(), keywordFilter = ko.observableArray(), omniFilter = ko.observable('').extend({ throttle: 300 }), filteredCategories = ko.computed(function () { var underlyingArray = categories(); return ko.utils.arrayFilter(underlyingArray, function (n) { return n.FilteredSportCount() > 0; }); }), favoriteSports = ko.computed(function () { var sports = ko.observableArray(); ko.utils.arrayForEach(categories(), function (c) { ko.utils.arrayForEach(c.Sports(), function (a) { if (a.IsFavorite()) { sports.push(a); } }); }); return sports; }), toggleFavorite = function (sport, userId) { var isFavorite = sport.IsFavorite(); var url = setfavouritesurl; var data = { userId: userId, sportId: sport.Id(), isFavourite: !isFavorite }; var callback = function () { sport.IsFavorite(!isFavorite); }; jQuery.support.cors = true; jQuery.ajax({ url: url, type: "GET", data: data, success: callback }); }, hasfavoriteSports = ko.computed(function () { var result = false; ko.utils.arrayForEach(categories(), function (c) { ko.utils.arrayForEach(c.Sports(), function (a) { if (a.IsFavorite()) { result = true; } }); }); return result; });
避免单个语句版本(single var )的另一个原因是debugging。 如果在任何分配行中引发exception,则堆栈跟踪只显示一行。
如果你用逗号语法定义了10个variables,那么你无法直接知道哪个variables是罪魁祸首。
个别陈述版本不会受到这种模糊性的影响。
我相信,在我们开始使用ES6之前,单variables声明的方法既不好也不坏(如果你有内存和'use strict'
,这是真正的口味偏好,但现在事情已经改变了。赞成多线声明:
-
现在我们有了两种新的variables,
var
变得过时了。 到处使用const
是一个好习惯,直到你真的需要let
。 所以很多时候你的代码会在代码中间包含variables声明和分配,而且由于块的范围限制,你经常会在块之间移动variables,以防出现小的变化。 我认为用多行声明这样做更方便。 -
ES6语法变得更加多样化,我们得到了析构函数,模板string,箭头函数和可选的assigments。 当你在单一的var声明中大量使用所有的function时,会伤害到可读性。