最近在看jquery源码,发现自己的js基础真不是一般的弱!!!这不,赶紧来恶补了!
一、基本类型
也称值类型,包括字符串(string)、数字(number)、布尔(boolean)、Null、Undefined、Symbol(ES6新增,类似于string的数据类型,表示独一无二,详情见MDN-Symbol)六种基本类型。
特点:
1. 指向的内存空间不会变
2. 按值访问,可以操作变量实际值
3. 存放在栈区(栈区指内存里的栈内存),包括变量的标识符和变量的值。
复制的例子:
var a=3;
var b=a;
console.log(a);//3
b=5;
console.log(a);//3
console.log(b);//5
显然,a 不会随b的改变而改变。值类型就像陌生人一样,虽然都是人,但我有我的特色,你有你的爱好,各自都没有影响。
二、引用类型(敲黑板、重点)
数组(array)、对象(object)、函数(function)
PS:其实也可以直接说object一种,毕竟一切皆对象嘛,哈哈
特点:
- 在计算机中占用内存可变
- 访问是按引用访问。当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值
- 值保存在内存中,而JS是不能直接访问内存的,所以对于引用类型,操作的不是实际的对象而是对象的引用。
复制的例子:
var obj1={
"name":'jack',
"lesson":{
"Chinese":'110',
"Mathematics":"135"
}
}
var obj2=obj1.lesson;
obj1.lesson.English="90";
console.log(obj1.lesson.English);//90
console.log(obj2.English);//90
obj2属性和值随着obj1的改变而改变!
调换下顺序,改变obj2属性,不改变obj1,看下结果:
var obj1={
"name":'jack',
"lesson":{
"Chinese":'110',
"Mathematics":"135"
}
}
var obj2=obj1.lesson;
obj2.English="90";
console.log(obj2.English);//90
console.log(obj1.lesson.English);//90
obj1属性和值随着obj2的改变而改变!
引用类型的复制实际上是共用一个指针,而这个指针指向存储在堆中的一个对象。两个变量实际上引用的是同一个对象。
这种感觉就像夫妻一样,你影响着我,我影响着你。
所以这种复制也叫浅拷贝啦。什么?什么叫深拷贝?看官先自行思考熟悉下,待我下回分解 O(∩_∩)O
比较的例子:
var a = new Number(1);
var b = new Number(1);
var c = a; // 把a的引用赋值给c
console.log(a==b); // false
console.log(a==c); // true
a和b分别new了个Number 对象,指向不同对象的引用,因此a!=b;而c=a,即a和c的引用地址是一样的,所以a==c。
不难看出,js中对象的比较实际是内存地址的比较
传递的例子:
var a = [1,2,3];
function f(x){
x[0] = 4; // 在函数中修改参数值
}
f(a);
console.log(a[0]);
a作为参数传递的也是引用,最后a的值为[4,2,3]
最后,一个备受争议的例子:
function setName(obj){
obj.name="ted";
obj=new Object();//个人觉得这明明就是作用域问题,局部变量没有return,执行完就销毁了
obj.name="marry";
}
var obj=new Object();
setName(obj);
console.log(obj.name);
个人觉得就是作用域问题,不知道争论的点和引用传递有什么关系。。。
最后
引用类型或许单独看着很简单,但是如果在复杂的应用中(尤其是上下文依赖比较严重的地方)还是能一眼看穿,那就是真大神了吧!(努力ing)