js 值类型和引用类型

最近在看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一种,毕竟一切皆对象嘛,哈哈

特点:
  1. 在计算机中占用内存可变
  2. 访问是按引用访问。当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值
  3. 值保存在内存中,而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)

参考文章:

挺喜欢这个猿的比喻:js 值类型和引用类型
值类型和引用类型堆栈的深入理解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容