数据类型之间的区别

135 阅读4分钟

数据类型之间的区别

数据类型分为两种

  1. 基本数据类型(简单数据类型)
  2. 引用数据类型(复杂数据类型)

1. 存储

变量的数据存储的地方是 内存中, 内存分为两个 栈内存, 堆内存

基本数据类型存储在 栈内存中, 比如: string number undefined null boolean

复杂数据类型, 将数据本体存放在堆内存中, 比如对象或者数组或者函数 然后将指向该内存的地址, 存放在数组名或者对象名或者函数名中 数组/对象/函数 名 存放在 栈内存中

面试官: 数据类型之间有什么区别?

基本数据类型有哪些, 然后他们存储的地方是 栈内存中 引用数据类型有哪些, 然后他们数据本体存放的地方是 堆内存中, 然后变量名存储的位置是 栈内存中

基本数据类型内部存储的是值; 引用数据类型内部存储的是地址

2. 赋值

基本数据类型: 赋值以后, 两个变量之间没有任何关系, 相当于将我自己的某一个东西, 复制一份给你, 然后你的就是你的, 我的就是我的

复杂数据类型: 因为变量内部存储的是指向堆内存的地址, 所以在赋值的时候, 其实是将 这个地址给到了另外一个变量 那么相当于这两个变量存储的是 同一个 钥匙, 所以操作其中一个变量的时候, 会影响另外一个变量

var num1 = 100
var num2 = num1     // num2 === 100
num2 = 666
console.log(num1)   // 100
console.log(num2)   // 666

var obj1 = {
name: 'QF001',
age: 18
}

        // // 这一步相当于将 变量 obj1 内部存储的 "钥匙", 给到了 变量 obj2, 那么此时 obj2 和 obj1 相当于操作的是一个内存空间
        // var obj2 = obj1
        // // console.log(obj2)   // {name: 'QF001', age: 18}

        // obj2.name = 'QF666'
        // console.log(obj2)   // {name: 'QF666', age: 18}
        // console.log(obj1)   // {name: 'QF666', age: 18}

        /**
         *  首先创建了一个 对象 obj1    数据本体为: {name: 'QF001', age: 18}        然后变量名存储的是指向堆内存的地址, 我们假设为 XF001
         * 
         *  然后创建了一个对象 obj2 内部存储的是 和 obj1一样的地址
         *  
         *      此时相当于 obj2 和 obj1 共同保管一个内存空间
         * 
         *      换句话说: 操作obj2会影响 obj1       操作obj1也会影响obj2
        */


        // var obj1 = {
        //     name: 'QF001',
        //     age: 18
        // }
        // var obj2 = {
        //     name: 'QF001',
        //     age: 18
        // }

        // obj2.name = 'QF666'

        // console.log(obj1.name)   // QF001

        /**
         *  1. 创建一个对象 obj1    内部存储的地址假设为 XF001
         *  2. 创建一个对象 obj2    内部存储的地址假设为 XF002
         * 
         *  注意此时两个对象除了长得一模一样之外  毫无关系
         * 
         *  也就是说  操作 其中一个对象, 并不会影响另外一
复制代码

3. 比较

基本数据类型: 就是 值 的比较

引用数据类型: 比较的时候 比较的是 存储地址

// console.log(obj1 === obj2)  // false
        /**
         *  引用数据类型在对比的时候, 对比的是 地址     而这两个对象的地址完全不同, 所以返回的结果就是 false
        */

        // var num1 = 100
        // var num2 = '100'
        // console.log(num1 === num2)  //  false

        // var arr1 = [1, 2, 3]
        // var arr2 = arr1

        // console.log(arr1 === arr2)  // true
        /**
         *  引用数据类型在对比的时候, 对比的是 地址     因为 他们两个的地址完全相同, 所以返回的结果是 true
        */
复制代码

4. 传参

基本数据类型: 将值拷贝一份传递给形参, 在函数内修改不会影响外界

引用数据类型: 将存储地址赋值给形参, 在函数内修改会影响外界

function fn(num) {
            num = 'QF001'
        }

        var str = 'abc'
        fn(str)

        // console.log(str)    // 'abc'

        function fn1(o) {
            o.name = 'qwer'
        }

        var obj = {
            name: 'ABC'
        }
        fn1(obj)

        console.log(obj.name)   // 'qwer'
复制代码

冒泡排序:

属于数组排序的算法之一

其实就是通过一种算法, 将 一个乱序的数组, 调整为指定顺序的数组(从大到小/从小到大)

什么是算法?

解决某一个问题最简单的方式 / 最高效的方式

冒泡排序的核心: 对比数组前一项和后一项, 如果前一项的值较大, 那么就往后挪 (这个排序之后是按照从小到大的顺序)

基础版

<script>
    //准备一个乱序数组
         var arr = [9, 3, 6, 2, 4, 1, 8, 5, 7]
        console.log('原始数组: ', arr)

        
        for (var k = 0; k < arr.length; k++) {  // 决定执行几次 所谓的 冒泡排序

            for (var i = 0; i < arr.length; i++) {  // 拿到数组的前一项与后一项, 做一轮排序

                if (arr[i] > arr[i + 1]) {
                    var temp = arr[i]
                    arr[i] = arr[i + 1]
                    arr[i + 1] = temp

                }

             }

         }

        console.log('冒泡排序后的数组: ', arr)

</script>

复制代码

优化版

<script>

    var arr = [9, 3, 6, 2, 4, 1, 8, 5, 7]
        console.log('原始数组: ', arr)
        //(arr.length - 1) 外层循环次数 - 1       
    for (var k = 0; k < arr.length - 1; k++) {
            //(arr.length - 1) 判断次数少了一次       arr[8] > arr[9]
            // (- k)每一轮判断的执行次数, 减少 k 次
            for (var i = 0; i < arr.length - 1 - k; i++) {
                if (arr[i] > arr[i + 1]) {
                    var temp = arr[i]
                    arr[i] = arr[i + 1]
                    arr[i + 1] = temp
                }
            }
        }
</script>