引用类型

前端基础笔记(一)

家住魔仙堡 提交于 2019-11-30 18:18:48
Let :用来声明变量,但是所声明的变量,只在let命令所在的代码块内生效。 变量提升 :变量可以在声明之前使用,值为undefined。 暂时性死区 :在代码块内,使用let命令声明变量之前,该变量都是不可用的。 不允许重复声明 :let不允许在相同作用域内,重复声明同一变量。 Const :const声明一个只读的常量。一旦声明,常量的值就不能改变,一旦声明变量,就必须立刻初始化,不能留到以后赋值。 Const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。 基本数据类型 :number、string、boolean、undefined、null、symbol、BigInt,七类。 引用数据类型 :Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,正则表达式是对象。) 栈(stack) :自动分配的内存空间,它由系统自动释放。 堆(heap) :动态分配的内存

怎样理解函数参数的传递

北战南征 提交于 2019-11-30 18:17:42
前言: 基本类型(数值 / 字符串 / 布尔值)和引用类型(对象)作为参数传递给函数时的行为是不一样的. 基本类型传递的是值的地址, 它在函数内部的改变不会影响到原变量. 引用类型传递的是引用的地址, 它在函数内部的改变实际上是对原变量的改变. 第一步: 下面演示基本类型的值做实参时的情况 function change(bol){ bol = !bol; console.log(bol) } var a = true; change(a); // false console.log(a); // true; 注意: 这里在函数内部改变了形参的值, 但外部的a的值并没有发生改变. 这是基本类型的特征; 第二步: 下面演示引用类型的值做实参时的情况 function addName(obj) { obj.name = "Lilei"; console.log(obj.name); // Lilei } var person = {}; addName(person); // Lilei console.log(person.name); // Lilei 注意: 这里对象作为实参传递给函数时, 实际传递的是引用, 在函数内部操作的obj指向的内存地址实际上就是person指向的内存地址, 因此其改变会影响obj和person; 来源: https://www.cnblogs.com

Java的深拷贝和浅拷贝

旧时模样 提交于 2019-11-30 14:24:26
原文出处: https://www.cnblogs.com/ysocean/p/8482979.html 目录 1、创建对象的5种方式 3、Clone 方法 4、基本类型和引用类型 5、浅拷贝 6、深拷贝 7、如何实现深拷贝?   ①、让每个引用类型属性内部都重写clone() 方法   ②、利用序列化 关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。 1、创建对象的5种方式    ①、通过 new 关键字   这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object();    ②、通过 Class 类的 newInstance() 方法   这种默认是调用类的无参构造方法创建对象。比如 Person p2 = (Person) Class.forName("com.ys.test.Person").newInstance();    ③、通过 Constructor 类的 newInstance 方法   这和第二种方法类时,都是通过反射来实现。通过 java.lang.relect.Constructor 类的

值类型和引用类型

浪子不回头ぞ 提交于 2019-11-30 12:59:05
1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null、symbol (2)引用类型:对象(Object)、数组(Array)、函数(Function) 2.值类型和引用类型的区别 (1)值类型: 1、占用空间固定,保存在栈中(当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;栈中存储的是基础变量以及一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。) 2、保存与复制的是值本身 3、使用typeof检测数据的类型 4、基本类型数据是值类型 (2)引用类型: 1、占用空间不固定,保存在堆中(当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时

类型

浪尽此生 提交于 2019-11-30 12:51:46
基本类型:Undefined、Null、Boolean、String、Number、Symbol 引用类型:Object # 1. 基本类型和引用类型的区别 上面这张图片很好的解释了值传递和引用传递的区别。 # 1.1 不可变性 基本类型,在 ECMAScript 标准中,它们被定义为 primitive values ,即原始值,代表值本身是不可被改变的。 基本类型的值被直接存储在栈中,在变量定义时,栈就为其分配好了内存空间。由于栈中的内存空间的大小是固定的,那么注定了存储在栈中的变量就是不可变的。 以字符串为例,我们在调用操作字符串的方法时,没有任何方法是可以直接改变字符串的。对其修改也只是修改变量指向的值,而值的本身是不课改变的。 let str = 'str' str += '1' console.log(str); // str1 在上面的代码 str 是变量名, 'str' 则是一个 String 类型的值,通过 += 这个操作符会将一个新的 String 类型的值 'str1' 赋值给 str 这个变量。值本身是没有改变的。 引用类型的值实际存储在堆内存中,它在栈中只存储了一个固定长度的地址,这个地址指向堆内存中的值。因此引用类型的值是可以修改的。 # 1.2 复制 基本类型在复制的时候,会在栈中开辟一个新的内存空间来存储复制出来的值

Java中有关Null的9件事

て烟熏妆下的殇ゞ 提交于 2019-11-30 12:35:45
对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java。 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针、操作符重载、多继承实现的原因,null却与此正好相反。好吧,我真的不知道这个问题的答案,我知道的是不管null被Java开发者和开源社区如何批评,我们必须与null共同存在。与其为null的存在感到后悔,我们倒不如更好的学习null,确保正确使用null。 为什么在Java中需要学习null?因为如果你对null不注意,Java将使你遭受空指针异常的痛苦,并且你也会得到一个沉痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户将会更加欣赏你。以我的经验来看,导致空指针异常的一个最主要的原因是对Java中null的知识还不够。你们当中的很多已经对null很熟悉了,但是对那些不是很熟悉的来说,可以学到一些关于null老的和新的知识。让我们一起重新学习Java中null的一些重要知识吧。 Java中的Null是什么? 正如我说过的那样,null是Java中一个很重要的概念

关于Java中clone

霸气de小男生 提交于 2019-11-30 12:17:53
原文链接: https://blog.csdn.net/zhaoheng314/article/details/81985880 Java实现克隆需要遵循以下规则: 必须实现Cloneable接口 实现Cloneable的类应该重写clone(),重写时该方法的修饰符为public。 public class CloneTest { public static void main(String[] args) { Student stu = new Student(); stu.setName("张三"); stu.setAge(10); Classes classes = new Classes(); classes.setClassId(101); classes.setClassName("一班"); stu.setClasses(classes); try { System.out.println("浅克隆测试------"); //克隆 Student stu2 = (Student) stu.clone(); System.out.println("两个对象是否相同:" + (stu == stu2)); System.out.println("两个对象的name属性是否相同:" + (stu.getName() == stu2.getName())); System

引用类型在内存中的情况

对着背影说爱祢 提交于 2019-11-30 09:19:54
这里有一个类已经声明好,class Car{   String name; } 这里类只有一个name属性,下面来实例化对象,对其属性赋值, Car car1=new Car(); car1.name="现代"; 在内存中整个过程是怎么样的呢?首先我们的内存条分成三个区域,分别是 栈内存,堆内存,存储区。 类加载过程中,JVM首先在内存中开辟一块空间,JVM的一个小弟叫类加载器ClassLoader把放在硬盘上的的class文件加载到 存储区,当然,这里其实并非真的把硬盘上的class文件拷贝到内存,毕竟实际文件很大,计算机内存有限,完全放进去那多少内存也不够。 因此,这里只是在存储区的方法区(存储区有细分为三块,常量缓冲区,方法区(就是指类,方法是依托在类里面的嘛),静态元素区(static))建立了一个映射关系, 在方法区就有了一个跟硬盘一模一样的模板类Car。 Car car1=new Car(); Car car1这半句,在栈内存中声明了一个引用类型car1,如果要new Car(),则是通过在方法区的Car模板在堆内存中建立了一个内存空间,即new Car, 通过‘=’赋值给car1,这里的赋值是将在堆内存中new Car的内存地址给了car1. car1.name="现代";这句话的含义是通过栈内存的car1地址找到堆内存的name,并给它赋值(注意

【swift】struct与class 的区别

喜欢而已 提交于 2019-11-30 07:34:44
数据类型:struct是值类型,class是引用类型。 值类型变量直接包含数据,赋值时也是值拷贝,或者叫深拷贝,所以多个变量的操作不会相互影响。 引用类型变量存储的是对数据的引用地址,后者称为对象,赋值时,是将对象的引用地址复制过去,也叫浅拷贝,因此若多个变量指向同一个对象时,操作会相互影响。 值类型数据没有引用计数,也就不会因为循环引用导致内存泄漏,而引用类型存在引用计数,需要小心循环引用导致的内存泄漏 拷贝时,struct是深拷贝,拷贝的是内容,class则需要选用正确的深浅拷贝类型。 因为值类型数据是深拷贝,所以是线程安全的,而引用类型数据则不是 property的初始化:初始化属性时,class 需要创建一个带形参的constructor;struct可以把属性放在默认的constructor 的参数里。 immutable变量:swift用var和let区分可变数据和不可变数据,struct遵循这个特性;对class则不适用。 mutating function:struct 的 function 改变 property 时,需加上 mutating,而 class 不用。 速度:struct分配在栈中,class分配在堆中,也就意味着struct更迅速。 NSUserDefaults:struct 不能被序列化成 NSData 对象,class可以。 继承: