《JavaScript 高级程序设计(第3版)》学习笔记:第3章基本概念

一、语法

1、区分大小写

2、标识符

  • 第一个字符必须是一个字母、下划线(_)或一个美元符号($);
  • 其他字符可以是字母、下划线、美元符号或数字。

按照惯例,ECMAScript 标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写,例如: 

firstSecond 
myCar 
doSomethingImportant 

3、注释

 1)// 单行注释
 2)块级注释以一个斜杠和一个星号(/*)开头,以一个星号和一个斜杠(*/)结尾,如下所示:
     /* 
      * 这是一个多行
      * (块级)注释
    */ 

      虽然上面注释中的第二和第三行都以一个星号开头,但这不是必需的。之所以添加那两个星号,纯
粹是为了提高注释的可读性。

4、语句

  结束可以用也可以不用分号,推荐用分号。

二、关键字和保留字

关键字:(带*为第5版新增)

break     do       instanceof   typeof 
case      else     new          var 
catch     finally  return       void 
continue  for      switch       while 
debugger* function this         with 
default   if       throw 
delete    in       try 
 

保留字:

abstract   enum       int          short 
boolean    export     interface    static 
byte       extends    long         super 
char       final      native       synchronized 
class      float      package      throws 
const      goto       private      transient 
debugger   implements protected    volatile 
double     import     public 

三、变量

1、 ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用 var 操作符(注意 var 是一个关键字),后跟变量名(即一个标识符),如下所示:

 var message; 


  这行代码定义了一个名为 message 的变量,该变量可以用来保存任何值(像这样未经过初始化的变量,会保存一个特殊的值——undefined

2 、可以在定义时直接初始化:

   var message = "hi"; 

在此,变量 message 中保存了一个字符串值"hi"。像这样初始化变量并不会把它标记为字符串类型;初始化的过程就是给变量赋一个值那么简单。因此,可以在修改变量值的同时修改值的类型,如下:

var message = "hi"; 
message = 100; // 有效,但不推荐

3、 用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。不过,可以像下面这样省略 var 操作符,从而创建一个全局变量:

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

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

4、可以使用一条语句定义多个变量,只要像下面这样把每个变量(初始化或不初始化均可)用逗号分隔开即可:

var message = "hi", 
    found = false, 
    age = 29;

 四、数据类型

1、ECMAScript 中有 5 种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和 String。还有 1种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。ECMAScript不支持任何创建自定义类型的机制,而所有值最终都将是上述 6 种数据类型之一。

2、typeof操作符

对一个值使用 typeof 操作符可能返回下列某个字符串:
 "undefined"——如果这个值未定义;
 "boolean"——如果这个值是布尔值;
 "string"——如果这个值是字符串;
 "number"——如果这个值是数值;
 "object"——如果这个值是对象或 null
 "function"——如果这个值是函数。

如:

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

注:

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

2)调用 typeof null会返回"object",因为特殊值 null 被认为是一个空的对象引用。

3、undefined类型

在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined,例如:
 

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

注:

包含 undefined 值的变量与尚未定义的变量还是不一样的。如:

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

对于尚未声明过的变量(如上age),只能执行一项操作,即使用 typeof 操作符检测其数据类型,会返回undefined。

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

因此我们应该显示的初始化每个变量,这样typeof得到了undefined就说明该变量为未声明。

4、null类型

从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因。

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

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

实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true:
alert(null == undefined); //true 
这里,位于 null 和 undefined 之间的相等操作符(==)总是返回 true。

只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值。

5、boolean类型

1)Boolean 类型的字面值 true 和 false 是区分大小写的。

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

一般用法:

var message = "Hello world!"; 
if (message){ 
 alert("Value is true"); 
} 

字符串 message 被自动转换成了对应的 Boolean 值(true)。由于存在这种自动执行的 Boolean 转换,因此确切地知道在流控制语句中使用的是什么变量至关重要。

6、number类型

不再赘述,需要注意的是:

1)

《JavaScript 高级程序设计(第3版)》学习笔记:第3章基本概念_第1张图片

2)NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以 0都会导致错误,从而停止代码执行。但在 ECMAScript中,任何数值除以 0会返回 NaN,因此不会影响其他代码的执行。
     NaN 本身有两个非同寻常的特点。首先,任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN,这个特点在多步计算中有可能导致问题。其次,NaN 与任何值都不相等,包括 NaN 本身。例如,下面的代码会返回 false:
     alert(NaN == NaN); //false 


    针对 NaN 的这两个特点,ECMAScript 定义了 isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN()在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或 Boolean 值。而任何不能被转换为数值的值都会导致这个函数返回 true。请看下面的例子:

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

3)数值转换

     可以使用的函数Number()、parseInt()和 parseFloat();

 《JavaScript 高级程序设计(第3版)》学习笔记:第3章基本概念_第2张图片

例:

var num1 = Number("Hello world!"); //NaN 
var num2 = Number(""); //0 
var num3 = Number("000011"); //11 
var num4 = Number(true); //1

更常使用的为parseInt()和 parseFloat()

parseInt():它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回 NaN;也就是说,用 parseInt()转换空字符串会返回 NaN(Number()对空字符返回 0)。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

var num1 = parseInt("1234blue"); // 1234 
var num2 = parseInt(""); // NaN 
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22 
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)

//也可以指定基数
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)

parseFloat():也是从第一个字符(位置 0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。

var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0 
var num3 = parseFloat("22.5"); //22.5 
var num4 = parseFloat("22.34.5"); //22.34 
var num5 = parseFloat("0908.5"); //908.5 
var num6 = parseFloat("3.125e7"); //31250000

7、string类型

未完待续

你可能感兴趣的:(《JavaScript 高级程序设计(第3版)》学习笔记:第3章基本概念)