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

    JS中有6种数据类型:Undefined、Boolean、Number、String,Function和Object。JS中不支持任何创建自定义类型的机制,而所有值最终都将是这6种数据类型。其数据类型的动态性特点足以表示所有数据。JS提供typeof操作符来检测变量的数据类型。

                      alert(typeof undefined); //undefined;
                                        alert(typeof null); //object;
                                        alert (typeof NaN); //number;
                                        alert(undefined==null); //true;
                                        alert(NaN==NaN); //false;
                                        alert(isNaN(NaN));//true;

    一.Undefined

      undefined是一个表示"无"的原始值,转为数值时为NaN;

      undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

      (1)变量被声明了,但没有赋值时,就等于undefined。
      (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
      (3)对象没有赋值的属性,该属性的值为undefined。
      (4)函数没有返回值时,默认返回undefined。
      
    var str;
    alert(str);//undefined--变量被声明了,但没有赋值时
    function move(obj){
          var a=obj;
          alert(a);
    } 
    move(); //undefined--调用函数时,应该提供的参数没有提供
    var json={"a":"1"}
    alert(json.b); //undefined--对象没有赋值的属性

    二.Boolean

      boolean 数据类型 boolean 变量存储为 8 位(1 个字节)的数值形式,但只能是 True 或是 False。

      alert(1&&2)//前面为真执行后面--2

      alert(0||2)//前面为假执行后面--2

      什么是真什么是假:

        真[true]:非0的数字;非空的字符串;非空对象;true;
               假[fasle]: 0;空字符串;空对象; false; undefined;NaN;

      javascript中创建boolean对象的方法

        使用关键词 new 来定义 Boolean 对象。下面的代码定义了一个名为 myBoolean 的逻辑对象:
        var myBoolean = new Boolean();
    三.Number
      var  item =55;   //整数
        除了以十进制表示外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的字面值来表示。其中,八进制字面值的第一位必须是零(0),然后是八进制数字序列(0-7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当做十进制数值解析。请看下面的例子:
        var color1=070;   //八进制的56
        var color2=079;   //无效的八进制数值——解析为79
        var color3=08;    //无效的八进制数值——解析为8
        十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0-9及A-F)。其中,字面A-F可以大写,也可以小写。如下面的例子所示:
        var num1=0xA;    //十六进制的10
        var num2=0x1f;    //十六进制的31
     
        所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然小数点前面可以没有整数,但我们不推荐这种写法。
        var floatNum1=1.1;
      var floatNum2=0.1;
        var floatNum3=.1;  //有效,但不推荐
     
        针对NaN的这两个特点,ECMAScript定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN()在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串“10”或“Boolean”值。而任何不能转换为数值的值都会导致这个函数返回true。请看下面的例子:
        alert(isNaN(NaN)) ; //true
        alert(isNaN(10));   //false(10是一个数值)
        alert(isNaN(true));  //false (可以被转换成数值1)
      
      有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个函数,即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这3个函数对于同样的输入会有返回不同的结果。
      Number()函数的转换规则如下。
       0.  如果是Boolean值,true和false将分别被转换成1和0.
    1. 如果是数字值,只是简单的传入和返回。
    2. 如果是null值,返回0。
    3. 如果是undefined,返回NaN。
    4. a.如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成11(注意:前导的零被忽略了)   
         b.如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零);
         c.如果字符串中包含有效的十六进制格式,例如:“0xf”,则将其转换为相同大小的十进制整数数值;
         d.如果字符串是空的(不包含任何字符),则将其转换为0;
         e.如果字符串中包含除上述格式之外的字符,则将其转换为NaN。

         var num1=parseInt("1234blue");   //1234
           var num1=parseInt("");   //NAN

          var num1=parseInt("10",2);    //2 (按二进制解析)
          var num2=parseInt("10",8);    //8 (按八进制解析)
          var num3=parseInt("10",10);    //10 (按十进制解析)
          var num4=parseInt("10",16);    //16 (按十六进制解析)
    四.String
       数值,布尔值,对象和字符串值(每个字符串也都有一个toString()方法,该方法返回值返回串的一个副本)都有toString()方法。但null和undefined值没有这个方法。
        多数情况下,调用toString方法不必传递参数。但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。默认情况下,toString()方法以十进制格式返回数值的字符串表示。而通过传递基数,toString()输出以二进制、八进制、十六进制,乃至其他任意有效进制格式表示的字符串值。下面给出几个例子:
            var num=10;
            alert(num.toString());  //"10"
            alert(num.toString(2));  //"1010"
            alert(num.toString(8));  //"12"
            alert(num.toString(10));  //"10"
            alert(num.toString(16));   //"a"
        如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
        如果值是null,则返回"null";
        如果值是undefined,则返回“undefined”
        下面再看几个例子:
         var value1=10;
         var value2=true;
         var value3=null;
         alert(String(value1));    //"10"
         alert(String(value2));    //"true"
         alert(String(value3));    //"null"
         alert(String(value4));    //"undefined"
        这里先后转换了4个值:数值、布尔值、null和undefined。数值和布尔值的转换结果与调用toString()方法得到的结果相同。因为null和undefined没有toString()方法,所以String()函数就返回了这两个值的字面量。
    五.Object 
    ECMAScript中的对象是可变的键控集合(即一组数据和功能的集合)。它将很多值聚合在一起,可通过名字访问这些值。对象也可看做属性的容器,每个属性都是一个名/值对。属性的名字可以是包括空字符串在内的任意字符串。属性值可以是除undefined值之外的任何值。对象最常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、检测(test)和枚举(enumerate)他的属性。
        一、属性类型
        ECMA-262第5版在定义只有内部采用的特性时,描述了属性的各种特征。为了表示特性时内部值,该规范把它们放在了两对方括号中,例如:[[Enumerable]]。ECMAScript对象中有两种属性:数据属性和访问器属性。
       1.数据属性
        数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。
         a.[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。这个特性默认值为true。
         b.[[Enumerable]]:表示能否通过for-in循环返回属性。这个特性默认值为true。
         c.[[Writable]]:表示能否修改属性的值。这个特性默认值为true。
         d.[[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性的默认值为undefined。
        2.访问器属性:
         a.[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true.
         b.[[Enumerable]]:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true。
         c.[[Get]]:在读取属性时调用的函数。默认值为undefined。
         d.[[Set]]:在写入属性时调用的函数。默认值为undefined。

       二、创建对象
        1.通过new创建对象
        new 运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数称做构造函数,构造函数用以初始化一个新创建的对象。JavaScript语言核心中的原始类型都包含内置构造函数。例如:

           

    除了这些内置构造函数,用自定义构造函数来初始化新对象也是非常常见的。

        2.对象字面量
        创建对象最简单的方式就是在JavaScript代码中使用对象字面量。对象字面量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来,结构为:{属性名1:属性值1,属性名2:属性值2,……}。属性名可以是JavaScript标识符也可以是字符串字面量(包括空字符串)。属性的值可以是任意类型的JavaScript表达式,表达式的值(可以是原始值也可以是对象值)就是这个属性的值。请看示例:

           

        3.原型
        我们创建的每个对象都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中,请看示例:

            

        在此,我们将sayName()方法和所有属性直接添加到了Person的prototype属性中,构造函数变成了空函数。即使如此,也仍然可以通过调用构造函数来创建新对象,而且新对象还会具有相同的属性和方法。但与构造函数不同的是,   
      三、基于对象属性的各种操作
        1.对象属性的获取
        访问对象属性可以使用点表示法和方括号表示法。对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于方括号来说([]),方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字。请看示例:

           

        当使用方括号时,我们说方括号内的表达式必须返回字符串。其实更严谨的说,表达式必须返回字符串或返回一个可以转换为字符串的值(这个特点可以用于处理很多情况)。由此我们可以联想到数组,这和数组获取元素的方法极为相似,其实数组也是对象,只是其属性名为数组下标而已。
        2.属性访问错误
     
           
        但是如果对象不存在,那么试图查询这个不存在的对象的属性就会报错。null和undefined值都没有属性,因此查询这些值的属性会报错,请看示例:
           

         


        当然,给null和undefined设置属性也会报类型错误。给其他值设置属性也不总是成功,有一些属性时只读的,不能重新复制,有一些对象不允许新增属性,但让人颇感意外的是,这些设置属性的失败操作不会报错:

           

        这是一个历史遗留问题,这个bug在ECMAScript5的严格模式中已经修复。在严格模式中,任何失败的属性设置操作都会抛出一个类型错误异常。

        3.删除属性
        delete运算符可以删除对象的属性。它的操作数应当是一个属性访问表达式。让人感到意外的是,delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。

        delete运算符只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,而且这会影响到所有继承自这个原型的对象)
        当delete表达式删除成功或没有任何副作用(比如删除不存在的属性)时,它返回true。如果delete后不是一个属性访问表达式,delete同样返回true:
           
        delete不能删除那些可配置性为false的属性(尽管可以删除不可扩展的可配置属性)。某些内置对象的属性是不可配置的,比如通过变量声明和函数声明创建的全局对象的属性。在严格模式中,删除一个不可配置属性会报一个类型错误。在非严格模式中,这些情况下的delete操作会返回false:
           

    在非严格模式中删除全局对象的可配置属性时,可以省略对全局对象的引用,直接在delete操作符后跟随要删除的属性名即可:
           

    然后再严格模式中,delete后跟随一个非法的操作数(比如x),则会报一个语法错误,因此必须显式指定对象及其属性:
           

        4.枚举属性
        for-in语句可用来遍历一个对象中的所有属性名。该枚举过程将会列出所有的属性——包括函数和你可能不关心的原型中的属性——所以有必要过滤掉那些你不想要的值。最为常用的过滤器是hasOwnProperty方法,以及使用typeof来排除函数:
           
        属性名出现得顺序是不确定的,因此要对任何可能出现的顺序有所准备。如果你想要确保属性以特定的顺序出现,最好的办法就是完全避免使用for-in语句,而是创建一个数组,在其中以正确的顺序包含属性名:
           
        通过使用for而不是for-in ,可以得到我们想要的属性,而不用担心可能发掘出原型链中的属性,并且我们按正确的顺序获得了它们的值
     
     
        隐式类型转化:
                        a.除了+号之外(-  * / )的都是隐式类型转化;
                        b.==
                                                var a = '12';
                                                var b = 12;
                                                alert(a == b);//true;
              +的作用:
                        a>.字符串拼接:
                        b>.还可以做计算;
            显式类型转化[强制类型转化]:
                        a.parseInt(n,index);//取整数;碰到不是数字的就不在往后看了;index指进制数,默认十进制;
                                                var a = '12asd353453';
                                                var c = parseInt(a,10);
                                                alert(c);//12;
                                                
                                                var num = 123;
                                                alert(parseInt(num/60) + '分' + num%60 + '秒');
                        b.parseFloat(n,index);//取小数,碰到不是数字的就不在继续转化;
                                                
                        c.Number();    字符串里面包含非数字的就转化不了(NaN);
                                                var str = '12asd43543';
                                                var num = Number(str);
                                                alert(num);//NaN
       =: 赋值:右边的赋值给左边的;
            ==: 比较: 会做隐式类型转换,如果数据类型不相等,会先转换数据类型之后在进行比较;
            ===:严格的比较,如果数据类型不相等,那么就不相等;
                
                      
     
     
  • 相关阅读:
    政府信息化建设重点——服务、多元化
    随便聊聊水面效果的2D实现(一)
    【Oracel 基础】小结
    漫话Unity(二)
    Codeforces Round #265 (Div. 2) C. No to Palindromes!
    C99中的restrict和C89的volatilekeyword
    开源 java CMS
    JavaScript--基于对象的脚本语言学习笔记(二)
    小试“以图搜图”
    计算几何 《模板》
  • 原文地址:https://www.cnblogs.com/yang0901/p/6788909.html
Copyright © 2011-2022 走看看