zoukankan      html  css  js  c++  java
  • JS数据类型

    • 什么是数据类型?
    • 数据类型有哪些?
    • 如何查看数据类型?
    • undefined 和 null 的区别?
    • 布尔类型

     

    什么是数据类型?


     

    计算机的本质是计算,计算的本质是对值进行操作,无论是参与计算的值,还是通过计算得到的值,在计算机中都统一称为数据。计算机的语言其实就是对各种数据进行处理,为了更好地处理数据,所以就把数据分门别类地归纳好,这个分类结果,叫数据类型。

     

    数据类型有哪些?


     

    JS 中一共有 5+1 种数据类型:数字、字符串、布尔、undefined、null、object。

    前5种是基础数据类型,也叫简单数据类型或原始数据类型,而除了这5种数据类型,其他数据统一称为object(对象)。对象其实就是由不同属性组成的一个无顺序合集。例如,有一个对象 student,这个对象包含了 name, age, famous, boyfriend, hobbies 5个属性,这些属性对应的值的类型分别是字符串、数字、布尔值、undefined 和 object。其中 hobbies 是 student 对象的一个属性,而它本身也是一个对象,包含了三个数据类型为字符串的值。对象的属性值可以是任意一种数据类型,而且这些属性都是没有顺序的,可以任意调换它们的位置。

    var student = {
        name: “suki”,
        age: 21,
        famous: false,
        boyfriend: undefined,
        hobbies: [“tennis”, “guitar”, “drawing”]
    };

    JS 非常灵活,在 JS 中,除了5种基础数据类型以外,其他所有东西都可以用对象来表示。

     

    比如一支笔,它有长度、颜色、价格等属性,另外,笔还可以写字。“可以写字”这个属性是笔可以做的事情,在 JS 中,这种属性有一个特殊的名字,叫“方法”。本质上,只有对象拥有方法,其他基础数据类型是没有方法的。下面的例子说明了基础数据类型不能拥有属性。

    var a = “abcd”;  // 声明一个变量a并赋值为”abcd”
    
    a.len = 4;  // 为属于基础数据类型的a添加属性len
    
    alert(a.len);  // undefined

    当我们给基础数据a设置属性的时候,之所以没有报错,是因为 JS 解释器在这里把a转换成了对象,而在属性设置这一步结束之后,这个对象马上就被销毁了,所以在下一步我们尝试获取这个属性时失败了。同样的,基础数据类型也是没有方法的,即使我们在对 a 使用了toUpperCase 方法,但之后再去查看时,a 仍然是小写的”abcd”。

    a.toUpperCase();
    
    alert(a);  // abcd

    当运行 a.toUpperCase() 时,JS 先把 a 转换成了对象,再去调用这个对象的方法,返回运行结果,但是这个结果是不会自动保存的,除非手动地把这个结果赋值给一个变量,例如 a = a.toUpperCase();(这里把方法调用的结果保存到变量 a 中,其实就相当于重新给 a 赋值了),之后这个对象就被销毁了。

     

    这里引出了 JS 中另外一种数据分类方法。JS 中的数据还可以分为可变的和不可变的两种,在 JS 中,所有基础数据类型都是不可变的,只有对象是可以改变的。

    var a = “abcd”;
    
    a = “abcdef”;  // 并不是对“abcd”这个字符串进行了修改,而是把一个新的字符串“abcdef”重新赋值给 a

    如果要对数据进行比较,基础数据类型比较的是两个“值”是否相等,而对象比较的是两个“引用”是否相等。在 JS 中任何两个独立的对象都是不相等的,即使它们的内容完全一样。

    var a = 123;
    var b = 123;
    
    alert(a === b);  // true
    
    
    var obj1 = {
        name: “suki”,
        age: 21
    };
    
    var obj2 = obj1;
    
    alert(obj1 === obj2);  // true  obj1和obj2引用的是同一个对象
    
    
    var obj1 = {
        name: “suki”,
        age: 21
    };
    
    var obj2 = {
        name: “suki”,
        age: 21
    };
    
    alert(obj1 === obj2);  // false  虽然obj1和obj2拥有完全相同的属性,但它们是两个独立的对象

    如何查看数据类型?

    ECMAScript 数据类型具有动态性,JS 定义一个变量仅仅是给它赋值了,并没有确定这个变量的数据类型,只有在参与计算的时候,JS 才会动态地去取对应的数据类型。在 JS 中我们可以使用typeof 去查看数据的类型。需要注意的是,typeof 的所有返回值都是字符串。

    按理说,对应 JS 的6种数据类型,typeof 也应该有对应的6种返回值,事实上虽然 typeof 有6种返回值,但它们与 JS 的6种数据类型并非一一对应。typeof 的6种返回值分别是:

    “undefined”, “boolean”, “string”, “number”, “object”, “function”。

    没有”null”,却多了一个”function”。

    如果使用 typeof 去查看 null 的值,会返回“object”,但这其实是个小错误,因为 JS 底层把二进制前三位为0的数据判断为 object,而 null 的二进制全部是0,所以被判断为 object,但其实它是一种基础数据类型,所以判断数据类型的时候使用 typeof 并非完全靠谱。

     

    typeof 其实是一个操作符,虽然可以写成 typeof (123)这种格式,但是不要误以为它是一个函数。关于要不要加括号以及在哪里加:

    var a = true;
    var b = true;
    
    alert(typeof a == b);  // 是 (typeof a) == b ? 还是 typeof (a == b) ?

    // 运行时其实是这种情况
    alert((typeof a) == b);  // “boolean” == true ? fals

    这个结果可能会与预期有出入,建议使用 typeof 时可以加上括号,

    // 不是建议像这样写成像函数的样子
    alert(typeof (a == b));  // “boolean”
    
    // 而是建议在整个表达式外面加一对括号
    alert((typeof a == b));  // “boolean”

    (如果是特别简单的可以不加括号,但如果是比较复杂的情况可以加上括号避免误解或出错)

     

    undefined 和 null 的区别?


     

    相同点:

    1, 这两种数据类型都只有一个值,undefined数据类型只有一个值就是undefined,null数据类型也只有一个值就是null;

    2, 两者参与判断都返回 false;

    3, 两者都没有方法;

     

    不同点:

    1,在 JS 中,null 是一个关键字,而 undefined 不是;

    var null = 123;  // 报错
    var undefined = 123;  // 不会报错

    2,undefined 除了是一种数据类型,它还是 window 对象的一个属性,这个属性的值就是 undefined。如果使用 a === undefined 去判断一个 a 是不是 undefined,JS 首先会获取a,然后把它拿到 window 里面去,逐个与 window 的属性比较,直到比较到 undefined 为止。因为 window 里有很多属性,这种查找方法特别消耗性能,所以不建议使用这种方法;可能会在一些代码中看到自己在函数中先定义一个 undefined 的情况,就是为了解决消耗性能的问题吧;

    3,undefined 代表的是未初始化,例如声明一个变量而不给它赋值,这个变量的默认值 undefined,虽然 undefined 的字面意思是“未定义”,但这个变量是已经定义了的,只是还没有初始化。但是 null 不一样,当你给一个变量赋值 null 的时候,这个变量已经经过初始化了,它的值就是空;

    4,使用 typeof 查看数据类型的时候,null 会返回 “object”,undefined 会返回 “undefined”;

    4, Number(undefined) 会返回 NaN,Number(null) 会返回0;

     

    用法:

    1, 当你声明一个变量的时候,可以不给它赋值,但如果你必须给它赋值又不知道用什么值得时候,可以把 null 赋值给它;

    2, 当你一定要用全等(===)来检测某一个值是否存在的时候,使用 undefined;

    3, 当你要用全等(===)来检测一个值是否为空的时候,使用 null;

     

    新手建议:

    1,不要在给变量赋值的时候使用 undefined ;

    2,判断某个值是否存在或者为空的时候,可以使用 a == null(但存在性能问题);

    3,如果明确知道需要判断某个值为undefined或者null时,使用全等,a === undefined 或 a === null;

     

    布尔类型


     

    可能会在一些代码中看到它的简写形式: bool;

    用途: 判断或者对结果进行比较;

    返回值: true 或 false;

    所有数据类型都可以转换成布尔类型,可以使用 Boolean() 把其他数据类型转换成布尔类型。但只有6个数据会被转换成false:undefined,null,0,-0,NaN,““(空字符串),除此以外,其他所有数据都会被转换成true.

    简单的转换方法: !!

     

     

     

    记录整理from沙翼老师的#陪你读书#教程第四期(喜马拉雅)

    https://github.com/suukii
  • 相关阅读:
    Python3.5 Day2作业:购物车程序
    Python3.5 Day1作业:实现用户密码登录,输错三次锁定。
    Python3.5 day3作业二:修改haproxy配置文件。
    Python3.5 day3作业一:实现简单的shell sed替换功能
    Python3.5 day4作业:对员工信息文件,实现增删改查操作。
    栈的数组实现
    栈的链式实现
    20101217
    traits
    DES加密算法中的IP置换算法
  • 原文地址:https://www.cnblogs.com/sukiY/p/9250459.html
Copyright © 2011-2022 走看看