美文网首页程序员让前端飞
js 值类型和引用类型

js 值类型和引用类型

作者: 嘻哈章鱼小丸子 | 来源:发表于2017-08-15 20:13 被阅读0次

最近在看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 值类型和引用类型
值类型和引用类型堆栈的深入理解

相关文章

  • js变量的类型和计算

    js变量类型:值类型和引用类型值类型:number,string,boolean,undefined,symbol...

  • js基本类型与引用类型

    1.js基本类型和引用类型 首先js的变量有两种类型,基本类型值和引用类型值 基本数据类型:null,undefi...

  • [JavaScript] F.prototype=1

    js是区分引用类型和值类型的值类型:数值,布尔值,null,undefined引用类型:对象,数组,函数 (1)如...

  • 引用类型和对象拷贝

    一、引用类型有哪些?非引用类型有哪些 JS 中分基本类型和引用类型。 基本类型值(数值、布尔值、字符串、null和...

  • JS 基础知识巩固(JS面试宝典-全面透彻)

    第一章:JS 基础上篇(js 类型) 值类型 引用类型 问题:为什么对值类型和引用类型进行修改会出现不同的结果呢?...

  • JS中实现浅拷贝和深拷贝

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中...

  • JS基础知识 (一)--变量类型和计算

    变量类型 js变量类型分为基本类型(或者叫值类型)和引用类型。(按照存储方式区分)• 值类型值类型:Number、...

  • JS基本类型和引用类型

    JS中可以把变量分成两部分,基本类型和引用类型。 JavaScript值类型和引用类型有哪些(1)值类型:数值、布...

  • 深浅拷贝

    JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会进...

  • JS值类型和引用类型

    1.值类型(基本数据类型) 值类型是存储在栈(stack)中的简单数据,存储在变量处的就是指 2.引用类型 其实a...

网友评论

    本文标题:js 值类型和引用类型

    本文链接:https://www.haomeiwen.com/subject/gbrurxtx.html