• 浅谈js数据类型


    数据类型分类

    基本数据类型和对象数据类型

    1. 基本数据类型
      undefined,null,string,boolean,number,symbol
    2. 对象数据类型
      array,function,date,regexp,error

    可拥有对象方法和不可拥有对象方法

    1. 可拥有
      string,boolean,number,symbol,object
    2. 不可拥有
      null,undefined

    可变和不可变

    1. 可变
      对象属性和数组值
    2. 不可变
      null,undefined,布尔,数字,字符串。字符串看起来是可以修改的但实际调用字符串方法对字符串进行修改时并不会修改原始字符串而是返回一个修改后新的字符串。

    有趣的数字

    溢出

    与其他语言一样,js的数字类型也有自己的取值返回,超出这个范围称为溢出。用infinity表示正无穷大,-infinity表示负无穷大

    0 / 0   //NaN
    3 / 0   //infinity
    infinity +(-,*,/) 3    //infinity
    infinity +(*) infinity     //infinity
    infinity -(/) infinity     //NaN
    

    下溢

    当计算结果无比趋向0时,称为下溢。正方向趋向0返回0,负方向返回-0.

    0 === -0    //true
    

    NaN

    表示非数字,与任何值都不相等包括其本身。可用isNaN()判断是否为NaN.

    浮点数比较的问题

    js浮点数的表示方法也是采用的大多数语言的二进制表示法(IEEE-754),因此会出现如下问题

    .4 - .3 === .3 - .2     //false
    .4 + .1 === .2 + .3     //true
    

    null和undefined的关系和区别

    都是对空值的描述,但null倾向于正常的,意料中的空值而undefined则倾向于是异常的,意料之外的空值。

    null == undefined   //true
    null === undefined  //false
    typeof null     //"object"
    typeof undefined    //"undefined"
    null + ''   //"null"
    undefined + ''  //"undefined"
    null + 0    //0
    undefined   //NaN
    

    类型转换

    包装对象

    数值,字符串,布尔值都是非对象类型但看上去却具有对象所具有的属性和方法。以字符串为例,当调用字符串的toStirng()方法时字符串会调用new String()创造一个临时对象,该对象继承了字符串的原型方法,然后调用该临时对象的toString()方法。一旦调用结束,该临时变量会自动销毁。(实际并不一定创建和销毁这个临时变量,但整个过程看上去就是这样的)

    隐式类型转换

    使用运算符会导致数据类型的隐式转换

    1 + ''      //'1'
    '3' * '7'       //21
    'a' * 1     //NaN
    NaN + '233'     //"NaN233"
    

    一些特殊值的类型转换

    image

    值传递和引用传递

    对象都是引用传递(地址),因此对象只和自身相等,而基本类型都是值传递。

    //a重新赋值后指向了新的地址,因此与b脱离了关系,b指向a的原地址的值并没有发生变化
    let a = [1,2,3];
    b = a;
    a = [4,5,6];
    console.log(b);  //[1,2,3]
    //不改变指向
    let a = [1,2,3];
    b = a;
    a.pop();
    console.log(b); //[1,2]
    

    对象实现深拷贝

    let a = {x:'x',y:'y'},b = {};
    for (item in a){
        b[item] = a[item];
    }
    

    判断类型的方法

    typeof

    typeof '1'  //"string"
    typeof 1    //"number"
    typeof Symbol('id')     //"symbol"
    typeof true     //"boolean"
    typeof null     //"object"
    typeof undefined    //"undefined"
    typeof []   //"object"
    

    instanceof

    '1' instanceof String  //false
    1 instanceof Number  //false
    Symbol('id') instanceof Symbol  //false
    null instanceof Object  //false
    undefined instanceof undefined  //抛出异常
    true instanceof Boolean  //false
    [] instanceof Array //true
    

    Object.prototype.toString.call()

    Object.prototype.toString.call('1') //"[object String]"
    Object.prototype.toString.call(1)   //"[object Number]"
    Object.prototype.toString.call(Symbol('id'))    //"[object Symbol]"
    Object.prototype.toString.call(true)    //"[object Boolean]"
    Object.prototype.toString.call(null)    //"[object Null]"
    Object.prototype.toString.call(undefined)   //"[object Undefined]"
    Object.prototype.toString.call([])  //"[object Array]"
    
  • 相关阅读:
    JAVA中重写equals()方法为什么要重写hashcode()方法说明
    深入浅出UML类图
    UML解惑:图说UML中的六大关系
    maven自动打包上传nexus仓库配置
    vi查找替换命令详解
    Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)
    Maven 排除依赖jar包
    2、【Spark】Spark环境搭建(集群方式)
    1、【Spark】Spark安装
    Centos7 执行firewall-cmd –permanent –add-service=mysql报错“ModuleNotFoundError: No module named 'gi'”
  • 原文地址:https://www.cnblogs.com/Lazy-Cat/p/12298653.html
Copyright © 2020-2023  润新知