JavaScript基本概念(一)

一、语法

  (省略已知内容)

1.标识符命名规范

  驼峰大小写格式——第一个字母小写,剩下每个单词首字母大写。如:

  firstSecond, myCar, doSomethingImportant...

  一些保留函数的命名已按照此规范:toString, ...

2.严格模式

  严格模式是为JavaScript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript 3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加如下代码:

  "use strict";

  这行代码看起来像是字符串,而且也没有赋值给任何变量,但其实它是一个编译指示(pragma),用于告诉支持的JavaScript引擎切换到严格模式。这是为不破坏ECMAScript 3语法而特意选定的语法。 在函数内部的上方包含这条编译指示,也可以指定函数在严格模式下执行:

function doSomething(){ 
    "use strict"; 
    //函数体 
} 

  严格模式下,JavaScript的执行结果会有很大不同,因此本书将会随时指出严格模式下的区别。支持严格模式的浏览器包括IE10+、Firefox 4+、Safari 5.1+、Opera 12+和Chrome。

二、变量

  变量为松散类型——可用于保存任意类型的数据。也就是说, 每个变量仅仅是一个用于保存值得占位符而已。

var message;

  像这种未经过初始化的变量会保存一个特殊值——undefined。

  变量作用域  全局  局部, 局部变量将在函数退出后被销毁。但省略var, 可创建全局变量:

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

  只要test函数被调用至少一次,message就成为全局变量。

  *虽然省略var操作符可以定义全局变量,但这也不是推荐的做法。因为在局部作用域中定义的全局变量很难维护,而且如果有意地忽略了var操作符,也会由于
相应变量不会马上就有定义而导致不必要的混乱。给未经声明的变量赋值在严格模式下会导致抛出ReferenceError错误。

  一次定义多个变量:  var  message = "hi",  found = false,  age = 29;

三、数据类型

  鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof就是负责提供这方面信息的操作符。对一个值使用typeof操作符可能返回下列某个字符串:

  •  "undefined"——如果这个值未定义;
  •  "boolean"——如果这个值是布尔值;
  •  "string"——如果这个值是字符串;
  •  "number"——如果这个值是数值; 
  •  "object"——如果这个值是对象或null; 
  •  "function"——如果这个值是函数。

  alert(typeof message); // "string"
  alert(typeof(message)); // "string"
  alert(typeof 95); // "number"

  这几个例子说明,typeof操作符的操作数可以是变量(message),也可以是数值字面量。注意,typeof是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。

  有些时候,typeof操作符会返回一些令人迷惑但技术上却正确的值。比如,调用typeof null会返回"object",因为特殊值null被认为是一个空的对象引用。Safari 5及之前版本、Chrome 7及之前版本在对正则表达式调用typeof操作符时会返回"function",而其他浏览器在这种情况下会返回"object"。

Undefined类型

  Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,例如: 

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

  这个例子只声明了变量message,但未对其进行初始化。比较这个变量与undefined字面量,结果表明它们是相等的。这个例子与下面的例子是等价的: 

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

  不过,包含undefined值的变量与尚未定义的变量还是不一样的。看看下面这个例子:

var message; // 这个变量声明之后默认取得了undefined值 

// 下面这个变量并没有声明 
// var age 

alert(message); // "undefined" 
alert(age); // 产生错误 

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

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

 Null类型

  Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"object"的原因,如下面的例子所示:

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

  如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。这样一来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:

if (car != null){ 
// 对car对象执行某些操作 
} 

  实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true: 

alert(null == undefined); //true

  这里,位于null和undefined之间的相等操作符(==)总是返回true,不过要注意的是,这个操作符出于比较的目的会转换其操作数(本章后面将详细介绍相关内容)。
  尽管null和undefined有这样的关系,但它们的用途完全不同。如前所述,无论在什么情况下都没有必要把一个变量的值显式地设置为undefined,可是同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,而且也有助于进一步区分null和undefined。

 

(未完待续)

posted @ 2017-10-10 11:00  Exps幻想  阅读(42)  评论(0)    收藏  举报