基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。
基本数据类型有这五种: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