fei.wang
10 天以前 ae7b22322555448d95fd56f505bafa325c167a26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
'use strict';
 
var test = require('tape');
var hasSymbols = require('has-symbols/shams')();
var hasPropertyDescriptors = require('has-property-descriptors')();
 
var ownKeys = require('../');
 
/** @type {(a: PropertyKey, b: PropertyKey) => number} */
function comparator(a, b) {
    if (typeof a === 'string' && typeof b === 'string') {
        return a.localeCompare(b);
    }
    if (typeof a === 'number' && typeof b === 'number') {
        return a - b;
    }
    return typeof a === 'symbol' ? 1 : -1;
}
 
test('ownKeys', function (t) {
    t.equal(typeof ownKeys, 'function', 'is a function');
    t.equal(
        ownKeys.length,
        1,
        'has a length of 1'
    );
 
    t.test('basics', function (st) {
        var obj = { a: 1, b: 2 };
        if (hasPropertyDescriptors) {
            Object.defineProperty(obj, 'c', {
                configurable: true,
                enumerable: false,
                writable: true,
                value: 3
            });
        }
 
        st.deepEqual(
            ownKeys(obj).sort(comparator),
            (hasPropertyDescriptors ? ['a', 'b', 'c'] : ['a', 'b']).sort(comparator),
            'includes non-enumerable properties'
        );
 
        st.end();
    });
 
    t.test('symbols', { skip: !hasSymbols }, function (st) {
        /** @type {Record<PropertyKey, unknown>} */
        var obj = { a: 1 };
        var sym = Symbol('b');
        obj[sym] = 2;
 
        var nonEnumSym = Symbol('c');
        Object.defineProperty(obj, nonEnumSym, {
            configurable: true,
            enumerable: false,
            writable: true,
            value: 3
        });
 
        st.deepEqual(
            ownKeys(obj).sort(comparator),
            ['a', sym, nonEnumSym].sort(comparator),
            'works with symbols, both enum and non-enum'
        );
 
        st.end();
    });
 
    t.end();
});