JavaScript基础---语言基础(1)

写在前面:

通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉。在完成这三篇博客(JavaScript基础---语言基础)之后,JS基础部分的博客也算告一段落。接下来的一段时间,想把最近看的一些书分类整理一下(包括CSS,JS,AJAX,jQuery源码,D3,Nodejs基础等内容)。

 

语法、关键保留字及变量

学习要点:

1.语法结构

2.关键字和保留字

3.变量

 

任何语言的核心都必然会描述这门语言最基本的工作原理。而JavaScript的语言核心就是ECMAScript,而目前用的最普遍的是第3版。

一.语法构成

 

区分大小写

ECMAScript中的一切,包括变量、函数名和操作符都是区分大小写的。例如:text和Text表示两种不同的变量。

 

标识符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。标识符可以是下列格式规则组合起来的一或多个字符:

1.第一字符必须是一个字母、下划线(_)或一个美元符号($)。

2.其他字符可以是字母、下划线、美元符号或数字。

3.不能把关键字、保留字、true、false和null作为标识符。

例如:myName、book123等

 

直接量(字面量literal)

所有直接量(字面量),就是程序中直接显示出来的数据值。

100                       //数字字面量

'张三'                    //字符串字面量

false                      //布尔字面量

/js/gi                     //正则表达式字面量

null                       //对象字面量

 

在ECMAScript第3版中,像数组字面量和对象字面量的表达式也是支持的,如下:

{x:1, y:2}              //对象字面量表达式

[1,2,3,4,5]             //数组字面量表达式

 

二.关键字和保留字

 

ECMAScript-262描述了一组具有特定用途的关键字,一般用于控制语句的开始或结束,或者用于执行特定的操作等。关键字也是语言保留的,不能用作标识符。

 

ECMAScript全部关键字

 

break

else

new

var

case

finally

return

void

catch

for

switch

while

continue

function

this

with

default

if

throw

 

delete

in

try

 

do

instanceof

typeof

 

 

ECMAScript-262还描述了另一组不能用作标识符的保留字。尽管保留字在JavaScript中还没有特定的用途,但它们很有可能在将来被用作关键字。

 

ECMAScript-262第3版定义的全部保留字

 

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

 

 

 

三.变量

ECMAScript的变量是松散类型的,所谓松散类型就是用来保存任何类型的数据。声明变量时要使用var操作符(var是关键),后面跟一个变量名(变量名是标识符)。

var box;

alert(box);      //undefined

 

这句话定义了box变量,但没有对它进行初始化(也就是没有给变量赋值)。这时,系统会给它一个特殊的值 -- undefined(表示未定义)

var box= '张三';

alert(box);

 

所谓变量,就是可以初始化后可以再次改变的量。ECMAScript属于弱类型(松散类型)的语言,可以同时改变不同类型的量。(PS:虽然可以改变不同类型的量,但这样做对于后期维护带来困难,而且性能也不高,导致成本很高!)

var boxString = '张三';

boxString = 100;         //不建议这样做!

alert(boxString);

 

重复的使用var声明一个变量,只不过是一个赋值操作,并不会报错。但这样的操作没有任何必要。

var box= '张三';

var box= 'Alex';     //这样做完全没有必要!

 

还有一种变量不需要前面var关键字即可创建变量。这种变量和var声明的变量有一定的区别和作用范围(全局范围)。

box= '张三';        //没有var关键字

 

当你想声明多个变量的时候,可以在一行或者多行操作。

var box= '张三'; var age= 100;      //分号隔开

 

而当你每条语句都在不同行的时候,你可以省略分号。(PS:这是ECMAScript支持的,但绝对是一个非常不好的编程习惯,切记不要这样做)。

var box= '张三'

var age= 100

alert(box)

 

可以使用一条语句定义多个变量,只要把每个变量(初始化或者不初始化均可)用逗号分隔开即可,为了可读性,每个变量,最好另起一行,并且第二变量和第一变量对齐(PS:这些都不是必须的,只是一种良好的编程习惯)。

var box= '张三',

     age = 28,

     height;

 

 

  

 数据类型

学习要点:

1.typeof操作符

2.Undefined类型

3.Null类型

4.Boolean类型

5.Number类型

6.String类型

7.Object类型

 

 

ECMAScript中有5种简单数据类型Undefined、Null、Boolean、Number和String。还有一种复杂数据类型——Object

ECMAScript不支持任何创建自定义类型的机制,所有值都成为以上6中数据类型之一。

一.typeof操作符

typeof操作符是用来检测变量的数据类型。对于值或变量使用typeof操作符会返回如下字符串

 

字符串

描述

undefined

未定义

boolean

布尔值

string

字符串

number

数值

object

对象或null

function

函数

 

var box = '张三';

alert(typeof  box);

alert(typeof  '张三');

 

typeof操作符可以操作变量,也可以操作字面量。虽然也可以这样使用:typeof(box),但是typeof是操作符而非内置函数

PS:函数在ECMAScript中是对象,不是一种数据类型。所以,使用typeof来区分function和object是非常有必要的。

  

二.Undefined类型

Undefined类型只有一个值,即特殊的undefined。

在使用var声明变量,但没有对其初始化时,这个变量的值就是undefined。

var box;

alert(box);

PS:我们没有必要显式的给一个变量赋值为undefined,因为没有赋值的变量会隐式的(自动的)赋值为undefined;而undefined主要的目的是为了用于比较,ECMAScript第3版之前并没有引入这个值,引入之后为了正式区分空对象(null)与未经初始化(undefined)的变量

 

未初始化的变量与根本不存在的变量(未声明的变量)也是不一样的。

var box;

alert(age);   //age is not defined

PS:如果typeof box,typeof age都返回的undefined。从逻辑上思考,他们的值,一个是undefined,一个报错;但他们的类型却都是undefined。所以,我们在定义变量的时候,尽可能的不要只声明不赋值。

 

 

三.Null类型

Null类型是一个只有一个值的数据类型,即特殊的值null。它表示一个空对象引用(指针),而typeof操作符检测null会返回object。

var box = null;

alert(typeof box);       //object

 

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null。这样,当检查null值就知道是否已经变量是否已经分配了对象引用了。

var box = null;

if (box != null) {

       alert('box对象已存在!');

}

 

PS:undefined是派生自null的,因此ECMA-262规定对它们的相等性测试返回true。

alert(undefined == null);

 

由于undefined和null两个值的比较是相等的,所以,未初始化的变量(undefined)和赋值为null的变量会相等这时,可以采用typeof变量的类型进行比较。建议还是养成良好的编码规范,不要忘记初始化变量

var box;

var car = null;

alert(typeof box == typeof car)      //true

 

四.Boolean类型

Boolean类型有两个值(字面量):true和false。而true不一定等于1,false不一定等于0。JavaScript是区分大小写的,True和False或者其他都不是Boolean类型的值。

var box = true;

alert(typeof box);

 

然Boolean类型的字面量只有true和false两种,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,可以使用转型函数Boolean()

var hello = 'Hello World!';

var hello2 = Boolean(hello);

alert(typeof hello);

 

上面是一种显示转换,属于强制性转换。而实际应用中,还有一种隐式转换。比如,在if条件语句里面的条件判断,就存在隐式转换。

var hello = 'Hello World!';

if (hello) {

       alert('如果条件为true,就执行我这条!');

} else {

       alert('如果条件为false,就执行我这条!');

}

 

以下是其他类型转换成Boolean类型规则 

数据类型

转换为true的值

转换为false的值

Boolean

true

false

String

任何非空字符串

空字符串

Number

任何非零数字值(包括无穷大)

0和NaN

Object

任何对象

null

Undefined

 

undefined

 

 

五.Number类型

Number类型包含两种数值:整型和浮点型。为了支持各种数值类型,ECMA-262定义了不同的数值字面量格式。

最基本的数值字面量是十进制整数。

var box = 100;                     //十进制整数

 

八进制数值字面量(以8为基数),前导必须是0,八进制序列(0~7)。

var box = 070;                     //八进制,56

var box = 079;                     //无效的八进制,自动解析为79

var box = 08;                //无效的八进制,自动解析为8

 

十六进制字面量前面两位必须是0x,后面是(0~9及A~F)。

var box = 0xA;             //十六进制,10

var box = 0x1f;             //十六进制,31

 

浮点类型,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字

var box = 3.8;

var box = 0.8;

var box = .8;                 //有效,但不推荐

 

由于保存浮点数值需要的内存空间比整型数值大两倍,因此ECMAScript会自动将可以转换为整型的浮点数值转成为整型。如下

var box = 8.;                 //小数点后面没有值,转换为8

var box = 12.0;             //小数点后面是0,转成为12

 

对于那些过大或过小的数值,可以用科学技术法来表示(e表示法)。用e表示该数值的前面10的指数次幂。

var box = 4.12e9;             //即4120000000

var box = 0.00000000412;    //即4.12e-9   小数点右移九位

 

虽然浮点数值的最高精度是17位小数,但算术运算中可能会不精确。由于这个因素,做判断的时候一定要考虑到这个问题(比如使用整型判断)

alert(0.1+0.2);                     //0.30000000000000004

 

浮点数值的范围在:Number.MIN_VALUE ~ Number.MAX_VALUE之间。

alert(Number.MIN_VALUE);                     //最小值

alert(Number.MAX_VALUE);             //最大值

 

如果超过了浮点数值范围的最大值或最小值,那么就先出现Infinity(正无穷)或者-Infinity(负无穷)

var box = 100e1000;                           //超出范围,Infinity

var box = -100e1000;                         //超出范围,-Infinity

 

也可能通过Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY得到Infinity(正无穷)及-Infinity(负无穷)的值。

alert(Number.POSITIVE_INFINITY); //Infinity(正无穷)

alert(Number.NEGATIVE_INFINITY);//-Infinity(负无穷)

 

要想确定一个数值到底是否超过了规定范围,可以使用isFinite()函数。如果没有超过,返回true,超过了返回false。

var box = 100e1000;

alert(isFinite(box));                                   //返回false或者true

 

NaN,即非数值(Not a Number)是一个特殊的值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)比如,在其他语言中,任何数值除以0都会导致错误而终止程序执行。但在ECMAScript中,会返回出特殊的值,因此不会影响程序执行。

var box = 0 / 0;                           //NaN

var box = 12 / 0;                         //Infinity

var box = 12 / 0 * 0;                    //NaN

 

可以通过Number.NaN得到NaN值,任何与NaN进行运算的结果均为NaN,NaN与自身不相等(NaN不与任何值相等)

alert(Number.NaN);                     //NaN

alert(NaN+1);                             //NaN

alert(NaN == NaN)                            //false

 

ECMAScript提供了isNaN()函数,用来判断这个值到底是不是NaN。isNaN()函数在接收到一个值之后,会尝试将这个值转换为数值。

alert(isNaN(NaN));                       //true

alert(isNaN(25));                         //false,25是一个数值

alert(isNaN('25'));                        //false,'25'是一个字符串数值,可以转成数值

alert(isNaN('Lee'));                      //true,'Lee'不能转换为数值

alert(isNaN(true));                       //false      true可以转成成1

 

isNaN()函数也适用于对象。在调用isNaN()函数过程中,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

var box = {

       toString : function () {

              return '123';                  //可以改成return 'Alex'查看效果

       }

};

alert(isNaN(box));                       //false     

 

有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()

Number()函数是转型函数,可以用于任何数据类型,而另外两个则专门用于把字符串转成数值。

alert(Number(true));                    //1,Boolean类型的true和false分别转换成1和0

alert(Number(25));                      //25,数值型直接返回

alert(Number(null));                    //0,空对象返回0

alert(Number(undefined));           //NaN,undefined返回NaN

 

如果是字符串,应该遵循以下规则:

1.只包含数值的字符串,会直接转成成十进制数值,如果包含前导0,即自动去掉。

alert(Number('456'));                   //456

alert(Number('070'));                   //70

 

2.只包含浮点数值的字符串,会直接转成浮点数值,如果包含前导和后导0,即自动去掉。

alert(Number('08.90'));                //8.9

 

3.如果字符串是空,那么直接转成0

alert(Number(''));                        //0

 

4.如果不是以上三种字符串类型,则返回NaN。

alert(Number('Lee123'));                            //NaN

 

5.如果是对象,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果转换的结果是NaN,则基于这个返回值再调用toString()方法,再测试返回值。

var box = {

       toString : function () {

              return '123';                  //可以改成return 'Lee'查看效果

       }

};

alert(Number(box));                    //123

 

由于Number()函数在转换字符串时比较复杂且不够合理,因此在处理整数的时候更常用的是parseInt()

alert(parsetInt('456Lee'));             //456,会返回整数部分

alert(parsetInt('Lee456Lee'));        //NaN,如果第一个不是数值,就返回NaN

alert(parseInt('12Lee56Lee'));        //12,从第一数值开始取,到最后一个连续数值结束

alert(parseInt('56.12'));                 //56,小数点不是数值,会被去掉

alert(parseInt(''));                         //NaN,空返回NaN

 

parseInt()除了能够识别十进制数值,也可以识别八进制和十六进制。

alert(parseInt('0xA'));                   //10,十六进制

alert(parseInt('070'));                   //56,八进制

alert(parseInt('0xALee'));              //10,十六进制,Lee被自动过滤掉

 

ECMAScript为parseInt()提供了第二个参数,用于解决各种进制的转换。

alert(parseInt('0xAF'));                 //175,十六进制

alert(parseInt('AF',16));                //175,第二参数指定十六进制,可以去掉0x前导

alert(parseInt('AF'));                    //NaN,理所当然

alert(parseInt('101010101',2));      //314,二进制转换

alert(parseInt('70',8))                   //56,八进制转换

 

parseFloat()是用于浮点数值转换的,和parseInt()一样,从第一位解析到非浮点数值位置。

alert(parseFloat('123Lee'));           //123,去掉不是别的部分

alert(parseFloat('0xA'));               //0,不认十六进制

alert(parseFloat('123.4.5'));           //123.4,只认一个小数点

alert(parseFloat('0123.400'));        //123.4,去掉前后导

alert(parseFloat('1.234e7'));          //12340000,把科学技术法转成普通数值

 

六.String类型

 

String类型用于表示由于零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(")或单引号(')表示。

var box = 'Alex';

var box = "Alex";

 

PS:在某些其他语言(PHP)中,单引号和双引号表示的字符串解析方式不同,而ECMAScript中,这两种表示方法没有任何区别。但要记住的是,必须成对出现,不能穿插使用,否则会出错。

var box = 'Alex";                         //混合使用,出错

 

String类型包含了一些特殊的字符字面量,也叫转义序列

 

字面量

含义

\n

换行

\t

制表

\b

空格

\r

回车

\f

进纸

\\

斜杠

\'

单引号

\"

双引号

\xnn

以十六进制代码nn表示的一个字符(0~F)。例:\x41

\unnn

以十六进制代码nnn表示的一个Unicode字符(0~F)。例:\u03a3

 

 

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

var box = 'Mr.';

box = box + ' Lee';

 

toString()方法可以把值转换成字符串。

var box = 11;

var box = true;

alert(typeof box.toString());

 

toString()方法一般是不需要传参的,但在数值转成字符串的时候,可以传递进制参数。

var box = 10;

alert(box.toString());                          //10,默认输出

alert(box.toString(2));                        //1010,二进制输出

alert(box.toString(8));                        //12,八进制输出

alert(box.toString(10));                       //10,十进制输出

alert(box.toString(16));                       //a,十六进制输出

 

如果在转型之前不知道变量是否是null或者undefined的情况下,我们还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。

var box = null;

alert(String(box));

 

PS:如果值有toString()方法,则调用该方法并返回相应的结果;如果是null或者undefined,则返回"null"或者"undefined"。

 

 

七.Object类型

 

ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。

var box = new Object();

Object()是对象构造,如果对象初始化时不需要传递参数,可以不用写括号,但这种方式我们是不推荐的。

var box = new Object;     //不推荐!

 

Object()里可以任意传参,可以传数值、字符串、布尔值等。而且,还可以进行相应的计算。

var box = new Object(2);                  //Object类型,值是2

var age = box + 2;                              //可以和普通变量运算

alert(age);                                          //输出结果,转型成Number类型了

 

既然可以使用new Object()来表示一个对象,那么我们也可以使用这种new操作符来创建其他类型的对象。

var box = new Number(5);                  //new String('Lee')、new Boolean(true)

alert(typeof box);                               //Object类型

 

PS:面向对象是JavaScript课程的重点,这里我们只是简单做个介绍。详见基础部分其他博客。

 

 

Thank you, MR.LEE!

FOR MY LOVER , CC! 

 

 

 

 

 

posted @ 2014-07-11 23:08  努力就有机会  阅读(847)  评论(0编辑  收藏  举报