第三章 基本概念

语法

ECMAScript的语法大量借鉴了C及其他类C语言的语法。

区分大小写

ECMAScript中的一切(变量、函数名和操作符)都区分大小写。

标识符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。
命名规则:

  • 第一个字符必须是一个字母、下划线(_)或一个美元符号($);
  • 其他字符可以是字母、下划线、美元符号或数字。
    按照惯例,ECMAScript标识符采用驼峰小写格式,也就是第一个字母小写,剩下的每个有意义的单词首字母大写。

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

注释

// 单行注释

/*
 * 这是一个多行
 * (块级)注释
 */

严格模式

ECMAScript5引入了严格模式(strict mode)概念。严格模式是为JavaScript定义了一种不同的机械与执行模型。
要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"use strict";
在函数内部的上方包含这条编译指示,也可以指定函数在严格模式下执行:
eg:

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

支持严格模式的浏览器包括IE10+、Firefox 4+、Safari 5.1+、Opera12+和Chrome。

语句

ECMAScript中的语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾。
eg:
var sum = a + b // 即使没有分号也是有效的语句——不推荐
var diff = a - b; // 有效语句——推荐
代码块以左花括号({)开头,以右花括号(})结尾。
请始终在条件控制语句中使用代码块,即使只有一条语句。

关键字和保留字

关键字

    
breakdoinstanceoftypeof
caseelsenewvar
catchfinallyreturnvoid
continueforswitchwhile
debugger*functionthiswith
defaultifthrow 
deleteintry 

保留字

    
abstractenumintshort
booleanexportinterfacestatic
byteextendslongsuper
charfinalnativesynchronized
classfloatpackagethrows
constgotoprivatetransient
debuggerimplementsprotectedvolatile
doubleimportpublic 

第五版把非严格模式下运行时的保留字缩减为下列这些:
class enum extends super const export import
严格模式下,第五版还对以下保留字施加了限制:
implements package public interface private static let protected yidld
使用关键字作为标识符,会导致“Identifier Expected”错误
ECMA-262第五版对eval和arguments还施加了限制。在严格模式下,这两个名字也不能作为标识符或属性名,否则会抛出错误。

变量

ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。
定义变量时要使用var操作符:
var message = "hi";
不建议修改变量所保存值的类型,虽然这种操作有效
省略var操作符,将定义一个全局变量

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

可以使用一条语句定义多个变量,用逗号分隔。

数据类型

5种简单数据类型:Undefined、Null、Boolean、Number和String。
1种复杂数据类型——Object。(Object本质上由一组无序的名值对组成)

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"

typeof是一个操作符而不是函数

从技术角度将,函数在ECMAScript中是对象,而不是一种数据类型。同时,函数也确实具有一些特殊的属性,因此,需要使用typeof操作符来区分函数和对象。

Undefined类型

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

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

不需要显示地将一个变量设置为undefined值,这个字面量的主要用途是用于比较,在第三版之前并没有规定这个变量,第三版之后引入这个值是为了区分空对象指针与未经初始化的变量

undefined≠尚未定义的变量
使用未定义的变量将产生错误。但对未初始化和未声明的变量使用typeof操作符都将返回"undefined"。

Null类型

Null类型是第二个只有一个值的数据类型,这个特殊值是null。表示一个空对象指针。使用typeof操作符将返回object。
undefined值是派生自null值的,因此null == undefined将返回true。

Boolean类型

该类型只有两个字面值:true和false。
将一个值转换为对应的Boolean值,可以使用函数Boolean()。

数据类型转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串""(空字符串)
Number任何非零数字值(包括无穷大)0和NaN
Object任何对象null
Undefinedn/aundefined

Number类型

八进制字面量在严格模式下是无效的,会导致支持的JavaScript引擎抛出错误。
十进制: var intNum = 55; //整数
八进制: var octalNum = 070; //八进制的56
十六进制: var hexNum = 0xA; //十六进制的10
八进制字面量在严格模式下是无效的,会导致支持的JavaScript引擎抛出错误。
在进行算术计算时,素有的八进制和十六进制都会转换成十进制。

JavaScript中可以保存正零(+0)和负零(-0),切被认为是相等的。

浮点数

定义:数值中必须包含一个小数点,并且小数点后面必须至少有一个数字。
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; //有效,但不推荐这么写
ECMAScript会自动将浮点数值转换为整数,如果这个数小数点后没有任何数字,或者数值本身表示的就是一个整数。
e表示法: var floatNum = 3.125e7; //等于31250000
ECMAScript会将小数点后面带有6个零以上的浮点数值转换为e表示法表示的数值(例如,0.0000003会被转换成3e-7)。
浮点数值的最高精度是17位小数,但在进行算术计算时其精度远远不如整数。这是因为浮点数值计算会产生舍入误差的问题,因此永远不要测试浮点数值的相等性。

数值范围

ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中,能够表示的最大数值保存在Number.MAX_VALUE中。
超出范围的数值将会自动转换成特殊的Infinity值,如果这个数是负数,则会转换为-Infinity(负无穷大),并且该值不能够参与计算。
isFinite()函数可以测试一个数是否有穷。
Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY分别表示正无穷大和负无穷大。

NaN

NaN,即非数值(Not a Numnber)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回任何数值的情况。
ECMAScript中任何数值除以0都会返回NaN,因此不会抛出错误影响代码的执行。
1. 任何实际NaN的操作都会返回NaN
2. NaN与任何数值都不相等,包括NaN本身。

isNaN()函数可以确定一个参数是否“不是数值“。

isNaN()函数也适用于对象,如果参数是对象时,会首先调用对象的valueOf()犯法,然后确定该方法返回的值是否可以转换为数值。如果不能转换为数值,则基于这个返回值再调用toString()方法,再测试返回值。

数值转换

Number()、parseInt()和parseFloat()可以把非数值转换为数值。
Number()可以用于任何数据类型,parseInt()和parseFloat()专门用于把字符串转换为数值。
Number()函数转换规则:

  • 如果是Boolean值,true和false分别转换为1和0.
  • 数值是数字值,只是简单的传入和返回
  • 如果是null值,返回0
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循下列规则:
    • 如果字符串只包含数字(包括前面带正负号的情况),则将其转换为十进制数值(忽略前导零)。
    • 如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值(忽略前导零)。
    • 如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制数值。
    • 如果字符串是空的,则将其转换为0。
    • 如果字符串中包含除上述格式之外的字符,则将其转换为NaN。
  • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
    parseInt()函数会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字字符或者负号,就会返回NaN,所以parseInt()转换空字符串会返回NaN,如果第一个字符是数字字符,则会继续解析,知道解析完所有后续字符或者遇到了一个非数字字符。
    parseInt()机械八进制字面量的字符串时,ECMAScript3和5存在分歧,5中parseInt()不具有解析八进制值的能力。
    可以为parseInt()传递第二个参数明确指定基数。
    parseFloat()也是从第一个字符开始解析每个字符,而且也是一直解析到字符串末尾,或者解析到遇见第一个无效的浮点数字字符为止。所以,第一个小数点是有效的,而第二个小数点就是无效的了。
    parseFloat()函数只能解析十进制值,没有第二个参数。

String类型

用于表示由零或多个16位Unicode字符组成的字符序列。可以由双引号或单引号表示。

字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符。

字符串的特点

  • 字符串是不可变的。

转换为字符串

每个值都有一个toString()方法,返回其字符串表示形式。
还可以使用转型函数String()。

Object类型

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

操作符

一元操作符

只能操作一个值的操作符叫一元操作符。

  1. 递增和递减操作符
    递增和递减操作符各有两个版本:前置型和后置型。执行前置操作时,变量的值都是在语句被求值以前改变的(在计算机科学领域,这种情况通常被称作副反应。)。
    var age = 29;
    ++age;
    /* 以上操作等同于以下操作 */
    var age = 29;
    age = age + 1;

后置型递增和递减操作是在包含他们的瑜伽女被求值之后才执行的。
eg:

    var num1 = 2;
    var num2 = 20;
    var num3 = num1-- + num2;           //等于22
    var num4 = num1 + num2;             //等于21

递增和递减操作符可以用于任何值,遵循以下规则:
* 在应用一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
* 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
* 在应用于布尔值false时,先将其转换为0再执行加减1的操作。布尔变量变成数值变量。
* 在应用于布尔值true时,先将其转换为1再执行加减1的操作。布尔变量变成数值变量。
* 在应用于浮点数时,执行加减1的操作。
* 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则。对象变量变成数值变量。

一元加和减操作符

对非数值应用一元加减操作符时,该操作符会像Number()转型函数一样对这个值执行转换。

位操作符

ECMAScript中的所有数值都以IEEE~754 64位格式存储,但位操作符并不直接操作64位的值,而是先将64位的值转换成32位的整数,然后执行操作,最后再将结果转换回64位。
对于有符号的整数,32位中的前31位用于表示整数的值,第32位用于表示数值的符号:0表示整数,1表示负数,这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。
负数使用的格式是二进制补码,计算一个数值的二进制补码,需要经过下列3个步骤:
(1)求这个数值绝对值的二进制码
(2)求二进制的反码,即将0替换成1,将1替换成0
(3)得到的二进制反码加1
eg:求-18的二进制码方法如下:

按位非(NOT)

按位非操作由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。
按位非操作的本职:操作数的负值减1.

按位与(AND)

按位与操作符由一个和号字符(&)表示,它由两个操作符数。从本质上讲,按位与操作就是将两个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行AND操作。

第一个数值的位第二个数值的位结果
111
100
010
000

按位或(OR)

按位或操作符由一个竖线符号(|)表示,有两个操作数。遵循如下真值表。

第一个数值的位第二个数值的位结果
111
101
011
000

按位异或(XOR)

按位异或操作符由一个插入符号(^)表示,也有两个操作数,真值表如下:

第一个数值的位第二个数值的位结果
110
101
011
000

左移

左移操作符由两个小于号(<<)表示,将数值的所有位向左移动指定的位数,右侧以0填充。
左移操作不会影响操作数的符号位。

有符号的右移

有符号的右移操作符由两个大于号(>>)表示,将数值向右移动,但保留符号位,左侧以符号位填充。

无符号右移

无符号右移操作符由3个大于号(>>>)表示,这个操作会将数值的所有32位都向右移动,无符号右移以0来填充空位。

布尔操作符

逻辑非

逻辑非操作符由一个叹号(!)表示,可以应用于ECMAScript中的任何值,这个操作都会返回一个布尔值。

逻辑与

逻辑与操作符由两个和号(&&)表示,有两个操作数。

逻辑或

逻辑或操作符由两个竖线符号(||)表示,有两个操作数

关系操作符

比较规则:
* 如果两个操作数都是数值,则执行数值比较
* 如果连个操作数都是字符串,则比较两个字符串对应的字符编码值。
* 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
* 如果一个操作数是对象,则调用这个对象的valueOf()方法,用的到的结果按照前面的规则执行比较。
* 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

条件操作符

语法形式:
variable = boolean_expression ? true_value : false_value;

语句

语句通常使用一或多个关键字来完成给定任务。

if语句

语法:
if (condition) statement1 else statement2

do-while语句

语法:
do {
statement
} while (expression);
用于循环体重的代码至少要执行一次的情形。

while语句

语法:
while (expression) statment

for语句

语法:
for (initialization; expression; post-loop-expression) statement

for-in语句

语法:
for (property in expression) statement

label语句

语法:
label: statement
使用label语句在代码中添加标签,以便将来使用。

break和continue语句

break语句会立刻退出循环,强制执行循环后面的语句。continue也会退出当前循环,从循环的顶部继续执行。

with语句

作用是将代码的作用域设置到一个特定的对象中。
语法:
with (expression) statement;

函数

ECMAScript中的函数使用function关键字来声明,后跟一组参数以及函数体。
语法:
function functionName (arg0, arg1, ……,argN) {
statements
}
ECMAScript中的函数在定义时不必指定是否返回值。
严格模式对函数有一些限制:

  • 不能把函数命名为eval或arguments;
  • 不能把参数命名为eval或arguments;
  • 不能出现两个命名参数同名的情况。

理解参数

ECMAScript函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。
在函数体内可以通过arguments对象来访问参数数组,从而获取传递给函数的每一个参数。
在ECMAScript中,命名的参数只提供便利,但不是必须的。
没有传递值的命名参数将自动被赋予undefined值。

没有重载

如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值