Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 最好检查未定义的属性或设置为null?_Javascript_Performance_Object_Undefined - Fatal编程技术网

Javascript 最好检查未定义的属性或设置为null?

Javascript 最好检查未定义的属性或设置为null?,javascript,performance,object,undefined,Javascript,Performance,Object,Undefined,更容易用文字用代码解释,因此考虑到以下场景: // one var myClass = function(a, b) { if(a) this.a = a; if(b) this.b = b; } // two var myClass = function(a, b) { this.a = a || null; this.b = b || null; } 假设您有一个不断被调用的方法(多次/秒) 在第一种情况下,检查未定义的属性,在第二种情况下检查现有属性

更容易用文字用代码解释,因此考虑到以下场景:

// one

var myClass = function(a, b)
{
    if(a) this.a = a;
    if(b) this.b = b;
}

// two

var myClass = function(a, b)
{
    this.a = a || null;
    this.b = b || null;
}
假设您有一个不断被调用的方法(多次/秒)

在第一种情况下,检查未定义的属性,在第二种情况下检查现有属性,但值为
null


哪种情况在JavaScript中表现更好?

我不确定是否以最佳方式设置了测试,但该网站非常适合基准测试:


我得到的结果表明,使用IF语句而不是OR运算符来设置默认值的性能提高了6%

这两种情况都在测试构造函数中的a和b参数是否具有“truthy”值。这意味着在这两种情况下,如果传入0或空字符串,或者(显然)false,那么该值将被丢弃。区别在于第一种情况不会在对象上创建属性,而第二种情况默认为null

无论哪种方法,当您在
doSomething()
中实际使用该属性时,您仍然必须测试该属性,并且无论该属性是否未设置、是否已设置为null或是否已显式设置为未定义,您的
if(this.a)
测试都将起作用

如果您不想在未提供值的情况下返回错误,我倾向于直接设置它们:

var myClass = function(a, b)
{
    this.a = a;
    this.b = b;
}
如果参数中未提供该值,则将创建该属性,但将其设置为未定义,这在
doSomething()
中的测试中仍将以完全相同的方式工作,但您将保存一个If或| |测试,并具有不丢弃0、空字符串或假值的额外优势。这样构造器就更整洁了

就实际性能比较而言,您确实需要设置一个适当的测试(例如,在jsperf.com上)。如果让我猜的话,我会平均说
如果(a)this.a=a版本会更快,因为它只在a是真实的情况下执行分配,但猜测性能是一个糟糕的计划。除非你在不同的浏览器中测试它,否则你不会真正知道——可能一种方法在IE中更快,而另一种方法在Chrome中更快。如果你设置了一个测试,一定要和我上面展示的类似的直接作业进行比较


编辑:我刚刚看到另一个答案,发现性能差异为6%。对于这样一个最小的差异,并注意到正如我上面提到的,性能差异在某些浏览器中可能会被逆转,我认为您最好编写对您的处理需求最有意义的代码,而不必担心性能。无论哪种方法(或者如果你包括我的答案,所有三种方法)都清晰简单,性能良好,它们只是做不到相同的事情…

如果你真的想知道性能数字,那么你应该制作自己的jsperf(大约需要3分钟),并在你认为重要的任何浏览器中运行它。回答性能问题的唯一方法是在您认为相关的浏览器中进行测试。请记住,如果构造函数中a或b的预期合法值为假值,如(0、“、false等),则这两种方法(一种和两种)都不起作用。要允许这些值,您必须在
未定义的
的参数中显式测试a和b。我在Chrome/WinXP中尝试了相同的测试,“或w/o值”是最快的情况,而其他情况下的速度则慢92%或93%——也就是说,所有其他情况都差不多。然而,现实世界中的案例可能只是在某些时候有错误或没有提供值,我认为OP也希望考虑到以后使用这些属性的速度(这些属性可能在测试时设置,也可能没有设置)。仍然,+1用于设置测试和提供站点链接。
var myClass = function(a, b)
{
    this.a = a;
    this.b = b;
}