JS中的基本类型和引用类型

1.基本类型:undefined、null、string、number、boolean、symbo(ES6)

    1.1 普通基本类型:undefined、null、symbol(ES6)

    1.2 特殊基本包装类型:string、number、boolean

2.引用类型:Object、Function,Array、RegExp、Date、及单体内置对象(Global、Math)。(除了基本类型其余的都是object,就都是引用类型啦~)

 

3.比较

基本类型的值是不可变的,引用类型的值是可变的;

存放:基本类型的变量是存放在栈区的,引用类型的值是同时保存在栈内存和堆内存中的对象;

比较:基本类型的比较是值的比较,引用类型的比较是引用的比较;

 

4.举栗~

        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]             

5.基本类型详解:

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.其他相关知识点:

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、任何其他组合,都[不相等]。

 

7.基础数据类型与引用数据类型在使用检测类型符号上返回结果的区别?

typeof操作符与instanceof操作符在使用时的区别:使用instanceof操作符来检测引用类型值。使用typeof操作符来检测基本数据类型。

 

JS中的基本类型和引用类型

上一篇:[ AGC004 E ] Salvage Robots


下一篇:利用 PhantomJS 获取抖音直播的直播源