是否有 JavaScript 习语将“未定义”更改为“空”?

Posted

技术标签:

【中文标题】是否有 JavaScript 习语将“未定义”更改为“空”?【英文标题】:Is there a JavaScript idiom to change "undefined" to "null"? 【发布时间】:2018-02-16 20:36:58 【问题描述】:

有很多 javascript 习惯用法在类型和类似事物之间进行强制转换。

! 可以将任何错误的值转换为布尔值 true!! 可以将任何错误的值转换为实际的布尔值 false+ 可以将truefalse 或表示数字的字符串转换为实际数字等。

是否有类似的东西可以将undefined 转换为null

现在我正在使用三元 ? : 但如果我错过了一个有用的技巧会很酷。


好的,让我设计一个例子......

function callback(value) 
  return value ? format(value) : null;

callback 由有时通过undefined 的第三方代码调用。 第 3 方代码可以处理 null 被传回,但不能处理 undefinedformat() 也是第 3 方,无法处理通过 undefinednull

【问题讨论】:

我不确定是否有一种很好的快速方法可以在它们之间进行转换,但如果有帮助:undefined == null 返回 true,不像 undefined === null @VamshiGudipati:我本来打算这样做,但人们只会告诉我其他方法,所以我决定不这样做。我只是想提高我的 JavaScript 习语词汇量,我认为这足以提出一个好问题。成语的全部意义在于它们有很多用途。 我看不出从undefined 转换为null 的操作在您的示例中如何有用。您是否尝试将您的callback 实现为return toNullIfUndefined(value) && format(value)?我认为你当前的代码是清晰、干净和惯用的。 @hippietrail 好吧,使用&& 而不是三元是相当单一的,所以无论如何这不会从toNullIfUndefined 运算符中受益。 如果您想知道为什么这在某些情况下很有用 - Angular 表单控件对象可以使用对象“设置”,但如果属性存在且未定义,您会收到错误“属性 X失踪'。如果该属性为“null”,则不会出现错误。 【参考方案1】:

undefined || null - 或任何虚假 || null - 将返回 null

【讨论】:

如果false和0是有效值不应该转换的情况呢? 怎么样?? 我的意思是,与这 2 个相比,您的答案看起来会失败。您是否有一个选项可以进行严格的类型检查并且只涵盖未定义的内容?我一直在寻找不使用 for 循环的东西,因为我希望在很多方法中使用它来规范化输入 在这种情况下,您可以使用三元表达式,类似于问题中提供的示例:value === undefined ? null : value【参考方案2】:

Javascript 现在支持空合并运算符:??。它可能无法用于生产(请参阅 support table),但与 Node 或转译器(TypeScript、Babel 等)一起使用肯定是安全的。

每MDN,

nullish 合并运算符 (??) 是一种逻辑运算符,当其左侧操作数为 null 或未定义时返回其右侧操作数,否则返回其左侧操作数。

就像|| 可以在左操作数为假时提供“默认”值一样,?? 在左操作数为空或未定义时提供“默认”值。您可以使用它来强制 undefined 为 null:

    // OR operator can coerce 'defined' values
    "value"   || null;    // "value"
    0         || null;    // null
    false     || null;    // null
    ""        || null;    // null
    undefined || null;    // null
    
    // The null-coalescing operator will only coerce undefined or null
    "value"   ?? null;    // "value"
    0         ?? null;    // 0
    false     ?? null;    // false
    ""        ?? null;    // ""
    undefined ?? null;    // null

基于问题的示例:

    function mustNotReturnUndefined(mightBeUndefined)  // can return null
        // Substitute empty string for null or undefined
        let result = processValue(mightBeUndefined ?? "");

        // Substitute null for undefined
        return result ?? null;
    

【讨论】:

【参考方案3】:

这是一个相当老的问题,可能我的回答有点晚了,但我自己决定如下:

const valueOrNull = (value = null) => value;

const a =  d: '' ;
valueOrNull(a.b?.c) === null; // true
valueOrNull(a.d) === '';      // true
valueOrNull() === null;       // true

任何undefined 值都会得到null 作为默认值;

【讨论】:

【参考方案4】:
public static replaceUndefinedWithNull(object: any) 
 if (isUndefined(object)) 
  return null;
 
return object;

【讨论】:

以上是关于是否有 JavaScript 习语将“未定义”更改为“空”?的主要内容,如果未能解决你的问题,请参考以下文章

是否有“从列表的开头选择并减少直到结果满足谓词”的函数式编程习语?

是否有教程教授经验丰富的程序员使用的常见 Ruby 编程习语,但对新手可能不明显? [关闭]

Java中是不是存在用于满足接口的空方法的习语?

数据翻译/转换是不是有好的模式/习语?

C ++ Mixin - 初始化期间的动态绑定习语

如何在检测习语中要求精确的函数签名?