标签:链表 基本数据类型 的区别 color 回收 引用类型 应该 引用 mat
基本类型的值是不可变的,引用类型的值是可变的;
存放:基本类型的变量是存放在栈区的,引用类型的值是同时保存在栈内存和堆内存中的对象;
比较:基本类型的比较是值的比较,引用类型的比较是引用的比较;
var a = ‘我是小仙女~‘ var b = a; b=‘我是纯爷们~‘ console.log(a)//我是小仙女~ console.log(b)//我是纯爷们~ //_______________我是分割线_______________________ var b={name:‘我是小仙女~‘} var d= c; b.name="我是纯爷们~" console.log(c)//我是纯爷们~ console.log(d)//我是纯爷们~ //_______________我是分割线_______________________(操作引用的对象) var obj1 = [2,3,4]; var obj2 = obj1; obj2[0] = 10; console.log(obj2); // [10,3,4] console.log(obj1); // [10,3,4] //_______________我是分割线_______________________(并未操作引用的对象) var obj3 = [2,3,4]; var obj4 = obj3; obj4 = [10,3,4]; console.log(obj4); // [10,3,4] console.log(obj3); // [2,3,4]
1、undefined 类型表示不存在定义,声明变量但没有初始化,这个变量的值就是undefined; 注意:在任何一个引用变量值设置为undefined都是错误的
2、null 类型,表示一个值被定义了,定义为空值; 使用场景为 定义变量准备在将来用于保存对象;所以引用值可以是null而不会是undefined;undefined和null的区别:js诞生的时候只设置了null作为“无”的值。最初的设计是null是表示一个“无”的对象,转为数值时为0; | undefined表示“无”的原始值,转为数值时为NaN;红宝书上说引入undefined就是为了正式的区分空对象指针与未经初始化的变量,变量设置为null就是空对象指针,没有设置就是未经初始化!
3、Boolean类型,字面值为true和false
4、number类型,字面量格式可以是十进制、八进制(八进制第一位必须是0)、十六进制(前两位必须是0x)
Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。
NaN:非数字类型。两大特点:1.涉及到的 任何关于NaN的操作,都会返回NaN。2. NaN不等于自身。
isNaN() 函数用于检查其参数是否是非数字值
5、String类型 由零个或多个16位Unicode字符组成的字符序列
6、symbol类型,ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6 引入Symbol的原因
6.扩展思考
1.Null和Undefined的区别?
null和undefined基本同义,只有一些细微的差别。
null表示“没有对象”,即该处不应该有值。
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
undefined表示缺少值,此处应该有值,但是还没有定义。
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
2.NaN是什么?
NaN表示一个元素可不是数值,isNaN()用于判断元素是否为数字的函数,是的话返回false,不是数字返回true。NaN和任何值比较都不相等。
3.什么是栈内存,什么是堆内存,两者有什么区别?
栈内存:由程序自动向操作系统申请分配以及回收,速度快,使用方便,但程序员无法控制。若分配失败,则提示栈溢出错误。注意,const局部变量也储存在栈区内,栈区向地址减小的方向增长。
堆内存:程序员向操作系统申请一块内存,当系统收到程序的申请时,会遍历一个记录空闲内存地址的链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。分配的速度较慢,地址不连续,容易碎片化。此外,由程序员申请,同时也必须由程序员负责销毁,否则则导致内存泄露。
关于堆和栈区别的比喻:
堆和栈的区别可以引用一位前辈的比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
4.值传递是什么?
当我们使用=将这些变量赋值到另外的变量,实际上是将对应的值拷贝了一份,然后赋值给新的变量。我们把它称作值传递
5、对象是通过什么传递的?
对象是通过引用传递,而不是值传递。也就是说,变量赋值只会将地址传递过去。
6、==和===在比较时有什么区别?
==相等运算符,两边值类型不同的时候,要先进行类型转换,再比较。===严格运算符,不做类型转换,类型不同的一定不等;
对于引用类型的变量,==和===只会判断引用的地址是否相同,而不会判断对象具体里属性以及值是否相同。因此,如果两个变量指向相同的对象,则返回true。(如果两个值都是null,或者都是undefined,那么[相等]。)
===严格运算符:
1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同一个值,那么[相等];(!例外)的是,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
==相等运算符:
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
3、如果一个是null、一个是undefined,那么[相等]。
4、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
5、如果任一值是 true ,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
6、如果一个是对象,另一 个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。js核心内置类,会尝试 valueOf先于toString;例外的是Date,Date利用的是toString转换。非js核心的对象,令说(比较麻烦,我也不大懂)
7、任何其他组合,都[不相等]。
标签:链表 基本数据类型 的区别 color 回收 引用类型 应该 引用 mat
原文地址:https://www.cnblogs.com/xiaotingbaobao/p/13264117.html