• 红皮书:基本概念(三)


    数据类型

    ECMAScript中有5种简单数据类型(也称为基本数据类型):undefined,null,boolean,number和string

    typeof

    typeof null会返回“object”。因为特殊值null被认为是一个空的对象引用。

    undefined

    undefined类型只有一个值,即特殊的undefined。在使用var声明变量,但没有对变量进行初始化时,这个变量的值就是undefined。

    对未初始化的变量执行typeof操作符会返回undefined,而对未声明的变量执行typeof操作符同样也会返回undefined。

    var message;
    
    alert(typeof message); // undefined
    alert(typeof age); // undefined

    null

    null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度上看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值会返回“object”的原因。

    alert(null==undefined); // true

    这里,位于null和undefined之间的相等操作符(==)总是返回true。

    尽管null和undefined有这样的关系,但它们的用途完全不同。如前所述,无论在什么情况下都没有必要把一个变量显式地设置为undefined,可是同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。

    Boolean类型

    该类型只有两个字面值:true和false。这2个值跟数字值不是同一回事,因为true不一定等于1,false不一定等于0。该类型的2个值是区分大小写的。
    虽然Boolean类型只有两个字面值,但ECMAScript所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean()。

    var message="hello world!";
    var messageAsBoolean=Boolean(message);
    console.log(messageAsBoolean);// true

    Number类型

    浮点数值

    浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远不如整数。例如,0.1加0.2的结果不是0.3,而是0.300000000000000004,这个小小的舍入误差会导致无法测试特定的浮点数值。

    var a=0.2,b=0.1;
        if(a+b==0.3){
            console.log("you got 0.3.");
        }

    我们测试这两个数的和不等于3,如果这2个数是0.25和0.05,或者是0.15和0.15,结果都是没有问题的。如果是0.1和0.2,那么测试无法通过。因此,永远不要测试某个特定的浮点数值。

    NaN

    NaN的两个特点,一是任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。

    isNaN()函数接收一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”,isNaN()在接收这个值后,会尝试将这个值转换为数值。而任何不能被转换为数值的值都会导致这个函数返回true.

    alert(NaN==NaN); // false
    alert(isNaN(isNaN)); // true
    alert(isNaN(10)); // false
    alert(isNaN("10")); // false
    alert(isNaN("blue")); // true
    alert(isNaN(true)); // false

    数值转换

    Number(), parseInt(),parseFloat()

    Number()函数的转换规则如下:

    • 1.如果boolean值,true和false将分别被转换为1和0
    • 2.如果是数字值,只是简单的传入和返回
    • 3.如果是null值,返回0
    • 4.如果是undefined,返回NaN

    操作符

    一元操作符

    递增和递减操作符

    执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称为副效应)

    var age = 29;
    var anotherAge = --age +2;
    
    alert(age); // 28
    alert(anotherAge); // 30

    由于前置递增和递减操作与执行语句的优先级相等,因此整个语句会从左至右被求值。

    var num1 = 2;
    var num2 = 20;
    var num3 = --num1 + num2; // 等于21
    var num4 = num1 + num2; // 等于21

    后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含他们的语句被求值之后才执行的。

    var num1 = 2;
    var num2 = 20;
    var num3 = num1-- + num2; // 等于22
    var num4 = num1 + num2; // 等于21

    一元加和减操作符

    在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。换句话说,布尔值false和true将被转换为0和1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()和toString()方法,再转换得到的值。

    var s1 = "01";
    var s2 = "1.1";
    var s3 = "z";
    var b = false;
    var f = 1.1;
    var o = {
        valueOf : function(){
             return -1;
        }
    }
    
    s1 = +s1; // 1
    s2 = +s2; // 1.1
    s3 = +s3; // NaN
    b = +b; // 0
    f = +f; // 1.1
    o = +o; // -1

    一元减操作符只要用于表示负数,例如将1转换成-1。

    一元加和减操作符只要用于基本的算术运算,也可以像前面的示例所展示的一样用于转换数据类型。

    加性操作符

    加法

    var result1 = 5+5;
    alert(result1); // 10
    
    var result2 = 5+"5";
    alert(result2); // "55"

    减法

    var result1 = 5 - true; //4
    var result2 = NaN -1; // NaN
    var result3 = 5-3; //2
    var result4 = 5 - ""; //5
    var result5 = 5 - "2"; // 3
    var result6 = 5 - null; // 5

    相等操作符

    null == undefined; // true
    "NaN" == NaN; // false
    5 == NaN; // false
    NaN == NaN; // false
    NaN != NaN; // true
    false ==0; // true
    true == 1; // true
    true == 2; // false
    undefined ==0; false
    null ==0; false
    "5"==5; // true

    记住:null == undefined会返回true,因为它们是类似的值;但null===undefined会返回false,因为它们是不同类型的值。

    函数

    function sum(num1, num2){
        return num1 + num2;
        alert("Hello world"); // 永远不会放弃
    }

    这个函数会在执行完return 语句之后停止并立即退出。因此,位于return 语句之后的任何代码都不会执行。

    声明:如果您觉得本文对您的学习有所帮助,请多关注支持与鼓励。
    正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!屏幕右下角有“推荐”二字,如果觉得对你有帮助,你就顺手把它点了吧。
  • 相关阅读:
    LeetCode做题笔记(4)——error: variable-sized object may not be initialized|
    LeetCode做题笔记(3)——if嵌套if时不加花括号{}导致的bug
    LeetCode做题笔记(2)——使用动态内存分配定义一个二维数组
    数组的初始化
    LeetCode做题笔记(1)——二维数组及qsort的compar函数写法详解
    FreeRTOS 在Tricore上的三种任务切换方式
    FreeRTOS 就绪任务列表与延时任务列表(阻塞态到就绪态的转移原理)
    FreeRTOS vTaskDelay(相对延时)和vTaskDelayUntil(绝对延时)的区别及使用方法
    FreeRTOS 互斥信号量(Mutex)与二值信号量(Binary)的区别
    微信小程序函数间传递url的参数丢失问题
  • 原文地址:https://www.cnblogs.com/yanglang/p/6698432.html
Copyright © 2020-2023  润新知