基本概念

组成部分

  Javascript由三部分组成:

    核心(ECMAScript):由语法、类型、语句、关键字、保留子、操作符、对象组成。

    文档对象模型(DOM):针对XML 但经过扩展用于HTML 的应用程序编程接口。

    浏览器对象模型(BOM):开发人员使用BOM 可以控制浏览器显示的页面以外的部分。

数据类型

  ECMAScript 中有5 种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1 种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。

typeof

    函数名不能使用typeof,因为它是一个关键字,但typeOf 则完全可以是一个有效的函数名。

    下面这个例子省略了var 操作符,因而message 就成了全局变量。这样,只要调用过一次test()函数,这个变量就有了定义,就可以在函数外部的任何地方被访问到。

  • function test(){
    message = "hi"; // 全局变量
    }
    test();
    alert(message); // "hi"

    虽然省略var 操作符可以定义全局变量,但这也不是我们推荐的做法。因为在局部作用域中定义的全局变量很难维护,而且如果有意地忽略了var 操作符,也会由于

    相应变量不会马上就有定义而导致不必要的混乱。给未经声明的变量赋值在严格模式下会导致抛出ReferenceError 错误。

  • var message = "some string";
    alert(typeof message); // "string"
    alert(typeof(message)); // "string"
    alert(typeof 95); // "number"

    这几个例子说明,typeof 操作符的操作数可以是变量(message),也可以是数值字面量。注意,typeof 是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。从技术角度讲,函数在ECMAScript 中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof 操作符来区分函数和其他对象是有必要的。

  • var message; // 这个变量声明之后默认取得了undefined 值
    // 下面这个变量并没有声明
    // var age
    alert(message); // "undefined"
    alert(age); // 产生错误

    运行以上代码,第一个警告框会显示变量message 的值,即"undefined"。而第二个警告框——由于传递给alert()函数的是尚未声明的变量age——则会导致一个错误。对于尚未声明过的变量,只能执行一项操作,即使用typeof 操作符检测其数据类型(对未经声明的变量调用delete 不会导致错误,但这样做没什么实际意义,而且在严格模式下确实会导致错误)。

    var message; // 这个变量声明之后默认取得了undefined 值
    // 下面这个变量并没有声明
    // var age
    alert(typeof message); // "undefined"
    alert(typeof age); // "undefined"

    对未初始化和未声明的变量执行typeof 操作符都返回了undefined 值;这个结果有其逻辑上的合理性。因为虽然这两种变量从技术角度看有本质区别,但实际上无论对哪种变量也不可能执行真正的操作。

    即便未初始化的变量会自动被赋予undefined 值,但显式地初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof 操作符返回"undefined"值时,我们就知道被检测的变量还没有被声明,而不是尚未初始化。

undefined

  undefined 值是派生自null 值的,因此ECMA-262 规定对它们的相等性测试要返回true。无论在什么情况下都没有必要把一个变量的值显式地设置为undefined,可是同样的规则对null 却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null 值。这样做不仅可以体现null 作为空对象指针的惯例,而且也有助于进一步区分null 和undefined。

null

  null 值表示一个空对象指针,使用typeof操作符检测null 值时会返回"object"。

boolean

  Boolean类型只有两个字面值:true 和false,且区分大小写。

number

  浮点数值的最高精度是17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加0.2的结果不是0.3,而是0.30000000000000004。不要测试某个特定的浮点数值。

  关于浮点数值计算会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754 数值的浮点计算的通病,ECMAScript 并非独此一家;其他使用相同数值格式的语言也存在这个问题。

  NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。0 除以0 会返回NaN,正数除以0 返回Infinity,负数除以0 返回-Infinity。NaN 本身有两个非同寻常的特点。首先,任何涉及NaN 的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN 与任何值都不相等,包括NaN 本身。

String

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

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

    以上示例中的变量lang 开始时包含字符串"Java"。而第二行代码把lang 的值重新定义为"Java"与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳10 个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。这个过程是在后台发生的。

函数

  ECMAScript 中的参数在内部是用一个数组来表示的。在函数体内可以通过arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。arguments 对象只是与数组类似(它并不是Array 的实例)。

  ECMAScirpt函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。

posted on 2015-08-15 15:07  路灯Evan  阅读(133)  评论(0编辑  收藏  举报