JS变量小总
变量分类:
1、栈内存(stack)和堆内存(heap)
2、基本类型和引用类型
#栈内存(stack)
一般为静态分配内存,其分配的内存系统自动释放。
#堆内存(heap)
一般为动态分配内存,其分配的内存,系统不释放,哪怕程序退出,那一块还是在那里。
#为何会有栈内存和堆内存之分
1、 和垃圾回收机制有关。为了使程序运行时占用的内存最小;
2、 当一个方法执行时,每个方法都会建立自己的栈内存,在这个方法内定义的变量将会逐个放入这块栈内存中,随着方法的执行结束而销毁;
3、 当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用,这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的传递参数时很常见),则这个对象依然不会被销毁,只有当一个对象内有任何引用变量引用时,系统的垃圾回收机制才会在核实的时候回收它;
*基本类型五类:
Number、String、Null、Undefined、Boolean,这些类型在内存中分别占有固定大小的空间,它们的值保存在栈空间,我们是通过值来访问的; *引用类型:
Array、Date、Math、RefExp、Function等Object对象(指保存在堆内存中的对象);引用类型,值大小不固定,栈内存中存放地址指向堆对象。
#简单说明:
栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值不固定,因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。 基本类型和引用类型的区别(操作数据的值)
实际区别是传值与传址; %传值:
在赋值过程中,首先对值进行了一份拷贝,而后将这份拷贝存储到一个变量、对象属性或数组元素中。
拷贝的值和原始的值是完全独立、互不影响的。
当一份数据通过值传递给一个函数,实际上被传递的不是数据本身,而是数据的一份拷贝。
因此,如果函数修改了这个值,影响到的只是数据的那份拷贝,而并不影响数据本身。
%传址:
在赋值过程中,变量实际上存储的是数据的地址,而不是原始数据或者是数据的拷贝。
如果值通过一个地址发生了改变,这个改变也会通过原始地址表现出来。
&浅拷贝:
浅拷贝指只是复制一层对象,当对象的属性是引用类型的时,实质复制的是其引用地址,两个对象指向同一个内存地址时修改其中任意值,另一个值也会随之改变;(在定义一个对象或数组时,变量存放的往往只是一个地址。当我们使用对象拷贝时,如果属性是对象或数组时,这时我们传递的也只是一个地址。因此子对象在访问该属性时,会根据地址回溯到父对象的堆内存中,此时父子对象发生了关联,两者的属性值会指向同一存储空间;)
&深拷贝:
深拷贝是指复制对象的所有层级,将对象及其值都复制过来,两个对象修改其中任意的值另一个值不会改变。 &深拷贝的实现方法:
1、 通过递归方法实现;
2、 通过JSON解析实现;对象转成JSON字符串再转成JSON对象:JSON.parse( JSON.stringify(o) );
JS变量小总的更多相关文章
- js变量及其作用域(附例子及讲解)
Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量 工具/原料 Ch ...
- js变量及其作用域
Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量 一.js变量的类型及 ...
- JS 数据类型转换-转换函数、强制类型转换、利用js变量弱类型转换
1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型 ...
- JS变量重复声明以及忽略var 声明的问题及其背后的原理
腾讯的一个笔试题,先看一下 var a = 100; function fn() { alert(a); //undefined var a = 200; alert(a); //200 } fn() ...
- 【repost】 JS变量重复声明以及忽略var 声明的问题及其背后的原理
JS的容错率很高,一些其他语言常见的小错误JS都能大度得包容,比如给一个方法传入超出预计的参数.在声明变量之前使用该变量(变量的声明提升解决了这个问题)等等,这里我们就要解剖一下JS变量重复声明以及当 ...
- JS变量对象详解
JS变量对象详解 开年之后工作热情一直不是很高,这几天一直处于消极怠工状态.早上不想起床,起床了不想上班.明明放假之前工作热情还一直很高,一直心心念念的想把小程序项目怼出来,结果休假回来之后画风完全不 ...
- js闭包小实验
js闭包小实验 一.总结 一句话总结: 闭包中引用闭包外的变量会使他们常驻内存 function foo() { var i=0; return function () { console.log(i ...
- JS处理事件小技巧
今天,就分享一下我自己总结的一些JS的小技巧: ①防止鼠标选中事件 <div class="mask" onselectstart="return false&qu ...
- javascirpt对象运用与JS变量
abcdefghijklmnopqrstuvwyz String 对象方法 charAt() 方法可返回指定位置的字符.stringObject.charAt(index)(index从0开始)[ht ...
随机推荐
- 一文带你学会国产加密算法SM4的vue实现方案
前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案.没有看过的小伙伴可以看一下这篇文章. https://www.cnblogs.com/jichi/p/12907453.html 本篇 ...
- css3及css技巧
左右对齐:
- String,StringBuffer,StringBuilder三者的区别
相同点: String,StringBuffer,StringBuilder,都是final类,不允许被继承,在本质上都是字符数组, 不同点: 1.String的长度是不可变的而后两者长度可变,在进行 ...
- H3C S5500V2交换机误格式化恢复
一.格式化后,bin文件及视图全部被删除需要联系H3C客服报交换机后面的序列号,然后根据工单中给你的账号密码去H3C官网下载对应的软件包. 二.下载3CDaemon使用TFTP方式将解压出来的.ipe ...
- 获取访问用户的客户端IP(适用于公网与局域网).
/** * 获取访问用户的客户端IP(适用于公网与局域网). */ public final String getIpAddr(final HttpServletRequest requ ...
- Oracle操作时间-----摘抄而来
1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval ’7’ MINUTE from dual 当前时间减去7小时的时间 sele ...
- AVL树的创建--C语言实现
AVL树是一种自平衡(Self-balancing)二叉查找树(Binary Search Tree),要求任何一个节点的左子树和右子树的高度之差不能超过1. AVL树的插入操作首先会按照普通二叉查找 ...
- BZOJ1017 树形DP
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2308 Solved: 919[Submit][S ...
- Havel定理 poj1659
http://blog.csdn.net/xcszbdnl/article/details/14174669 代码风格这里的 Frogs' Neighborhood Time Limit: 5000M ...
- 程序员都在用的 IDEA 插件(不断更新)
IDEA一些不错的插件分享 目录 IDEA一些不错的插件分享 插件集合 CamelCase Translation LiveEdit MarkDown Navigator Jrebel CheckSt ...