【js重学系列】数据类型

js数据类型

数据分为基本数据类型和复杂(引用)数据类型

  1. 基本数据类型的特点:直接存储在栈(stack)中的数据
  2. 引用数据类型的特点:栈中存储的是该对象在栈中引用,真实的数据存放在堆内存里。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

JS基本数据类型有哪些?复杂数据类型有哪些?

  1. 在 JS 中,存在着 6 种基本数据类型,分别是:
    - boolean
    - null
    - undefined
    - number
    - string
    - symbol

  2. 引用数据类型: 对象Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function)

传值赋值和传值赋值

  1. 传值赋值:局部变量所在的栈内存会为该变量开辟一块新的内存空间,通过传来的值为内存进行初始化
  2. 传址赋值:通常局部变量为引用变量,(数组引用变量/类引用变量),不会在方法栈内开辟对象的内存,只会在方法栈内开辟引用变量的内存空间,直接操作的是引用变量的地址值所指向的对象
  3. 传值赋值不可以改变原变量的内容和地址
  4. 传址赋值不可以改变原变量的地址,但可以改变原变量的内容
  5. 根本原因:内存
  6. 值传递会在方法中开辟局部变量的内存,利用值传递为新开辟的局部变量初始化,局部变量有自己的地址原变量只是将值传过去了
  7. 引用传递不会在方法中开辟对象的内存,只是会给局部的引用变量开辟内存空间,将地址值传递给局部引用变量,但是实际的指向是堆内存

出下面运行的结果,解释原因。

  1. function test(person) {
      person.age = 26
      person = {
        name: 'hzj',
        age: 18
      }
      return person
    }
    const p1 = {
      name: 'fyq',
      age: 19
    }
    const p2 = test(p1)
    console.log(p1) // -> ?
    console.log(p2) // -> ?
    
  2. p1:{name: “fyq”, age: 26}
    p2:{name: “hzj”, age: 18}
    
  3. 原因: 在函数传参的时候传递的是对象在堆中的内存地址值,test函数中的实参person是p1对象的内存地址,通过调用person.age = 26确实改变了p1的值,但随后person变成了另一块内存空间的地址,并且在最后将这另外一份内存空间的地址返回,赋给了p2。
    

null是对象吗?为什么?

结论: null不是对象。

  解释: 虽然 typeof null 会输出 object,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象然而 null 表示为全零,所以将它错误的判断为 object 。 
  ```

toString

valueOf

  1. https://www.cnblogs.com/xiaohuochai/p/5560276.html
  2. https://blog.csdn.net/celi_echo/article/details/100038366

typeof

  1. 1. 对于原始类型来说,除了 null 都可以调用typeof显示正确的类型
    
    typeof 1 // 'number'
    typeof '1' // 'string'
    typeof undefined // 'undefined'
    typeof true // 'boolean'
    typeof Symbol() // 'symbol'
    typeof null // 'object'
    
    2. 但对于引用数据类型,除了函数之外,都会显示"object"。
    
    typeof [] // 'object'
    typeof {} // 'object'
    typeof console.log // 'function'
    
    3. 因此采用typeof判断对象数据类型是不合适的,采用instanceof会更好,instanceof的原理是基于原型链的查询,只要处于原型链中,判断永远为true
    4. 如果是null 则返回object
    5. https://blog.csdn.net/qq_38722097/article/details/80717240
    
  2. 1. typeof 一般被用于判断一个变量的类型
    2. 我们可以利用 typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型
    3. 在判断不是 object 类型的数据的时候,typeof能比较清楚的告诉我们具体是哪一类的类型
    4. typeof 在判断一个 object的数据的时候只能告诉我们这个数据是 object, 而不能细致的具体到是哪一种 object
    typeof是一个运算符,有2种使用方式:typeof(表达式)和typeof 变量名,第一种是对表达式做运算,第二种是对变量做运算。
    

instanceof

  1. 核心: 原型链的向上查找。(右侧构造函数指向的原型对象是否存在于左侧实例对象的原型链上)

  2. function myInstanceof(left, right) {
        //基本数据类型直接返回false
        if(typeof left !== 'object' || left === null) return false;
        //getProtypeOf是Object对象自带的一个方法,能够拿到参数的原型对象
        let proto = Object.getPrototypeOf(left);
        while(true) {
            //查找到尽头,还没找到
            if(proto == null) return false;
            //找到相同的原型对象
            if(proto == right.prototype) return true;
            proto = Object.getPrototypeof(proto);
        }
    }
    

Object.is和===的区别?

  1. Object在严格等于的基础上修复了一些特殊情况下的失误,具体来说就是+0和-0,NaN和NaN。
    Object.is() 方法判断两个值是否是相同的值。表示两个参数是否相同的布尔值 。
    
    

== 和 ===有什么区别?

  1. 1. ===叫做严格相等,是指:左右两边不仅值要相等,类型也要相等,例如'1'===1的结果是false,因为一边是string,另一边是number。
    2. ==不像===那样严格,对于一般情况,只要值相等,就返回true,但==还涉及一些类型转换,它的转换规则如下:
       1. 两边的类型是否相同,相同的话就比较值的大小,例如1==2,返回false
       2. 判断的是否是null和undefined,是的话就返回true
       3. 判断的类型是否是String和Number,是的话,把String类型转换成Number,再进行比较
       4. 判断其中一方是否是Boolean,是的话就把Boolean转换成Number,再进行比较
       5. 如果其中一方为Object,且另一方为String、Number或者Symbol,会将Object转换成字符串,再进行比较
    

Object.prototype.toString()

1. ```js
   var obj=new Object({a:3})
   // console.dir(obj);
   // console.dir(['obj'].toString());
   // console.dir(obj.toString===Object.prototype.toString);
   console.dir(obj.toString===Object.prototype.toString);
   console.log(obj.toString());
   // console.log(Object.prototype.toString.call(1));
   ```

2. 

3. 

JS中类型转换有哪几种?

     1. 转换成数字
     2. 转换成布尔值
     3. 转换成字符串

http://47.98.159.95/my_blog/015/type.jpg

https://www.jianshu.com/p/7cb41d109b7e

https://www.cnblogs.com/xiaohuochai/p/5557387.html

https://blog.csdn.net/aliven1/article/details/111644780

https://www.jianshu.com/p/f903b42812e4

强制类型转换

      1. String(),Number(),Boolean()

隐式转换

  1. 每个对象的toString和valueOf方法都可以被改写,每个对象执行完毕,如果被用以操作JavaScript解析器就会自动调用对象的toString或者valueOf方法

[] == ![]结果是什么?为什么?

  1. ```
     ①、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
     
     ②、如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
     
     ③、如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较
     ```

  2. https://blog.csdn.net/magic_xiang/article/details/83686224

{}==!{}

  1. ```
       {} == !{} ->
       {} == false ->
       {} == Number(false) ->
       {} == 0 ->
       ({}).toString() == 0 -> 
       [Object Object] == 0 -> 
       false
       ```
posted @ 2021-05-28 21:49  有风吹过的地方丨  阅读(70)  评论(0编辑  收藏  举报