热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js函数中参数的通报

媒介本日再看React纯函数的时刻,看到纯函数历程没有副作用,就是说在纯函数中我们不能转变外部状况.想到了之前看过的函数中传参的观点.数据范例在js中,数据范例分为两类:基础范例值

媒介

本日再看React纯函数的时刻,看到纯函数历程没有副作用,就是说在纯函数中我们不能转变外部状况.
想到了之前看过的函数中传参的观点.

数据范例

在js中,数据范例分为两类:基础范例值(undefined,null,Boolean,Number,String)和援用范例值(Object,Arrat,Function).

变量的复制

1.js中变量的基础范例和援用范例保留体式格局是差别的,这也就致使变量复制时也就差别了.
假如从一个变量向另一个变量复制基础范例的值时,会将前者的值克隆一个,然后将克隆的值
赋值到后者,因而这两个值是完整自力的,只是他们的value雷同罢了.

var num1 = 10;
var num2 = num1;
console.log(num1); // 10
num2 += 1;
console.log(num1); // 10
console.log(num2); // 11

2.援用范例的复制
援用范例复制对象时并不会在堆内存中新天生一个如出一辙的对象,只是多了一个保留指向这个对象指针的变量罢了.
将obj1的值复制给obj2,而这个值的副本实际上是一个指针,这个指针指向存储在堆中的一个对象,
也就是说创建了一个新的内存地点传给了obj2,obj1和obj2两个变量同时指向了同一个Object,当去转变这个对象,
他们的值都邑转变,也等于说他们中任何一个做出的转变都邑反应到另一个身上.

var obj1 = {
a: 1
};
var obj2 = obj1;
console.log(obj2); // {a: 1}
obj2.a = 10;
console.log(obj1); // {a: 10}
console.log(obj2); // {a: 10}

函数参数的通报

一切函数的参数都是按值通报的,也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制
到另一个变量一样.所以假如能明白变量的复制,那末参数的通报也就很简单了.
1.基础范例传参

var count = 10;
function num(num1) {
num1 = 1;
return num1;
}
var count1 = num(count);
console.log(count1); // 1
console.log(count); //10

2.援用范例传参

var o = {
a: 1
};
function fun(o) {
o.a = 10;
return o;
}
var p = fun(o);
console.log(o); // {a: 10}
console.log(p); // {a: 10}

3.援用范例传参指针转变
在函数中从新定义了一个对象,也就是如今堆内存中有两个对象,外部的oo指向的是老的对象,被传入参数后
指向的是新定义的对象,所以调用后返回的值是新定义的对象的值.
假如参数是按援用通报的,那末oo也是a:10,从这点能够看出参数是按值通报的.

var oo = {
a: 1
};
function gun(o) {
o = {
a: 10
};
return o;
}
var pp = gun(oo);
console.log(oo); // {a: 1}
console.log(pp); // {a: 10}

总结

函数的参数是值通报,对象范例作为参数的时刻通报的是地点(指针)的值,而不是对象自身堆内存中的value.
所以这类场景,函数内部用参数去修正对象,那末查找到的照样原对象,由于指向雷同,所以修正的话原对象
也受影响.
假如实例化一个对象赋值给该指针,那末指针指向的是一个全新的对象了,和本来指向的对象落空联络.


推荐阅读
author-avatar
MISSLOVE0710
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有