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

    ECMAScript中有五种简单数据类型(基本数据类型):Undefined,Null,Boolean,Number,String。

    • Undefined 类型

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

    例如:

    var message ;
    alert(message == undefined);  //true

    上面的代码只是声明了 message,没有对其初始化,所以 message 的值就是 undefined 。起始它与  var message = undefined ;  是等价的,但我们并没有必要这么做,因为未经初始化的值默认就是undefined 值。

      还有,包含 undefined 值的变量与尚未定义的变量是不一样的,

    例如:

    1 var message ;
    2 alert(message);  //undefined
    3 alert(age);      //报错
    4 
    5 alert(typeof message); //undefined
    6 alert(typeof age); //undefined

    第二行代码显示 message 的值, 即 undefined 。第三行代码由于 alert() 函数是尚未声明的变量 age ,则会导致一个错误。对于未声明过的变量,只能执行一个操作,就是用 typeof 检测其数据类型,不过有意思的是,对未初始化的变量执行 typeof 操作符返回的是 undefined ,对为声明的变量执行 typeof 操作符返回的也是 undefined。虽然这两种变量从技术角度看有着本质的区别,但实际上对哪种变量也不可能执行真正的操作。

    • Null 类型

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

    例如:

    var car = null ;
    alert(typeof null);  // object

    如果定义的变量准备将来用于保存对象,那么最好把这个变量初始化为 null 。这样一来,只要直接检测 null 值就可以知道相应的变量是否已经保存了一个对象的应用。

    例如:

    if ( car != null ){
        // code ...  
    }

    有趣的是   null == undefined  为 true,实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定他们的相等性测试要返回 true。

    • Boolean 类型

      该类型有两个字面值,即 true 和 false。 true 不一定等于 1 , 而 false 也不一定等于 0 。以下为变量赋值boolean类型值的例子:

    var found = true ;
    var lost = false ;

      想要将一个值转换成为其对应的 Boolean 值,可以调应转型函数 Boolean() ,

    例如:

    var message = "Hello world";
    var messageAsBoolean = Boolean(message);

    可以对任何数据类型的值调用 Boolean() 函数,而且总会返回一个 Boolean 值,返回 true 或者 false 取决于转换值的数据类型及其实际值。

    • Number 类型

      1.浮点数值

       浮点数值(在这里做个简单的介绍),就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字,小数点前面可以没有整数,但是不推荐这种写法。

    浮点数例子:

    var floatNum1 = 1.1;
    var floatNum2 = 0.1;
    var floatNum3 = .1;   // 不推荐

    因为浮点数值需要的内存空间是整数的两倍,所以ECMAScript 会将浮点数值转换成为整数值。如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存,如果浮点数值本身就是一个整数,(如:10.0),那么该值也会被转换成为整数。

    例如:

    var floatNum1 = 1.;   //小数点后面没有数字,解析为 1
    var floatNum2 = 10.0;  // 整数  解析为10 

    需要注意的是,浮点数值的最高精度是17位小数,但在进行计算时其精度远远不如整数。例如:0.1 + 0.2 的结果不是 0.3,而是 0.30000000000000004,这个小小的舍入误差可能会导致无法测试特定的浮点数值。

    例如:

    if( a + b == 0.3){    //不要做这样的测试
        alert('you got 0.3');  
    }

    永远不要测试某个特定的浮点数值!

      2.数值范围

       由于内存的限制,ECMAScrip并不能保存世界上所有的数值,能够表示的最小数值保存在 Number.MIN_VALUE 中,在大多数的浏览器中,这个值是 5e-324;能够保存最大数值保存在Number.MAX_VALUE 中,在大多数浏览器中,这个值是 1.7976931348623157e+308,如果某次计算超出了JavaScript 数值的计算范围,那么这个数值将会自动转换成特殊的 Infinity 值,这个值是负数的话,则会被转换成 -Infinity ,如果是正值的话,则会被转换成 Infinity 。如果某次计算返回了 Infinity ,是不能进行下次计算的。

      3.NaN

        NaN,即非数值(Not a Number),这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。在其他语言中任何数值除以非数值都会报错,停止代码运行,而在JavaScript中,任何数值除以非数值都会返回 NaN ,因此不会影响其他代码执行。

        NaN 本身有两个特点,1.任何涉及NaN的操作都会返回 NaN。2.NaN与任何值都不相等,包括 NaN, 所以  NaN == NaN //false ,针对NaN的这两个特点,ECMAScript定义了 isNaN() 函数,该函数接受一个参数,参数可以使任何类型,而函数会帮我们判断这个参数是否“”不是数值”,isNaN()函数在接受到一个值后,会尝试将这个值转换成为数值,某些不是数值的值会直接转换为数值。

    例如:

    alert( isNaN(NaN) );      //true
    alert( isNaN(10) );       //false (10 是一个数值)
    alert( isNaN("10") );     //false (被转换成数值)
    alert( isNaN("hello") );  //true (不能被转换)
    alert( isNaN(true) );     //false  (可以被转换成数值1)

      4.数值转换 

        有三个函数可以把非数值转换为数值:Number(),parseInt(),parseFloat()。第一个函数,即转型函数Number() 可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这三个函数对于同样的输入会有返回不同的结果。

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

      1.如果是Boolean值,true 和 false 分别转换成 1 和 0 

      2.如果是数字,只是简单地传入和返回

      3.如果是null值,返回 0 

      4.如果是undefined,返回NaN

      5.如果是字符串,会有如下几种情况:

        5.1 如果字符串只包含数字,则将其转换为十进制数值,如果整数值前面带 0 ,则 0 会被忽略

        5.2 如果字符串中包含有效的浮点格式,如 “1.1”,则将其转换成对应的浮点数值

        5.3 如果字符串中包含有效的十六进制格式,同样会转为相同大小的十进制格式

        5.4 如果是空字符串,则将其转换为 0 

        5.5 如果字符串中包含除上述以外的字符,则将其转换为 NaN

      由于Number() 函数在转换字符串时比较复杂切不够合理,因此在处理整数的时候更多的用 parseInt() 函数,parseInt() 函数在转换字符串时,更多的是看其是否符合数值模式,他会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字或者负号,parseInt() 函数就会返回NaN。

    例如:

    var num1 = parseInt("1234abcd");  //1234
    var num2 = parseInt("");          //NaN
    var num3 = parseInt("0xA");       //10 (十六进制)
    var num4 = parseInt("22.5");      //22

      与 parseInt() 函数类似,parseFloat() 也是从第一个字符开始解析每个字符,一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止,也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。以下是使用parseFloat() 转换的例子:

    var num1 = parseFloat("1234abcd");  //1234
    var num2 = parseFloat("0xA");       //0 
    var num3 = parseFloat("22.5");      //22.5
    var num4 = parseFloat("22.5.4");    //22.5
    • String 类型

      String 类型用于表示由零或多个16位Unicode字符组成的字符序列,简称就是 “字符串”,字符串可以由双引号(“”)或者单引号(‘’)表示, var nameA = "Jim"var nameA = 'jack'; 这两种写法都是有效的。在ECMAScript中这两种语法形式没什么区别,单引号和双引号表示的字符串完全相同,不过以什么开头的就必须以什么作为结尾,否则会报语法错误。

      1.字符字面量

        String数据类型包含一些特殊的字符字面量,也叫转义序列(转义符),用于表示非打印字符,或具有其他用途的字符。

    (图片来自百度百科 )

    这些字符串字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析。

    例如: var text = "This is the letter sigma: u03a3.";  这个例子中的 text 变量共有28个字符,但是6个字符长的转义序列表示为 1 个字符。

    任何字符串的长度都可以通过访问其 length 属性取得,例如  alert(text.length); //输出28 。

      2.字符串的特点

      ECMAScript中的字符串时不可变的,字符串一旦创建,他们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充改变量。

    例如:

    var lang = "Java";
    lang = lang + "Script";

    "Java" 与 "Script" 都会被销毁,重新定义的结果为 "JavaScript"。

      3.转换为字符串

        要把一个值转换为字符串有两种方式,第一种是使用每个值都有的 toString()方法。

    例如:

    var age  = 11 ;
    var ageAsString = age.toString();  //字符串"11"
    var found = true ;
    var foundAsString = found.toString();// 字符串 "true"

    数值,布尔值,对象和字符串值都有toString()方法,但是null和undefined值没有这个放法。

      在不知道要转换的值是不是null或者undefined的时候,还可以用String() ,这个函数能够将任何类型的值转为字符串。

      String()函数遵循以下转换规则:

        1.如果值有toString() 方法,则调用该方法并返回相应的结果

        2.如果值为 null,则返回字符串 "null" 

        3.如果值undefined,则返回字符串 "undefined"

    例如:

    var value1 = 10;
    var value2 = true;
    var value3 = null;
    var value4 ;
    
    alert( String(value1) );  // "10"
    alert( String(value2) );  //"true"
    alert( String(value3) );  //"null"
    alert( String(value4) );  //"undefined"

    这里先后转换了四个值,数值和布尔值的转换结果与调用toString()方法得到的结果相同,因为 null 和 undefined 没有 toString() 方法,所以String()函数就返回了这两个值的字面量。

    完。

    本文参考JS高级程序设计第三章

  • 相关阅读:
    (Java) LeetCode 44. Wildcard Matching —— 通配符匹配
    (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
    (Java) LeetCode 515. Find Largest Value in Each Tree Row —— 在每个树行中找最大值
    (Java) LeetCode 433. Minimum Genetic Mutation —— 最小基因变化
    (Java) LeetCode 413. Arithmetic Slices —— 等差数列划分
    (Java) LeetCode 289. Game of Life —— 生命游戏
    (Java) LeetCode 337. House Robber III —— 打家劫舍 III
    (Java) LeetCode 213. House Robber II —— 打家劫舍 II
    (Java) LeetCode 198. House Robber —— 打家劫舍
    (Java) LeetCode 152. Maximum Product Subarray —— 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/bfc0517/p/7309484.html
Copyright © 2011-2022 走看看