今遇js基础类型等问题,已经有点模糊,遂作总结。

前言:

JavaScript原始类型:Undefined、Null、Boolean、Number、String、Symbol JavaScript引用类型:Object;

原始类型又被称为基本类型,原始类型保存的变量和值直接保存在栈内存(Stack)中,且空间相互独立,通过值来访问;虽然原始类型的值是储存在相对独立空间,但是它们之间的比较是按值比较的;

引用类型即Object 类型,再往下细分,还可以分为:Object 类型、Array 类型、Date 类型、Function 类型 等。与原始类型不同的是,引用类型的内容是保存在堆内存中,而栈内存(Heap)中会有一个堆内存地址,通过这个地址变量被指向堆内存。

1.JavaScript中的基本类型传递

一个我们经常遇到的问题:“JS中的值是按值传递,还是按引用传递呢?”

由于js中存在复杂类型和基本类型,对于基本类型而言,是按值传递的.

var a = 1;
function test(x) {
x = 10;
console.log(x);
}
test(a); // 10
console.log(a); // 1

虽然在函数testa被修改,并没有有影响到 外部a的值,基本类型是按值传递的.


2.复杂类型按引用传递?

我们将外部a作为一个对象传入test函数.

var a = {
a: 1,
b: 2
};
function test(x) {
x.a = 10;
console.log(x);
}
test(a); // { a: 10, b: 2 }
console.log(a); // { a: 10, b: 2 }

可以看到,在函数体内被修改的a对象也同时影响到了外部的a对象,可见复杂类型是按引用传递的.

可是如果再做一个实验:

var a = {
a: 1,
b: 2
};
function test(x) {
x = 10;
console.log(x);
}
test(a); // 10
console.log(a); // { a: 1, b: 2 }

外部的a并没有被修改,如果是按引用传递的话,由于共享同一个堆内存,a在外部也会表现为10才对.
此时的复杂类型同时表现出了按值传递按引用传递的特性.


3.按共享传递

复杂类型之所以会产生这种特性,原因就是在传递过程中,对象a先产生了一个副本a,这个副本a并不是深克隆得到的副本a,副本a地址同样指向对象a指向的堆内存.

因此在函数体中修改x=10只是修改了副本a,a对象没有变化. 但是如果修改了x.a=10是修改了两者指向的同一堆内存,此时对象a也会受到影响.

有人讲这种特性叫做传递引用,也有一种说法叫做按共享传递.

最新文章

  1. 引用类型-Array类型
  2. RobotFrameWork(四)变量运算与Evaluate
  3. CSS--复习之旅(一)
  4. Lucene总体架构
  5. Effective Java 41 Use overloading judiciously
  6. LightOJ 1141 Program E
  7. wamp
  8. 基于OWIN WebAPI
  9. BZOJ 3668 起床困难综合症
  10. static关键字的用法和main函数
  11. jvm 参数调优
  12. openstack之nova启动实例过程
  13. Duanxx的STM32学习:STM32F103中等容量的功能和外设
  14. 关于sqlserver还原不了数据库的原因
  15. .NET Core跨平台部署
  16. SpringBoot配置Cors解决跨域请求问题
  17. Linux下C与Mysql的混合编程(转)
  18. hadoop fs 命令使用
  19. SQL提高查询效率【in、not in、between、like】等条件讲述
  20. ftp 命令行操作 经常使用命令

热门文章

  1. 11.7 【Linq】在查询表达式和点标记之间作出选择
  2. 数组(day07)
  3. 【生产环境】Tomcat运行一段时间后访问变慢分析历程
  4. MAC 快捷键&使用技巧等
  5. php实现网站访客数量统计的方法(简单实现,不能防刷新)
  6. MySQL 索引分析
  7. Spring Boot 配置Oracle数据库
  8. ZOJ 3494
  9. /sys/power/state
  10. 好纠结啊,JeeWx商业版本号和开源版本号有什么差别呢?