• 函数中基本类型和引用类型传参区别


    请写出如下代码运行的结果并解释为什么?[代码]

        var type = 'images';
        var size = {width: 800, height: 600};
        var format = ['jpg', 'png'];
    
        function change(type, size, format){
            type = 'video';
            size = {width: 1024, height: 768};
            format.push('map');
        }
    
        change(type, size, format);
    
        console.log(type, size, format);

    最后的打印结果为:images { 800, height: 600 } [ 'jpg', 'png', 'map' ]

    实际上就是函数形参的传递根据实参值的类型分为值复制(对应基本类型)和引用复制(对应引用类型);

    通过值复制的值无论怎么改变都不会影响原来的值(对应type变量的情况),而通过引用复制的值改变后原值也会改变(对应format变量的情况),但是直接改变引用本身并不会影响其他引用(即引用另一个引用类型的值时,原值的其他引用不会改变;对应size变量的情况);

    参考:《你不知道的JavaScript(中卷)2.5小节》

    type 与size,在执行上下文中,因为是形参,活动对象会创建type、size两个属性,并被赋值,函数的参数,本质是传值。type与size在活动对象中,一开始被赋值 ‘images'、‘{ 800, height: 600}’,后来又被重新改写,
    不影响全局的变量,format 一开始初始化时,同sise、type,但是在format不是重新赋值操作,是在原来的基础上,修改了原数组。

    var type = 'images'; // 基础类型
    	var size = {width: 800, height: 600}; // 引用类型
    	var format = ['jpg', 'png']; // 引用类型
    
    	// js 以函数作为作用域,定义在函数内部的变量与外部的变量相互不影响
    	function change(type, size, format){
    		// 函数接受了三个参数,在函数生成上下文的时候,会先进行变量的声明和提升
    		// 尽管与全局变量名称相同,但是是互不影响的
    
    		// var type = type;
    		// var size = size;
    		// var format = format;
    
    		// 对变量进行赋值
    		// 由于作用域的关系,会先找到定义在 change 中的 type,而非全局的 type
    		// 如果在 change 中没有定义过 type 即没有作为参数的话,则这么赋值会影响全局的 type
    		type = 'video';
    
    		// 同样对 change 内的 size 进行赋值,这里赋的是 size 的引用地址,实际与全局的 size 指向同一个对象
    		// 所以如果进行了 size.dpi = 666 类似的操作,就会影响到全局的 size
    		size = {width: 1024, height: 768};
    
    		// format 是引用类型,因此指向的内存引用与全局的相同
    		// 所以 push 方法会对全局的 format 产生影响
    		format.push('map');
    	}
    
    	change(type, size, format);
    
    	console.log(type, size, format);
    
    	// 'images', {800, height:600}, ['jpg', 'png', 'map']
     
  • 相关阅读:
    Python标准库 -- UUID模块(生成唯一标识)
    Python全局解释器锁 -- GIL
    Python Web Server Gateway Interface -- WSGI
    Mysql 和 Postgresql 抛开性能的对比
    一篇文章掌握RequireJS常用知识
    彻底理解js中的闭包
    全面理解Javascript闭包和闭包的几种写法及用途【转】
    JS 日期转换,格式化等常用的函数定义
    把上传过来的多张图片拼接转为PDF的实现代码
    C# Stream 和 byte[] 之间的转换(文件流的应用)
  • 原文地址:https://www.cnblogs.com/yzhihao/p/11469469.html
Copyright © 2020-2023  润新知