JS中数组的基础类型和引用类型的解释,以及Array类型的常用操作方法

基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。

                            基本数据类型有这五种:Undefined、Null、String、Number、Boolean。

                             ps: 基础类型就这几个

引用类型:当赋值保存着对象的某个变量时,操作的是对象的引用,但在为对象添加属性时,操作的是实际的对象。引用类型值                      指那些可能为多个值构成的对象。

                   引用类型有这几种:object、Array、RegExp、Date、Function、特殊的基本包装类型(String、Number、Boolean)以                       及单体内置对象(Global、Math)。

                   ps: 引用类型 => 堆栈 => 指针 => 牵一发而动全身

目录

区别:

传递参数:

检测类型:


区别:

① 引用类型值可添加属性和方法,基本类型值不可以。

//为引用类型值添加属性
var p = new Object();
p.age=11;
alert(p.age);//11

//为基本类型值添加属性
var name = 'a';
name.age = 11;
alert(name.age); //undefined

  ② 赋值变量值时

     基本类型会在变量对象上创建一个新值,再复制给新变量。此后,两个变量的任何操作都互不影响

     引用类型是将存储在变量对象的值复制一份给新变量,但是两个变量的值都指向存储在堆中的一个对象,牵一发而动全身

//基本类型
var a = 1
var b = a
a = 2 // 后续操作不会影响到b
alert(b); //1
//引用类型,以数组为例

//1.对其中一个变量直接赋值不会影响到另一个变量*******并未操作引用的对象********
var a = [1, 2, 3]
var b = a
a = [1, 2, 3, 4]
alert(a) //1, 2, 3, 4
alert(b) //1, 2, 3

//2.使用push(操作了引用的对象)
var a = [1, 2, 3]
var b = a
a.push(4)
alert(a) //1, 2, 3, 4
alert(b) //1, 2, 3, 4

传递参数:

按值传递,将函数外部的值复制给函数内部的参数(一个局部变量),当对局部变量进行操作时,局部变量的变化会反应在函数外部,但是这并不会影响函数外部的值

function add(a){
    a += 10;
    return a;
}

var num = 10;
var result = add(num);
alert(num); //10
alert(result); //20

使用对象时

function setName(obj){
    obj.name = 'a'
}
var p = new Object()
setName(p)
alert(p.name) //a

明明参数是按值传递的,为什么创建的p实例也能获取到在setName()中添加的name属性呢?

因为obj和p引用的是同一个对象,即便按值传递,obj也会按引用来访问同一个对象。接着看例子

function setName(obj){
    obj.name = 'a'
    obj = new Object()
    obj.name = 'b'
    return obj
}
var p = new Object()
var p2 = setName(p)
alert(p.name) // a
alert(p2.name) // b

在函数内部重写obj对象,此时obj对象引用的是一个局部对象,外部的p还是原始的引用,因此不会改变。

检测类型:

typeof:确定变量是字符串、数值、布尔值还是undefined

instanceof :判断是否是某个对象类型

如:

var a = [1,2,3];
alert(a instanceof Object); //true **********
alert(a instanceof Array); //true **********
alert(a instanceof RegExp); //false


**************************************************华丽的分割线*********************************************************************************

Array 类型

(array和object很常用,互相配合.常常是一个数组里边包含了几个对象) 即: arr = [  {obj1},  {obj2},  {obj3}, .....  ] 对象有键值对

push: 把一个元素或一组元素(数组)添加到当前数组的末尾

var arr1 = [1, 2, 3]
var arr2 = [4, 5 ,6]
arr1.push(arr2) // [1, 2, 3, arr2]

                arr2作为一个元素,最后成了数组中的第四位为一个数组元素,数组包含数组

concat: 把两个数组或元素组合在一起,但是不会改变原始调用者(arr1)的结构

var arr1 = [1, 2, 3]
var arr2 = [4, 5 ,6]
var arr3 = arr1.concat(arr2)

                arr3结果为: [1, 2, 3, 4, 5, 6]

                arr1结果为: [1, 2, 3]

pop:  删除数组中最后一个元素,并返回删除的元素

var arr1 = [1, 2, 3]
var val = arr1.pop()

console.log(arr1) // [1, 2]
console.log(val) // [3]

splice:  删除指定的元素 or 插入指定的元素....函数原型 splice(index,howmany,element1,.....,elementX)

                 index---要删除的开始下标,

                howmany---要删除的元素个数,

                element---(可选)从index开始,要插入的元素

                该方法的返回值---被删除掉的那部分数组

var arr1 = [1, 2, 3, 4, 5]
var arr2 = arr1.splice(0, 2)

alert(arr1) // [3, 4, 5]
alert(arr2) // [1, 2]

                  PS:这个方法一般我用的比较多的就是删除数组的所有元素:arr1.splice(0, arr1.length)

slice: 规定咋样遍历数组      slice(start, end)  返回从start到end位置的子数组,对原始数组有影响

var arr1 = [1, 2, 3, 4, 5]

alert(arr1.slice(0)) // [1, 2, 3, 4, 5]
alert(arr1.slice(1, 3)) // [2, 3, 4]

  ps: ⅠrechargeRecord页面的存储list数组的用法,var listReplace = this.list[0] 后面再配上i表示list数组的新位置内容

        Ⅱstring中slice用法,返回一个子片段,对原先的string没有影响,与subString的区别是,还可以用负数当参数

var s = "abcdefg"
s.slice(0,4)    // Returns "abcd"
s.slice(2,4)    // Returns "cd"
s.slice(4)      // Returns "efg"
s.slice(3,-1)   // Returns "def"
s.slice(3,-2)   // Returns "de"
s.slice(-3,-1)  // Should return "ef"; returns "abcdef" in IE 4

猜你喜欢

转载自blog.csdn.net/weixin_42615719/article/details/81838173