js高级程序设计-读书记录 ch3

第三章 基本概念

3.1 语法

3.1.1 区分大小写

3.1.2 标识符

指变量、函数、属性的名字,或者函数的参数。,按照惯例使用camelcase。

3.1.3 注释

C风格://&/**/

3.1.4 严格模式(可以理解成异常处理?)

在严格模式下,ECMA中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误

3.1.5 语句

以分号结尾,虽然没有也有效。

3.2 关键字和保留字

3.3 变量

是松散型的,就是可以用来保存任何类型的数据。var message;

未初始化时会保存成“undefined”

不建议修改变量所保存值的类型,虽然有效。

省略var操作符可以定义全局变量,但是不推荐,在严格模式下会抛出错误。

3.4 数据类型 

5种简单数据类型:Undefined, Null, Boolean, Number, String.

也可返回“object”,“function”

3.4.2 undefined类型

typeof操作符

用来检测变量的数据类型。(是一个操作符而不是函数,所以不需要使用括号)

var message;

alert(typeof message);
alert(typeof age);//没有被声明,但是也会返回undefined
所以尽量显式初始化变量吧,就可以知道被检测的变量还没有被声明,而不是尚未初始化。

3.4.3 Null类型

Null值表示一个空对象指针。所以typeof会返回object

实际上,undefined是派生自null的,因此

alert(null==undefined);//true 但是==操作符出于比较目的会转换操作数类型

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

3.4.4 Boolean类型

是ECMA中用得最多的类型。=true/false

可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值。

3.4.5 Number类型

最令人关注的数据类型。

十进制直接写,八进制加个前导0(八进制在严格模式下无效),十六进制加个0x

1.浮点数值

如果某次结果得到了一个超出JAVASCRIPT数值范围的值,那么这个值将被自动转换infinity,而且不能参与下一次的计算。可以使用isFinite函数判断是否是无穷。

NaN即非数值是一个特殊的数值。isNaN,会先用valueOf将其转换成数值。

有三个函数可以把非数值转换为数值:Number(可以用于任何数据类型), parseInte(), parseFloat()(后两个转换字符串)

Number(011)=11(前导零被吃掉),对空字符返回0

parseInt会依次解析字符直到遇到一个非数字字符。parseInt("22.5")=22;

ECMAScript允许parseInt实现把以0(不是0x或0X)开头的字符串解析为八进制或十进制数。也可以加入第二个参数指定进制。

3.4.6 String类型

任何字符串的长度都可以通过访问其length属性取得。

ECMAScript中的字符串是不可变的,一旦创建便不能再更改其值。要改变某个变量保存的字符串,首先要销毁原来的字符串(???)但是可以用加号拼接?

toString()函数转换成字符串,可以添加参数指定转换成的进制数。在不知道要转换的值时都是null或undefined可以使用转型函数String(),它能加任何类型的值(+null+undefined)转换为字符串。比toString更有能力一点点。

3.4.7 Object类型

即是数据和功能的集合,用new创建。var o=new Object();

括号可省(如果不传递参数,但不推荐)。

一个重要思想:在ECMAScript中,Object类型是所有它的实例的基础。

Object的每个实例都具有下列属性和方法:

 ...constructor 构造函数^^

...hasOwnProperty(propertyName)用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。参数必须为字符串

...isPrototypeOf(Object) 用于检查传入的对象是否是另一个对象的原型

...propertyIsNumerable(propertyName)用于检查给定的属性是否能够使用for-in语句来枚举,参数得是字符串。

...toString() 返回对象的字符串表示

...valueOf() 通常与toString的返回值相同。


3.5 操作符

3.5.1 一元操作符

1.递增和递减操作符(和C一致)

前置先自增或自减再执行运算,后置先执行运算。

var o={valueOf : function(){return -1;}};

2.一元加和减操作符

一元减操作符主要用于表示负数。

3.5.2 位操作符

也有按位与或非

3.5.3 布尔操作符(skip)

!0=!false=!null=!NaN=true

逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。

例子:
var found = true;

var result = (found && someUndefinedVariable);//这里会发生错误

alert(result);//这一行不会执行

另一个例子:
var found = false;
var result = (found && someUndefinedVariable);//不会发生错误

alert(result); //false

逻辑或也是短路操作符。如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
一个例子:
var found = true;

var result = (found || someUndefinedVariable); //无错

alert(result); //true

另一个例子:
var found = false;

var result = (found || someUndefinedVariable); //出错

alert(result); //不会执行


可以利用逻辑或的这一行为来避免为变量赋值为null或undefined,例如:
var myObject = preferredObject || backupObject;
变量preferredObject中包含优先赋给变量myObject的值,变值backupObject负责在preferredObject中不包含有效值的情况下提供后备值。如果p的值不是null,那么就用它的值;如果是null,则将b的值赋给myObject。

3.5.4 乘性操作符

/得商%取模

在操作数为非数值的情况下会执行自动的类型转换(使用Number())。

如果一个Infinity与0相乘结果为NaN,与非零相乘是±infinity

3.5.5 加性操作符

和字符串用+的时候,数字会被转换成字符串

和加号不同的是,减法中一个操作数为字符串时,先将该字符串转换为数字。

如果一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefined和null,则分别调用String()函数并取得字符串undefined和null.

3.5.6 关系操作符

<, >, <=

在比较两个字符串时,比较的是两个字符串中对应位置的每个字符的字符编码值。可以用.toLowerCase或.toUpperCase来转换大小写。

如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。

var result="a"<3;//false,因为“a”被转换成了NaN

3.5.7 相等操作符

1.相等和不相等

==&!= 会先转换操作数再比较

null和undefined是相等的。

2.全等和不全等

===除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。

3.5.8 条件操作符

?: 如var max=(num1>num2)?num1:num2;

3.5.9 赋值操作符

num+=10;

3.5.10 逗号操作符

逗号操作符多用于声明多个变量,但除此之外,逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项。

3.6 语句

3.6.1 if语句

if (condition) statement1 else statement2

3.6.2 do-while语句

do {

    statement

}while(expression);

至少要执行一次。

3.6.3 while语句

while(expression){statement;}

3.6.4 for语句
使用while做不到的,for同样做不到。

3.6.5 for-in语句

for(property in expression) statement

3.6.6 label语句

label:statement

3.6.7 break和continue (同C)

3.6.8 with语句

作用是将代码的作用域设置到一个特定的对象中。语法如下:

with (expression) statement

相当于是把多个语句封装成一个语句吧,但是性能不好,不建议使用。

3.6.9 switch(同C)

3.7 函数

function functionName(arg0, arg1...){ statements}

毕竟不区分变量类型。所有函数参数中也不需要像C中啥的要加上类型。

3.7.1 理解参数

ECMAScript不介意传进来多少参数,甚至不传递参数,在函数体内可以通过arguments来访问这个参数数组,从而获得传递给这个函数的每一个参数,可以用length属性来确定传递进来多少个参数。(可以利用length加if语句来实现重载功能,ECMAScript中没有重载,如果两个名字相同,后定义的有效)

function sayHi(){

alert("hello" + arguments[0]+arguments[1]);

}

sayHi("nico", "how are you");

说明了函数的一个重要特点:命名的参数只提供便利但不是必需的。

没有传递值的命名参数将自动被赋予undefined值。

ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。

3.7.2 没有重载

可以通过检查传入参数的类型和数量做出不同的反应,以模仿重载。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章