Rumah > hujung hadapan web > tutorial js > Javascript伪数组是什么?javascript伪数组的简单介绍

Javascript伪数组是什么?javascript伪数组的简单介绍

不言
Lepaskan: 2018-09-27 17:35:00
asal
2640 orang telah melayarinya

本篇文章给大家带来的内容是关于Javascript伪数组是什么?javascript伪数组的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

什么是伪数组?

伪数组是一个含有length属性的json对象

例如:

1

2

3

4

5

{

    0: 1,

    1: 2,

    length: 2

}

Salin selepas log masuk

常见的伪数组

arguments、NodeList、HTMLCollection、Jquery对象...

伪数据如何转成标准数组

使用Array.slice

1

2

3

4

5

6

7

function toArray() {

    console.log(arguments instanceof Array) // false

    arguments = Array.prototype.slice.call(arguments)

    console.log(arguments instanceof Array) // true

    return arguments

}

toArray(1,2,3) // [1, 2, 3]

Salin selepas log masuk

Array.slice源码解析

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

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

function ArraySlice(start, end) {

    CHECK_OBJECT_COERCIBLE(this, "Array.prototype.slice");

 

    var array = TO_OBJECT(this); 

    var len = TO_LENGTH(array.length); // 取数据length

    var start_i = TO_INTEGER(start); // 开始值转Number

    var end_i = len; // 结束值直接取array的length

 

    if (!IS_UNDEFINED(end)) end_i = TO_INTEGER(end); // 参数有end则使用end

 

    if (start_i < 0) { // 开始值为负数,重新计算值,从尾部往前推算

        start_i += len;

        if (start_i < 0) start_i = 0; // 负数的绝对值超过长度,开始值赋值为0

    } else {

        if (start_i > len) start_i = len; // 开始值超过长度, 开始值赋值为len

    }

 

    if (end_i < 0) { // 结束值为负数,重新计算值,从尾部往前推算

        end_i += len;

        if (end_i < 0) end_i = 0; // 负数的绝对值超过长度,结束值赋值为0

    } else {

        if (end_i > len) end_i = len; // 开始值超过长度, 结束值赋值为len

    }

 

    var result = ArraySpeciesCreate(array, MaxSimple(end_i - start_i, 0)); // 创建一个数组

 

    if (end_i < start_i) return result; // 结束值小于开始值,那么直接返回空数组

 

    if (UseSparseVariant(array, len, IS_ARRAY(array), end_i - start_i)) { // array是数组

        %NormalizeElements(array);

        if (IS_ARRAY(result)) %NormalizeElements(result);

        SparseSlice(array, start_i, end_i - start_i, len, result);

    } else { // array不是数组

        SimpleSlice(array, start_i, end_i - start_i, len, result);

    }

 

    result.length = end_i - start_i;  // 数组长度赋值

 

    return result;

}

/*

* array 具体操作的数组

* start_i 开始位置

* del_count 需要处理的长度

* len 数组长度

* deleted_elements 利用浅拷贝,返回结果,对于slice来说,是选择的那部分数组,对于splice来说,是删除的那些数组

*/

function SparseSlice(array, start_i, del_count, len, deleted_elements) {

    // Move deleted elements to a new array (the return value from splice).

    var indices = %GetArrayKeys(array, start_i + del_count);

    if (IS_NUMBER(indices)) {

        var limit = indices;

        for (var i = start_i; i < limit; ++i) {

            var current = array[i];

            if (!IS_UNDEFINED(current) || i in array) {

                %CreateDataProperty(deleted_elements, i - start_i, current);

            }

        }

    } else {

        var length = indices.length;

        for (var k = 0; k < length; ++k) {

            var key = indices[k];

            if (key >= start_i) {

                var current = array[key];

                if (!IS_UNDEFINED(current) || key in array) {

                    %CreateDataProperty(deleted_elements, key - start_i, current);

                }

            }

        }

    }

}

/*

* array 具体操作的数组

* start_i 开始位置

* del_count 需要处理的长度

* len 数组长度

* deleted_elements 利用浅拷贝,返回结果,对于slice来说,是选择的那部分数组,对于splice来说,是删除的那些数组

*/

function SimpleSlice(array, start_i, del_count, len, deleted_elements) {

    for (var i = 0; i < del_count; i++) {

        var index = start_i + i;

        if (index in array) {

            var current = array[index];

            %CreateDataProperty(deleted_elements, i, current);

        }

    }

}

Salin selepas log masuk

Atas ialah kandungan terperinci Javascript伪数组是什么?javascript伪数组的简单介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan