• JS的基础类型与引用类型


    两种类型:

    1.   ECMAScript变量包含两种不同类型的值:基本类型值、引用类型值;

    2.   基本类型值:指的是保存在栈内存中的简单数据段;

    3.   引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象;

    两种访问方式:

    4.   基本类型值:按值访问,操作的是他们实际保存的值;

    5.   引用类型值:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值;

    JS的基础类型与引用类型

    两种类型复制

    1.   基本类型变量的复制:从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上;

    JS的基础类型与引用类型

    1.   引用类型变量的复制:复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象;

    2. 复制操作结束后,两个变量实际上将引用同一个对象;因此改变其中的一个,将影响另一个;

    JS的基础类型与引用类型

    函数参数的传递:

    1.   ECMA中所有函数的参数都是按值传递的;

    JS的基础类型与引用类型

    两种变量类型检测

    1.   Typeof操作符是检测基本类型的最佳工具;

    2.   如果变量值是nul或者对象,typeof 将返回“object”;

    3.   Instanceof用于检测引用类型,可以检测到具体的,它是什么类型的实例;

    4.   如果变量是给定引用类型的实例,instanceof操作符会返回true;

    JS的基础类型与引用类型

    参数的传递

    ECMAScript所有的函数的参数都是按值传递的。
    函数外部的值赋值给函数内部的参数,与一个变量复制到另一个变量一样。
    基本类型值的传递和基本类型一样,引用类型的传递和引用类型的复制一样。
    function addTen(num) {
    num +=10;
    return num;
    }
    var count = 20;
    var result = addTen(count);
    console.log(count); //20没有变化
    console.log(result);// 30

    引用类型也是按值传递

    function setName(obj) {
    obj.name = 'kenny';
    obj = new Object();
    obj.name = 'kongyun';
    }

    var person = new Object();
    setName(person);
    console.log(person.name); // 'kenny'

    即使在函数内部修改了参数的值,但原始的引用(person对象,存储在堆上)仍保持不变。
    具体传递的obj不是指针而是指针引用的对象(副本copy)。
    实际上,当在函数内部重写obj时,这个变量的引用的就是一个局部对象了,
    而这个局部对象会在函数执行完毕后立即被销毁。

    类似于这种例子 - -

    var a = [1, 2];
    var b = a;
    a = {a:1, b:2};//虽然a改变了,但是b依然没变,值传递,复制了个指针

    扩展:值传递与引用传递

    值传递:call by value
    引用传递:call by Call by reference
    值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),

    这是对调用函数时,求值和传值的方式的描述,而非传递的内容的类型(内容指:是值类型还是引用类型,是值还是指针)。

    值类型/引用类型,是用于区分两种内存分配方式,值类型在调用栈上分配,引用类型在堆上分配。

    一个描述内存分配方式,一个描述参数求值策略,两者之间无任何依赖或约束关系。

    区别 值传递 引用传递
    根本区别 会创建副本(copy) 不创建副本
    所以 函数中无法改变原始对象 函数中可以改变原始对象
    对于值传递,无论是值类型还是引用类型,都会在调用栈上创建一个副本,不同是,对于值类型而言,这个副本就是整个原始值的复制。而对于引用类型而言,由于引用类型的实例在堆中,在栈上只有它的一个引用(一般情况下是指针),其副本也只是这个引用的复制,而不是整个原始对象的复制。

    这便引出了值类型和引用类型(这不是在说值传递)的最大区别:值类型用做参数会被复制,但是很多人误以为这个区别是值类型的特性。其实这是值传递带来的效果,和值类型本身没有关系。只是最终结果是这样。

  • 相关阅读:
    【转】Windows2012设置文件夹权限报错:failed to enumerate objects in the container.
    Vue 中背景图片路径怎么加参数?
    C#有小数位数直接进位为整数;JavaScript Math有小数位数取整方法
    C# Linq to Entity使用Groupby查询时超时或很慢解决思路
    colModel的设置(给单元格指定颜色等)
    金额的表示方法
    jqGrid表格时间格式化 ,formatoptions: {srcformat:'Y-m-d H:i:s',newformat:'Y-m-d H:i:s H:i:s'}
    HTTP Error 414. The request URL is too long. asp.net解决方案
    radio/checkbox各种操作
    Kubernetes常用命令总结
  • 原文地址:https://www.cnblogs.com/sunsie/p/6140302.html
Copyright © 2020-2023  润新知