js的数据类型划分方式为 原始数据类型和 引用数据类型

栈: 原始数据类型(Undefined,Null,Boolean,Number、String)

堆: 引用数据类型(对象、数组、函数)

两种类型的区别:

存储位置不同

原始数据类型直接存储在栈(stack)中简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以存储在栈中;
引用数据类型直接存储在堆中,占据空间大,大小不固定,如果存储在栈中,将会影响程序运行的性能,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后,从堆中获得实体。

传值方式不同

按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

按引用传递会使函数调用的追踪更加困难,有时也会引起一些微妙的BUG。

按值传递由于每次都需要克隆副本,对一些复杂类型,性能较低。两种传值方式都有各自的问题。

举例:

  var person,name;person = 'kn';name=person;person='黑白';console.log(person,name,typeof person)//黑白 kn string

person的改变没有改变name,说明 string 是按值传递的。赋值时创建一块新的内存空间

1、基本数据类型:按值传递

不可变(immutable)性质
基本类型是不可变的(immutable),只有对象是可变的(mutable). 有时我们会尝试“改变”字符串的内容,但在JS中,任何看似对string值的”修改”操作,实际都是创建新的string值。任何方法都无法改变一个基本类型的值,

    var str = "abc";str[0]; // "a"str[0] = "d";console.log(str); //abcvar name = 'jozo';var upName=name.toUpperCase(); console.log(upName,name); // 输出 'JOZO' 'jozo'

方法操作无法改变一个基本类型的值

var person = 'kn';person.age = 24;person.method = function(){};console.log(person.age); // undefinedconsole.log(person.method); // undefined

2.引用类型:按引用传递

引用类型的值是可变的

 var obj = {x : 0};obj.x = 100;var o = obj;o.x = 1;console.log(obj.x)// 1, 被修改o = {x:100};  //等同于重新赋值,重新开辟内存,不是修改console.log(JSON.stringify(obj),JSON.stringify(o))//{"x":1} {"x":100}obj.x; // 1, 不会因o = {"x":100}改变

引用类型的值是同时保存在栈内存和堆内存中的对象

javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用,
所以引用类型的值是按引用访问的。
准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,
也可以说是该对象在堆内存的地址。
假如有以下几个对象:

var person1={name:"xiaoming"}
var person2={name:"xiaohong"}
var person3={name:"xiaoxiao"}

两种数据类型在实参和形参中的区别

首先要明白什么实参什么是形参。
实参:可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。

function addNum(param)  //相对于addNum方法来说 param是形参
{ param+=10; return param;
}
var num=10;
var result=addNum(num); //相对于addNum方法来说 num是实参
console.log(num);  //10
console.log(result);//20

上面的例子中,当将 num作为实参传入方法 addNum是 param作为形参接受 并在方法体内使用,且num在全局中没用改变,但当实参为引用类型时

function fun(param)  //相对于fun方法来说 param是形参{ param[0]=99; return param;
} var num=[10];  var result=fun(num); //相对于fun方法来说 num是实参console.log(num[0]);  //99 console.log(result);//[99]

在方法体内改变形参,将同时改变实参

引用:
js原始数据类型和引用数据类型=>callback数据传输原理

转载于:https://www.cnblogs.com/sunny-shine/p/11350701.html

js 原始数据类型、引用数据类型相关推荐

  1. js数据类型(基本数据类型 | 引用数据类型)

    一.数据类型 JS分两种数据类型: 基本数据类型:**Number.String.Boolean.Null. Undefined.Symbol(ES6),**这些类型可以直接操作保存在变量中的实际值. ...

  2. 基本数据类型引用数据类型

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.数据类型 JS分两种数据类型: js的六或七大数据类型 ...

  3. 数据类型和存储上的差别,基本数据类型,引用数据类型

    在 js 中把我们的数据进行了分类,可以理解为 2 大类 基本数据类型: string,number,null,Boolean,undefined,symbol 引用数据类型: Object,Arra ...

  4. (JAVA面试)基本数据类型 引用数据类型详解

    基本数据类型 byte 1字节 short char 2字节 int float 4字节 double long 8字节 引用数据类型 引用类型指向一个对象,不是原始值,指向对象的变量是引用变量 在j ...

  5. 理解Java自定义类作为数据类型——引用数据类型

    目录 说在前面的话 复现问题 引用数据类型的理解 总结 说在前面的话 前言:Java的数据类型按照类型可分为基本数据类型(byte.short.int.long.double.float.char.b ...

  6. 【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )

    文章目录 引用类型 引用类型 引用数据类型 : 1. 引用数据类型定义 : 类型名称& 变量名 = 对应类型变量名称 ; //① 定义 普通 类型 变量int a = 8;//② 定义 引用类 ...

  7. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  8. js基本数据类型和引用数据类型有什么区别?

    js基本数据类型和引用数据类型有什么区别? 1.基本数据类型和引用数据类型包括哪些? 基本数据类型: 在javascript中,有6种基本数据类型:string.number.boolean.null ...

  9. JS基本数据类型与引用数据类型

    对前端感兴趣的可以关注一下我的博客,会持续更新前端相关的知识和学习笔记,一起学习. JavaScript中的数据类型分为基本数据类型和引用数据类型,那么哪些是基本类型,哪些是引用类型,以及它们的区别是 ...

  10. 浅谈js基本数据类型与引用数据类型的引用

    ES变量有两种不同的数据类型:基本数据类型和引用数据类型. 基本数据类型 基本数据类型有:undefined,boolean,number,string,null. 基本数据类型的访问是按值访问的,换 ...

最新文章

  1. 用 Ganglia 监控基于 Biginsights 的 HBase 集群性能
  2. 在JVM上对高并发HTTP服务器进行基准测试
  3. springboot前端传参date类型后台处理方式
  4. 袁隆平杂交水稻创新团队发布“农业芯片”,世界顶级科学家点赞拼多多新农人...
  5. 利用python语言实现分类算法_使用python实现kNN分类算法
  6. 什么叫基于web的网站_选择离开家乡在外打工,学门什么专业的技术更有前途呢?-WEB资讯专栏-DMOZ中文网站分类目录...
  7. 基于单片机的电子琴设计和硬件平台设计
  8. 做好4项防护,保障服务器安全
  9. IIC数据总线 线与 还是 线或 ?是线与
  10. 04-Redis 数据持久化实践
  11. Qt报错 error: C1083
  12. hdoj4826Labyrinth【dp】
  13. 软件开发过程中常见漏洞的解析
  14. 第十四届蓝桥杯第一期模拟赛 python
  15. 《C++ Concurrency in Action》笔记
  16. Cadence Allegro颜色显示设置图文教程及视频演示
  17. iQOO5和iQOO5pro有什么区别
  18. 最新文本转语音的接口(免费),百度语音作废
  19. 关键词竞争度如何分析?
  20. wincc7.3与MYSQL_Wincc7.3学习之——如何建立起数据库链接

热门文章

  1. JAVA使用反射的方法,参数是数组怎么办?
  2. 一台机器安装两个LINUX系统的操作与经验
  3. 编程基本功:即使是脚本,也尽量减少硬代码,都使用变量
  4. LINUX下载编译wabt(反编译wasm)
  5. msys2编译ffmpeg:ERROR: libx264 not found
  6. 量子纠缠,如何理解不确定性
  7. 管理感悟:图省事就是把别人当白痴
  8. 苹果手机截图的两种方法
  9. 管理感悟:如何改造代码
  10. Trie字典树数组实现