使用短路OR运算符来测试是否设置了函数参数(对象)的属性是否安全?

psy*_*tor -4 javascript jquery

使用短路OR运算符来测试是否设置了函数参数(对象)的属性是否安全?

另外,|和之间有什么区别||吗?(两个都工作)

最后,我理解(认为)它只检查左侧是否为,未定义或其他任何东西 - 是吗?

Javascript,jQuery

$(document).ready(function()
{
  var testObject = 
  {
    testProperty: "test string 1"
  };

  testFunction(testObject);
}); 

function testFunction(testObject)
{
  var testOutput = testObject.testProperty || "test string 2";

  console.log(testOutput);
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

使用短路OR运算符来测试是否设置了函数参数(对象)的属性是否安全?

如果你知道它正在做什么,那么使用这个奇特强大的||运算符 是安全的:它正在测试一个值.的falsey值是,,,,,当然; 其他一切都是真实的.nullundefined0""NaNfalse

因此,如果属性不能将其中一个作为有效值,那么它是安全的,如果可以的话.

因此,在您的情况下,如果testObject.testProperty可以具有""(例如)的有效值,则无法使用||.

因为当你不能使用时||,你有几个选择:

  1. in,检查对象及其原型:

    var testOutput = 'testProperty' in testObject ? testObject.testProperty : "test string 2";
    
    Run Code Online (Sandbox Code Playgroud)
  2. hasOwnProperty,它只检查对象而不是它的原型:

    var testOutput = testObject.hasOwnProperty('testProperty') ? testObject.testProperty : "test string 2";
    
    Run Code Online (Sandbox Code Playgroud)

另外,|和之间有什么区别||吗?(两个都工作)

是的,这是一个巨大的差异; 和不,|不适用于您的示例代码.|按位 OR运算符,它将其操作数转换为数字(特别是32位整数),在位级别将它们与OR运算组合,然后将其转换回JavaScript编号,并将其转换为结果.undefined | "test string 2"0,例如,而当然undefined || "test string 2""test string 2".

最后,我理解(认为)它只检查左侧是否null,undefined或其他任何东西 - 是否正确?

不,这是任何虚假的价值.||掩盖细节的逻辑是:

  1. 评估左侧.
  2. 如果左侧是真实的,则将该值作为结果.
  3. 如果左侧是假的,请评估右侧并将结果作为结果.