如何在数组中过滤出仅为Symbol类型的值?

3

我正在开发Arrow库,其中我正在创建一个仅返回类型为Symbol的元素的函数。

我在数组上使用filter函数:

export const extractSymbol = array => {
    if (isArray(array)) {
        return array.filter(value => typeof value === "symbol")
    }
}

因为我是在实现之前创建测试,所以这个测试失败了:

  expect(extractSymbol([1, 2, 4, Symbol('vue'), Symbol('react')])).toStrictEqual([Symbol('vue'), Symbol('react')]);
   

我预期的结果是true,但实际返回的是:
 Expected: [Symbol(vue), Symbol(react)]
 Received: serializes to the same string
2个回答

1

使用相同参数创建的两个符号彼此不相等:

console.log(
  Symbol('foo') === Symbol('foo')
);

为了让测试正常工作,需要在expect之外定义符号,这样你就可以将同一引用传递给两个数组:

const s1 = Symbol('vue');
const s2 = Symbol('react');
expect(extractSymbol([1, 2, 4, s1, s2])).toStrictEqual([s1, s2]);

测试通过了,但我可以知道在数组内部和外部创建的区别是什么,以及具体发生了什么吗? - Menai Ala Eddine - Aladdin
[Symbol('vue')], [Symbol('vue')],你调用了 Symbol 两次,所以这些符号是不同的(彼此不相等)。但是用 const s = Symbol('vue'); compare([s], [s]),你只调用了 Symbol 一次,所以创建的一个符号等于它自己。 - CertainPerformance
一种看待它的方式是,它有点像对象:{} !== {},但是 const obj = {}; obj === obj - CertainPerformance

0

试试这个:

let arr = [Symbol('foo'), 123];

let filtered = arr.filter(x => typeof(x) == 'symbol');
console.log(filtered);


不幸的是,测试失败了,但是typeof和没有括号的typeof之间有什么区别呢? - Menai Ala Eddine - Aladdin
typeof 'example' 和 typeof('example') 都是有效的语法。 - sonEtLumiere
但是问题与语法无关。 - Menai Ala Eddine - Aladdin
我是说你可以带或不带括号来使用 typeof。 - sonEtLumiere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接