• javascript数据类型理解整理


    起因:关于数据类型这块,自己看了很多遍相关的资料,每次查看和实践都有一些体会和理解;但又感到没有理解透,总是差一点,最近又在看这块的内容,加上最近的积累,做个相关笔记

    ECMAScript数据类型:
    1. 5中简单数据类型:String Number Boolean Undefined Null
    2. 1种复杂数据类型:Object,本质是一组无序的名值对组成的,eg:Array JSON ...
    【理解】对于JS数据方面的操作,都是数据类型之间的转换和操作,只要针对的攻克每一种数据类型,在逐步的融合,JS水平会有一个很好的进步;

    typeof操作符
    1. 这是个操作符,不是方法
    2. 之所以typeof存在,是因为ECMAScript是松散类型的语言;松散类型就是变量可以是任意数据类型,可以任意转换(不推荐)

    typeof(String) => string => 如果这个值是字符串
    typeof(Number) => number => 如果这个值是数值
    typeof(Boolean) => boolean => 如果这个值是布尔值
    typeof(Undefined) => undefined => 如果这个值未定义
    typeof(Object) => object => 如果这个值是对象或null
    typeof(Function) => function => 如果这个值是函数
    

    一、 Undefined类型

    当【声明】一个变量,但是【未初始化】,这个变量的值就是undefined
    一直以来的困惑:
    1. 对【未初始化】的变量执行typeof操作符,返回undefined值
    2. 对【未声明】的变量执行typeof操作符,返回undefined值

    var message;
    console.log(typeof message); // undefined
    console.log(typeof age); // undefined

    困惑:导致自己一直不知道该怎么解决这个问题,书上标注的解决办法是:显式的使用undefined来给没有初始化的变量进行赋值,每次实践的结果和书上说的有出入

    感悟:自己刚刚结合了jQuery上的$.type()的工具函数,和自己写的一些例子

    var message;
    // jQuery中$.type()工具函数
    console.log($.type(message)); // undefined
    console.log($.type(age)); // 【报错】age is not defined
    // 自己理解写的例子
    console.log(message==undefined); // true
    console.log(age==undefined); // 【报错】age is not defined

    所以,无论从$.type()的角度看,验证结果;还是从例子中查看结果,都可以看出,对于【未声明】和【未初始化】分离和验证都不是难题;
    【注】对于$.type()的原理实现,是否是我例子中的方法,我还没有验证;当然这不是重点,重点是,妈妈再也不担心我分不清【未声明】和【未初始化】了;

    【项目中】在实际的项目中,肯定是不允许有报错行为的,这样大大的影响了程序的进一步运行;所以,用下面这种方式:

    var message;
    // jQuery中$.type()工具函数
    console.log($.type(message)); // undefined
    try{
        console.log($.type(age)); // 不报错了
    }catch(e){
        console.log("age is not defined!");
    };
    // 自己理解写的例子
    console.log(message==undefined); // true
    try{
        console.log(age==undefined); // 不报错了
    }catch(e){
        console.log("age is not defined!");
    };

     二、Null类型

    1.从逻辑的角度,null值表示一个空对象指针
    2.typeof(null),返回object
    3.如果定义的变量未来准备用来保存对象,最好将其初始化成null
    只要检测出来不是null就可以进行下一步操作:
    if(ele != null){ //要执行的代码 }
    4.undefined值是派生自null值,因此:console.log(undefined == null); //true

    console.log(undefined == null); // true
    // 从JS角度
    console.log(typeof undefined); // undefined
    console.log(typeof null); // object
    // 从jQuery角度
    console.log($.type(undefined)); // undefined
    console.log($.type(null)); // null

     三、Boolean类型

    1.有两个字面量:true and false
    2.区分大小写,只有全小写形式,属于Boolean类型,其余的只是标识符
    3.转型函数Boolean(),将任意类型的字符转换成Boolean类型
    转换规则:
    数据类型 => true => false

    String类型 => 任意非空字符串 => ""(空字符串)
    Number类型 => => 任意非零数字值(包括无穷大) => 0和NaN
    Boolean类型 => true => false
    Object类型 => 任意对象 => null
    Undefined类型 => n/a(or N/A),意思是不适用(not applicable) => undefined
    

    四、Number类型

    1.数值字面量表示方式:十进制、八进制(严格模式不支持,直接报错)、十六进制
    八进制:第一位必须是0,然后是八进制数字序列(0~7)
    十六进制:前两位必须是0x,后跟十六进制数字序列(0~9及A~F),字母(A~F)大小写都可以
    算术计算时:所有以八进制和十六进制表示的数值最终都将被转换成十进制数值
    正零 == 负零(+0 == -0)

    2.浮点数值
    就是数值中包含一个小数点,小数点后必须至少有一位数字
    小数点前面可以没有整数,但是不推荐(.1)
    保存浮点数值所需的内存空间是保存整数的两倍,所以下面这些浮点数,会当做整数处理

    1. => 1
    10.0 => 10

    对于极大极小的数值,可以用e表示法(即科学计数法)来表示浮点数值;e前面的数值*10的指数次幂,幂是e后面的数值

    3.125e7 == 31250000
    0.00000000000000003 == 3e-17

    默认情况下,ECMAScript会将那些小数点后面带有6个零以上的浮点数值转换成e表示法
    浮点数值的最高精度是17位小数,但在进行算数计算时其精确度远远不如整数

    0.1 + 0.2 != 0.3
    0.1 + 0.2 != 0.30000000000000004

    【注】浮点数值计算有舍入误差,其它基于IEEE754数值的浮点数计算语言都有这类通病

    3.数值范围
    由于内存的限制,ECMAScript不能保存世界上所有的数值

    最小值:Number.MIN_VALUE
    最大值:Number.MAX_VALUE

    最值具体等于多少数值,不同的浏览器有不同的结果,具体以实际为准
    数值计算结果超出最值范围,将被自动转换成特殊的正值是Infinity(正无穷)值,负值是-Infinity(负无穷)
    判断某个数值是不是有穷数值(是不是位于最小值和最大值之间),可以使用isFinish()函数,结果是有穷的返回true,否则false

    var num = Number.MIN_VALUE + Number.MAX_VALUE;
    console.log(num); // false

    Infinity和-Infinity保存只

    Number.POSITIVE_INFINITY == Infinity
    Number.NEGATIVE_INFINITY == -Infinity

    4.NaN
    NaN,即非数值(Not a Number)是一个特殊的数值,当数值计算出现错误的时候,返回NaN,如:任何数除以0会返回NaN,这样不影响其它代码的执行
    两个特点:
    --- 1.任何涉及NaN的操作(NaN/10)都会返回NaN,这个特性在多步计算中有可能导致问题
    --- 2.NaN与任何值都不相等,包括NaN本身

    console.log(NaN == NaN); // false

    isNaN()函数,这个函数接收一个参数,该参数可以是任何类型;意思是是否【不是数值】
    当参数不是数值时,返回true;当参数是数值时,返回false

    console.log(isNaN("10")); // false
    console.log(isNaN("blue")); //true

    isNaN()也适用于对象,首先调用对象的valueof()方法=?是否可以转换为数值,如果不能,在调用toString()方法

  • 相关阅读:
    ThreadLocal的魔数为什么是0x61c88647?
    java流程控制之 高级for循环
    java流程控制之 for循环 九九乘法表
    java流程控制之 while循环 1到1000中能被5整除的数 按3个数据一行输出
    java流程控制之 for循环 1到1000中能被5整除的数 按3个数据一行输出
    java流程控制之 for循环 1到100的奇偶数和
    java流程控制之 while 循环
    java流程控制之 while 循环 1到100的和
    java流程控制之 switch
    java流程控制之顺序结构
  • 原文地址:https://www.cnblogs.com/liu-fei-fei/p/5684764.html
Copyright © 2020-2023  润新知