• 5、数据类型


    前言:
    5种原始型基本数据类型,也叫值类型:Undefined、Null、Boolean、Number和String。
    复合型/引用型数据类型:Object,对象是属性和方法的集合,其本质是一组无序的名值对组成的。还有些如Array()、function()类型,
    【记一下】
    值类型:数值、布尔值、null、undefined。 引用类型:对象、数组、函数。
    【区别】
    基本的数据类型有:`undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
    引用数据类型:引用类型的存储需要内存的栈区和堆区共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。

    基本数据类型内存存储方式

    var name = 'jozo';
    var city = 'guangzhou';
    var age = 22;

    引用数据类型存储方式

    var person1 = {name:'jozo'};
    var person2 = {name:'xiaom'};
    var person3 = {name:'xiaoq'};

    包装类
    为了便于操作基本类型值,ECMAScript 为3个常用的基本数据类型boolean,number,string提供了包装类,每个类对用的都有自己的构造方法。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而能够调用一些(构造方法提供)方法来操作这些数据。
    number类型包装类是Number
    string类型包装类是String
    boolean类型包装类是Boolean

    var str1="hello!";
    var s=str1.substring(2);
    alert(s);
    /*第一行,我按照平常的习惯,为str1赋予了一个字符串值。
     第二行,我却拿基本类型的变量来访问一个方法。
    【解释】访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值,而在读取模式中访问字符串时,后台会:
    1、创建string类型的一个实例:var str1=new string('hello!');
    2、在实例上调用指定的方法:var s=str1.substring(2);
    3、销毁这个实例:str1=null;
     记住销毁的只是实例,而不是之前的基本类型值。所以每次调用方法时,都会这样一番。*/

    字面量Vs创建new对象赋值
    直接量也称为字面量,是Js中一种对象的表示(或者说创建)方式,它可以通过直接给变量赋上Js中原生对象值的方式从而转换为一个相应的对象。
    而通过new来创建对象,再赋值。则是中规中矩的方式,但是用于频繁使用的基本数据类型来说,就过于麻烦了
    从这个定义中可以看出,这种定义方式实际上是声明一种类型的变量,并同时进行了赋值。因此,声明后的对象直接量可以在代码中直接使用,而不必使用new关键字来创建对象。

    var str1="hello!";
    var str2=new String('hell');
    console.log(typeof str1);//string
    console.log(typeof str2);//object
    /*String 是构造函数,string是变量的一个类型。以上两种使用起来是一样的
    还有要注意的是,使用new调用基本包装类型的构造函数,new创建的全是对象,所以typeof全是object。so与直接赋值是不一样的就是数据类型不一样*/

    string
    格式
    字符串类型是最熟悉不过的啦,至于用单引号,还是双引号,在js中还是没有差别的。

    var firstName='zakas';

     String包装类的对象方法

    length计算字符串的长度
    str.length
    
    indexOf()索引 定位字符串中某一指定的字符首次出现的位置
    var str="Hello";
    console.log(str.indexOf("e"));//e第一次出现的位置
    [Web浏览器] "1"
    
    match() 查找字符串中特定的字符,若找到的话,会返回次字符。
    var str="Hello world!"
    console.log(str.match("Hello"));
    console.log(str.match("hello"));
    [Web浏览器] "Hello"
    [Web浏览器] "null"
    
    replace() 方法在字符串中用某些字符替换另一些字符
    var str="Hello world!"
    var NewStr=str.replace(/world/,"girl")
    console.log(NewStr);
    [Web浏览器] "Hello girl!"
    
    更多的方法请参考手册
    http://www.w3school.com.cn/jsref/jsref_obj_string.asp

    number
    该类型的表示方法有两种形式,第一种是整数,第二种为浮点数。
    [正数]整数 可以通过十进制,八进制,十六进制的字面值来表示。
    [浮点数]即小数,如果小数点后只有零,则该小数会被转化为整数。浮点数所占据的内存空间是整数的两倍。

    var num=123;
    var num=1.23;

    Number对象方法

    /*toString把数字转换为字符串*/
     var num=123;
     var NewNum=num.toString();
     console.log(typeof num);// "number"
     console.log(typeof NewNum);//"string"
    /*其它方法请参考手册 http://www.w3school.com.cn/jsref/jsref_obj_number.asp*/

    boolean
    即布尔类型,该类型有两个值:true false;

    var x=true;

    Boolean对象方法
    创建对象:

    var x=new Boolean();
    /*若不写参数,或为 0、-0、null、""、false、undefined 或 NaN,则该对象设置为 false。否则设置为 true(即使 value 参数是字符串 "false")。*/

    方法

    //toString将布尔值转换成字符串
    var test= true;
    console.log(test+"类型为:"+typeof test)//"true类型为:boolean"
    console.log(test.toString()+"类型为:"+typeof test.toString())//"true类型为:string"

    undefeined
    有两种情况会undefined,
    在使用var声明变量,但未对其加以初始化时,这个变量的类型就是undefined,且其默认初始化值为undefined。
    对未声明与初始化的变量,直接使用,那么这个变量的类型也是undefined,但是没有默认初始化值。

    var message;
    console.log('已声明,但未初始化的变量message的类型是:' +typeof message)
    console.log('未声明,也未初始化的变量age的类型是:'+ typeof age)
    /*[Web浏览器] "已声明,但未初始化的变量message的类型是:undefined"
    [Web浏览器] "未声明,也未初始化的变量age的类型是:undefined"*/

    两种情况的区别
    因为js的变量都是用关键字var来声明的,变量的具体类型取决于他被赋予的变量值,而对于以上两种情况,虽然本质上有区别,但是都没有被初始化,所以其类型都是undefined。但是后者没有初始化值。所以当

    var message;
    console.log(message)
    console.log(age)
    /*[Web浏览器] "undefined"
    [Web浏览器] "Uncaught ReferenceError: age is not defined"*/

    null
    js的5中原始数据类型里边的, 另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。(比如:Number的字面量就可以是1-9之间任意数字)
    null用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。
    null就是啥都没有,譬如,而空格、空字符串、0等都是有实际值的对象,与null当然有质的区别了。

    console.log(typeof null) //打印object
    /*  从逻辑角度来看,null值表示一个空对象指针.
        而这正是使用typeof操作符检测null值时会返回“object”的原因。
        《JavaScript高级程序设计(第2版)》P22如是说
        在ECMA6中, 曾经有提案为历史平反, 将type null的值纠正为null, 但最后提案被拒了. 理由是历史遗留代码太多, 不想得罪人, 不如继续将错就错当和事老
    */

    NaN【不属于5种基本数据类型,不常用】
    概念
    是非数字类型,即Not a Number 的简写。隶属number类型的值。
    注意它可不是js的5中原始数据类型里边的。
    NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。

    console.log(typeof NaN)//会打印number

    什么情况下会返回NaN?
    参考:http://www.w3school.com.cn/jsref/jsref_nan_number.asp
    执行该代码,本应该返回数字的,结果却没有,那么就会返回NaN,比如下边

    //运算函数,无法做算术运算时,或结果不是数字,就返回NaN
    console.log(0/0);
    console.log(Math.round())//四舍五入失败时,会返回NaN
    console.log(Math.sqrt("Q"))//求平方根失败时,会返回NaN
    //不能强制转换时,或结果不是数字,就返回NaN
    console.log(Number("Q"))//强转数字失败时,会返回NaN
    //在不能解析指定的字符串时,或结果不是数字,就返回NaN
    console.log(parseInt("Q")) //解析字符串,并返回一整数失败时,会返回NaN
    console.log(parseFloat("k")) //解析字符串,并返回一浮点数失败时,会返回NaN

    对于一些常规情况下返回有效数字的函数,也可以采用这种方法,用 Number.NaN 说明它的错误情况,此属性只有一个值:NaN。

    //判断月份是否为常规有效数字
    var Month=30;
    if (Month < 1 || Month > 12){
    Month = Number.NaN;//Number.NaN值为NaN
    }
    console.log(Month) //打印NaN

    Number对象的属性NaN--**Pk**--全局对象的属性 NaN
    参考:http://www.w3school.com.cn/jsref/jsref_nan.asp

    在 ECMAScript v1 和其后的版本中,还可以用预定义的全局属性 NaN 代替 Number.NaN。
    全局对象的该属性即NaN不怎么常用,其实Number对象的属性NaN也不常用!

    总结:
    1. 全局对象和Number对象,都有一个属性NaN,此属性只有一个值NaN。但此属性很少有人用
    2. 人们用的最多的是,全局函数isNaN(),用来判断某个值是不是非数字。

    /*isNaN(x)判断是不是非数,x为空或者非数的时候满足条件。比如isNaN(5/0)就成立。
    总之大致一句话总结:只要不是数字,都是trtue
    通常用于检测值的结果,判断它们表示的是否是合法的数字。*/
    console.log(isNaN(1))//false
    console.log(isNaN(2-1))//false
    console.log(isNaN(5/0))//false
    console.log(isNaN("5"))// false【注】
    
    console.log(isNaN(0/0))//0除以0结果为NaN,true
    console.log(isNaN("5-2"))//true
    console.log(isNaN("A"))//true
    //【注】:为何此处也行,因为因为 "5"==5, js会自动转换!!!所以必须判断类型,就诞生了typeof函数。如下代码
    console.log("5"-"3")//结果打印2
    console.log("5-3")//结果打印5-3

    最后一个:
    复合数据类型(引用数据类型)
    Object
    1、该类型实例化的对象,是一组数据或函数的集合或都有
    2、实例化对象(即创建对象)有两种办法,一种是通过new操作符,一种是通过对象字面量表示法。【js没有class的概念,但是创建对象也得有类的意识,在ES6里已经引入了class关键字类】

    //一种是通过对象字面量表示法
    var dsh={
       "name":"丁少华",//属性写法1
        age:"30",//属性写法2
        speak:function (){alert("大家好,我叫"+dsh.name+",我"+dsh.age)}
    }
    dsh.speak()
        
    //一种是通过new操作符
    function Persion(name,age){
        this.name=name;
        this.age=age;
        this.speak=function(){alert("大家好,我叫"+name+",我"+age)};
    }
    wx=new Persion("王新",20);//实例化对象
    wx.speak()

    3、object类型是最基本的复合数据类型,我们可以在其基础上继承出更多的类型。
    像我们知道的Array()、Date()、还有有意思的function()类型,都是从object继承的。而且这些类型都在程序员使用前被默认设置了属性和方法,供程序员调用。

    4、而以上类型又有一个笼统的称呼为引用类型。为什么是引用类型呢?
    就用java的思想去理解吧---好吧,本文的一开始就介绍了,你在向上滑动看看。

    typeof

    ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String
    typeof是用来测试数据类型的,会返回上边的5种原始类型和function

    本文参考:

    http://www.jianshu.com/p/0d3034102220

    https://segmentfault.com/a/1190000002789651

    http://www.jb51.net/article/63875.htm

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/dshvv/p/5475913.html
Copyright © 2020-2023  润新知