在React的fbjs模块中,emptyObject的目的是什么

时间:2018-04-12 22:59:20

标签: javascript reactjs

我正在阅读React的源代码,这导致我进入fbjs npm模块,它看起来像一堆有用的js实用程序。我遇到了一个名为emptyObject.js的文件,目前看起来像这样:

/**
 * Copyright (c) 2013-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @providesModule emptyObject
 */

'use strict';

const emptyObject = {};

if (__DEV__) {
  Object.freeze(emptyObject);
}

module.exports = emptyObject;

两个问题:

  1. 为什么仅在开发模式下使用Object.freeze(...)
  2. 首先是这个功能的目的是什么?
  3. 根据上面的第二个问题,为什么不做这样的事情:

    const myObj = {};
    

    的好处是什么?
    import emptyObject from ‘fbjs/lib/emptyObject’;
    ...
    const myObj = emptyObject;
    

1 个答案:

答案 0 :(得分:2)

emptyObjectsingleton。它只创建一次,因此只使用一次内存。此外,您可以比较emptyObject的两次出现并且它们将是相等的(===),同时具有两个不同的空对象,它们是分开创建的,它们将不相等。反应代码在多个位置使用emptyObject,例如默认值应为空对象或函数应返回空对象。不是总是创建一个新的空对象,而是使用单例。

我猜他们在开发中使用Object.freeze()来在您为反应库编写代码时意外尝试改变该对象时收到错误。在生产中,您通常会尝试抑制与库内部相关的错误。