如何检查对象是否是不可变的?

Gaj*_*jus 42 immutable.js

不可变对象可以是以下实例:

  • Immutable.List
  • Immutable.Map
  • Immutable.OrderedMap
  • Immutable.Set
  • Immutable.OrderedSet
  • Immutable.Stack

mbh*_*mbh 41

有一个开放的票证来改进API,这是4.0的路线图.在实施之前,我建议您使用Immutable.Iterable.isIterable()(docs).

使用instanceof不可靠的(例如,当不同的模块使用Immutable.js的不同拷贝返回false)


Gaj*_*jus 23

我已经了解到使用instanceof确定对象是不可变的是不安全的:

模块A:

var Immutable = require('immutable');
module.exports = Immutable.Map({foo: "bar});
Run Code Online (Sandbox Code Playgroud)

模块B:

var Immutable = require('immutable');
var moduleA = require('moduleA');
moduleA instanceof Immutable.Map // will return false
Run Code Online (Sandbox Code Playgroud)

Immutable.js API定义了以下方法来检查对象是否是Immutable的实例:

后者检查是否:

如果是Iterable或其任何子类,则为True.

List,Stack,Map,OrderedMap,SetOrderedSet是所有子类Iterable.


Ant*_*vik 19

Immutable.js自v4.0.0-rc.1以来有isImmutable()函数:

 import { isImmutable, Map, List, Stack } from 'immutable';

 isImmutable([]); // false
 isImmutable({}); // false
 isImmutable(Map()); // true
 isImmutable(List()); // true
 isImmutable(Stack()); // true
 isImmutable(Map().asMutable()); // false
Run Code Online (Sandbox Code Playgroud)

如果您使用以前的版本之一,则可以通过以下方式检查对象是否为Immutable:

 Immutable.Iterable.isIterable(YOUR_ENTITY)
Run Code Online (Sandbox Code Playgroud)

因为所有不可变的都继承自Iterable对象

  • 这在3.8.1中不可用 (8认同)