Ste*_*son 316 javascript variables performance coding-style declaration
在JavaScript中,可以声明多个这样的变量:
var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;
Run Code Online (Sandbox Code Playgroud)
......或者像这样:
var variable1 = "Hello World!",
variable2 = "Testing...",
variable3 = 42;
Run Code Online (Sandbox Code Playgroud)
一种方法比另一种方法更好/更快吗?
Jer*_*ten 323
第一种方式更容易维护.每个声明都是一行中的单个语句,因此您可以轻松添加,删除和重新排序声明.
使用第二种方法,删除第一个或最后一个声明是很烦人的,因为它们包含var
关键字和分号.每次添加新声明时,都必须将旧行中的分号更改为逗号.
Ken*_* Ki 206
除可维护性外,第一种方法消除了事故全局变量创建的可能性:
(function () {
var variable1 = "Hello World!" // semicolon is missed out accidently
var variable2 = "Testing..."; // still a local variable
var variable3 = 42;
}());
Run Code Online (Sandbox Code Playgroud)
虽然第二种方式不太宽容:
(function () {
var variable1 = "Hello World!" // comma is missed out accidently
variable2 = "Testing...", // becomes a global variable
variable3 = 42; // a global variable as well
}());
Run Code Online (Sandbox Code Playgroud)
Jas*_*use 27
这样做时更具可读性:
var hey = 23;
var hi = 3;
var howdy 4;
Run Code Online (Sandbox Code Playgroud)
但是这样占用更少的空间和代码行:
var hey=23,hi=3,howdy=4;
Run Code Online (Sandbox Code Playgroud)
它可以是节省空间的理想选择,但让JavaScript压缩器为您处理它.
小智 15
也许是这样的
var variable1 = "hello world"
, variable2 = 2
, variable3 = "how are you doing"
, variable4 = 42;
Run Code Online (Sandbox Code Playgroud)
除了更改第一个或最后一个变量外,它易于维护和读取.
Kev*_*ell 11
var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;
Run Code Online (Sandbox Code Playgroud)
比以下更具可读性:
var variable1 = "Hello World!",
variable2 = "Testing...",
variable3 = 42;
Run Code Online (Sandbox Code Playgroud)
但他们做同样的事情.
使用ES6 Destructuring赋值:它将数组中的值或对象的属性解包为不同的变量.
let [variable1 , variable2, variable3] =
["Hello World!", "Testing...", 42];
console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42
Run Code Online (Sandbox Code Playgroud)
逗号中我唯一但必不可少的用法是for循环:
for (var i = 0, n = a.length; i < n; i++) {
var e = a[i];
console.log(e);
}
Run Code Online (Sandbox Code Playgroud)
我去这里查看JavaScript是否正常.
即使看到它起作用,仍然存在一个问题,即n是否是函数的局部.
这验证,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");
Run Code Online (Sandbox Code Playgroud)
有一会儿我不确定,在语言之间切换.
小智 6
虽然两者都是有效的,但是使用第二种方法会阻止没有经验的开发人员在所有地方放置var语句并导致提升问题.如果每个函数只有一个var,则在函数的顶部,则整个代码调试更容易.这可能意味着声明变量的行不像某些人所希望的那样明确.
我认为权衡是值得的,如果这意味着让开发人员不再在他们想要的任何地方放弃'var'.
人们可能会抱怨JSLint,我也是这样,但很多都不是为了解决语言问题,而是纠正编码人员的坏习惯,从而防止他们编写的代码出现问题.因此:
"在具有块范围的语言中,通常建议在首次使用的站点声明变量.但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的.建议每个函数使用一个var语句." - http://www.jslint.com/lint.html#scope
正如每个人所说,这很大程度上是偏好和可读性,但我会在帖子上发表评论,因为我没有看到其他人以这种方式分享想法
我认为这个问题的答案很大程度上取决于您设置的变量以及它们之间的关系。我尝试根据我创建的变量是否相关来保持一致;我的偏好通常是这样的:
我将它们单线排列,以便以后可以轻松移动它们;我个人绝不会以任何其他方式声明不相关的项目:
const unrelatedVar1 = 1;
const unrelatedVar2 = 2;
const unrelatedVar3 = 3;
Run Code Online (Sandbox Code Playgroud)
如果我要创建新变量,我将其声明为一个块——这暗示着这些属性属于一起
const
x = 1,
y = 2,
z = 3
;
// or
const x=1, y=2, z=3;
// or if I'm going to pass these params to other functions/methods
const someCoordinate = {
x = 1,
y = 2,
z = 3
};
Run Code Online (Sandbox Code Playgroud)
对我来说,这与解构感觉更一致:
const {x,y,z} = someCoordinate;
Run Code Online (Sandbox Code Playgroud)
做类似的事情会感觉很笨拙(我不会这样做)
const x = someCoordiante.x;
const y = someCoordiante.y;
const z = someCoordiante.z;
Run Code Online (Sandbox Code Playgroud)
如果使用相同的构造函数创建多个变量,我通常也会将它们分组在一起;我个人认为这更具可读性
而不是类似的事情(我通常不这样做)
const stooge1 = Person("moe");
const stooge2 = Person("curly");
const stooge3 = Person("larry");
Run Code Online (Sandbox Code Playgroud)
我通常会这样做:
const [stooge1, stooge2, stooge3] = ["moe", "curly", "larry"].map(Person);
Run Code Online (Sandbox Code Playgroud)
我说通常是因为如果输入参数足够长以至于变得不可读,我会将它们分开。
我同意其他人关于 use-strict 的评论
我认为这是个人偏好的问题.我更喜欢以下列方式进行:
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 */;
Run Code Online (Sandbox Code Playgroud)
小智 5
避免使用单语句版本(单个var)的另一个原因是调试。如果在任何分配行中抛出异常,则堆栈跟踪仅显示一行。
如果您有10个用逗号语法定义的变量,则您将无法直接知道哪一个是罪魁祸首。
单个语句版本不会遭受这种歧义。
小智 5
可维护性问题可以通过一些格式轻松解决,例如:
let
my_var1 = 'foo',
my_var2 = 'bar',
my_var3 = 'baz'
;
Run Code Online (Sandbox Code Playgroud)
我严格按照个人喜好使用这种格式。当然,我跳过这种格式的单一声明,或者它只是简单地把工作搞砸了。