红宝书--JavaScript的变量,值,引用

本文详细介绍了JavaScript中的数据类型,包括基本类型与引用类型的区别,以及如何使用typeof和instanceof来检测变量类型。同时,文章还探讨了变量复制时基本类型与引用类型的差异,并讨论了这些类型在函数参数传递中的行为。

   之前因为一些事情离开了一段时间,现在打算开一个系列,记录刷红宝书时遇到的一些疑惑点和个人理解。

   首先,JavaScript的内置类型有7种:

  • Null
  • Undefined
  • Boolean
  • String
  • Number
  • Object
  • Symbol(es6)    
  其中,Object是引用类型值,其余都是基本类型值。

  在检测基本数据类型的时候,一般用typeof,typeof会返回一个表示数据类型的字符串。有两点需要注意的是:

  1. typeof null   //"object"
  2. 对未初始化和未声明的变量执行typeof操作都会返回"undefined"。(对未声明的变量只能进行一种操作,即typeof)

  在检测引用类型值的时候,我们需要知道它具体是什么类型的对象,这个时候typeof就没用了,需要用到instanceof。例如:

  • [1,2] instanceof Array    //true

同样,也可以用object的原型对象方法toString检测,例如:

var obj = [1, 2];
Object.prototype.toString.bind(obj)().slice(8, -1); //Array

  下面聊一下js的变量。js是弱类型语言,在声明变量的时候,无需像java一样规定它是int还是string或是其他,用一个var就能搞定(es5)。甚至,可以用一个原本保存数值的变量再去保存字符串,对象等(实际编码时应该尽量避免)。因此,不难理解js的变量是没有类型的,变量保存的值才有类型。

   这篇文字的侧重点在后面的引用,因此前面的内容只写了个大概,上述的点每个地方展开都有很多内容可写,想了解的可以自行查找下资料。

   理解js引用的工作机制,最关键需要知道js的引用指向的是值而不是另一个变量。在红宝书第四章关于变量复制所给出的图示我们可以得到以下结论:基本类型值的复制是复制值,引用类型的复制是复制“指针”,这个指针指向内存空间的对象。

var num = 5;
var num_copy = num;
num++;
num       //6
num_copy  //5   
var obj = [1, 2];
var obj_copy = obj;
obj.push(3);
obj        //[1,2,3]
obj_copy   //[1,2,3]

其结果就是,基本类型复制后得到的两个变量保存的值相同,但互不相关。引用类型复制后得到的两个变量保存的值都是一个指针,指向同一个对象,因此改变任一一个,引用的对象发生改变,另一个变量也随之改变。

基本类型和引用类型作为函数参数传递时理解起来可能会有些困惑。在js中所有函数的参数都是按值传递,也就是说我们在给函数传递参数的时候,过程就和上面说的变量复制是一样的。

function add(num) {
  num++;
  return num;
}
var zero = 0;
var result = add(zero);    //zero = 0,result =1         
function handleArray(x) {
  x.push(8);
  x = [1, 2, 3];
}
var arr = [1];
handleArray(arr);
arr;  //[1,8]
在方法handleArray中,我们向函数传递arr,此时参数x通过引用复制拿到指向保存数组 [1]的指针,arr和参数x指向同一个对象。方法中向数组添加一项,arr和参数x指向的对象变为[1,8],然后将参数x指向数组[1,2,3],但是arr的指向没有改变,所以访问arr得到的结果是[1,8]。如果需要让arr和参数x始终表现一致,我们只能通过修改它们共同指向的对象达到目的

那么,到这里你可能会想,怎样才能让基本类型和引用类型在做函数参数传递的时候的表现对调?

首先,关于上面的叙述,我们需要明确两点:

  1. 基本类型值在复制,传递时是通过值复制;引用类型则是通过引用复制(复制的是“指针”)
  2. js函数是值传递。

因此,想做到表现对调,我们需要对数据进行“包装”,将基本类型包装到对象中,将引用类型通过值复制的方式创建一个副本。

暂时写到这,以后有这块的新想法再做更新,也欢迎大家提出宝贵的意见。

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值