我正在阅读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;
两个问题:
Object.freeze(...)
?根据上面的第二个问题,为什么不做这样的事情:
const myObj = {};
的好处是什么?
import emptyObject from ‘fbjs/lib/emptyObject’;
...
const myObj = emptyObject;
答案 0 :(得分:2)
emptyObject
是singleton。它只创建一次,因此只使用一次内存。此外,您可以比较emptyObject
的两次出现并且它们将是相等的(===
),同时具有两个不同的空对象,它们是分开创建的,它们将不相等。反应代码在多个位置使用emptyObject
,例如默认值应为空对象或函数应返回空对象。不是总是创建一个新的空对象,而是使用单例。
我猜他们在开发中使用Object.freeze()
来在您为反应库编写代码时意外尝试改变该对象时收到错误。在生产中,您通常会尝试抑制与库内部相关的错误。