高级程序设计徐编著课后习题答案
1源始值和引用值
原始值:存储在栈中的简单数据。即:它们的值是直接存储在变量访问的值。
引用值:存储在堆中的对象。即,存储在变量出的值是一个指针,指向存储对象的内存处。存放在栈中可以快速查询,由于原始类型占据的空间是固定的,所以可以将它们存储在较小的内存区域一.一..栈中。
为变量赋值时,ECMAScript的解释程序必须判断该值是原始类型还是引用类型。
2:原始类型
ECMAScript有5种原始类型(primitive type)即:Undefined, Null,String, Boolean, Numbero 可以用typeof运算符判断返回值讲解
undefined如果变量是Undefined类型
boolean如果变量是Boolean类型
number如果变量是Number类型 string
String类型
Object如果变量是引用类型或Null类型
现在,null被认为是对象的占位符,但因js的设计错误,Null仍是原始类型。
3:Undefined类型
该类型只有一个值,即undefinedo
如果声明了变量为初始化,该变量的默认值为undefined 当
函数无明确返回值时,返回的也是undefined
未声明的变量仅可以用typeof运算符,其他运算符时报错,虽不会包js错误,但不会显示想要的效果。
var test;
alert(typeof test); //undefined
alert(test==undefined);//true
alert(test=="undefined") //false
4:Null类型
该类型只有一个专用值null,值defined实际是从值null派生来的, 因此ECMAScript把它们定义是为相等的。
alert(null=defined); //true
尽决两值相等,但它们的含义不同。
undefined是声明了变量但为对其初始化。
null用于尚未存在的对象,如果函数或方法返回的是对象,那么找不到该对象时,通常返回 null
5:Bloolean类型有两个值true和false,即使false不等域0,0也可以在必要
时被转换成false
6:Number类型其值包
括整数和浮点数。
var test=086; //86 var t:070;//八进制56 其还包括几个特殊的值:Number.MAX_VALUE和Number.MIN_VALUE,它们定义了 Number值集合的外边界超出边界的值就会被赋值为边界,也也意味着不再有数字值。
如果计算返回的结果是无穷大值,那该结果不能再用于计算。
事实上有专门的值表示无穷大。 infinity:Number.POSlTlVE INFINITY,-
infinity:Number.NAGATlVE INFINITY 有判断是否有穷的方法isFinity var
iResult=iNum*some large_number; alert(isFinite(iResuIt)); finite:adj,
有限的。finity:n,有限还有一个特殊值NaN(not a number),发生在类型
(String,Boolean)转换失败时。
但由于其特殊性自身不等于自身。
alert(NaN==NaN) ;//false 不推荐使用NaN,而是用
isNaN()进行数字的判断。
7:String类型是唯一没有固定
大小的原始类型
8:类型转换
3种主要的原始值Boolean值,数字和字符串都有toString()方法
Number类型的toString比较特殊。默认模式和基模式默认模式下:
toSring方法只是用相应的字符串输出数字值
var a:070;
//56
var c=0.3e2;//30 基模式:
var
1 iNum=10; 0 alert(iNum.toString(2));//10var b=10.0;//1
alert(iNum.toString(8));//12
alert(iNum.toString(1 6));//A
parselnt("123and");//123 parselnt("red");//NaN
parseInt("AF",1 6);//175 如果十进制数包含前导0,那么
最好用基为10.否则会得到八进制 parselnt("010");//8
parseInt("010",8);//8 parselnt("010",1 0);//1 0
parseFloat()与paselnt不同之处是,字符串必须是以十进制形式表示浮点数。因该方法会忽略前导0。
parseFIoat("123abc");//123
parseFIoat("0xA");//NaN parseFIoat("
120.3.2'');//120.3 parseFloat与paselnt另
一个不同之处是,没有基模式。
---parselnt("12.3");//1 2
---parseFIoat("123");// 123
一强制类型转换一
一运算符一
的应用。 1:delete 删除对以前定义的对象〗属性或方法
var a=new Object();
a.name="shiy' alert(a.name);//shiy delete a.name,
alert(a.name) ;//undefined 这里删除name属性,意味着强制解除对它的引用,
将其值设置为undefined 2:void void运算符对任何值都返回undefinedo该
运算符通常用于避免输出不应该输出的值。
例如:从html的元素调用javascript函数,要正确做到这一点,函数不能返回有效值,否则浏览器将清空页而,只显示函数的结果。
click me 此时,window.open方法返回对新窗口的引用。然后该对象被转换成要显示的字符串。
为避免这种结果,可以用void运算符调用window.open()函数:
click
me 这使window.open()调用返回undefined,它不是有效值,不会显示在浏
览器中。
记住〗没有返回值的函数真正返回的是undefined
3:for-in语句 for-in语句是严格的迭代,用于
枚举对象的属性 for(propert in expression)
statement 例如: for(sProp in
window){ alert(sProp);
4:with语句 with语句用于设置代码在特定对象
中的作用域。
语法:with(expression)
var
word"' statement 例如: ss="hello
rCase()); with(smessage){ alert(t0Uppe
〖注意〗with语句是运行缓慢的代码段,尤其是在己经设置了属性值时,通常情况下尽量避免使用它。
5:js函数重载例
如
function a(){alert("no");}
function a(ok){alert(ok);}
alert();
alert("good"); 结果会显示:undefined, good 原因是:可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是最后一个函数。
6:(arguments对象〗
在函数对象代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问他们。 如:在函数sayHi()中,第一个参数是message,用arguments[0]也可以访问这个值。 function sayHi(){ if
(arguments[O]=="bye")
return; alert(arguments[O]);
此外,还可以用arguments对象检测传递给函数的参数个数, 引用属性arguments.length 即可。
例如:function
howManyArgs(){ alert(arguments.length);
howManyArgs("stirng",20);//2
与其他程序设计语言不同,ECMAScript不会检验传递给函数的参数个数是否等于函数定义的个数。
可以传给函数任意个数的参数,多的忽略,遗漏的都会以undefined传递给函数。
8•Function类用Function类可以直接创建函数语法 var function name= new Function(argumentl ,arguments2,...argumentN,function_body); 在这种形式中,每个argument都是一个参数,最后一个参数是函数体,这些参数必须是字符串。
function doAdd(iNum){alert(iNum+100);} doAdd=new Function("iNum","alert(iNum+10)"); doAdd的值指向对象的指针,函数名只是指向函数对象的引用值,行为就像其他指针一样。
甚至可以使两个变量指向同一个函数。
var alsoDoAdd=doAdd; 如果函数名只是指向函数的变量,那么可以把函数作为
参数传递给另一个函数?
function callAnotherFunc(fnFunciton, vArgument)
fnFunction(vArgument);
var doAdd=new Function("iNum","alert(iNum+10)");
callAnotherFunc(doAdd, 1 0) ;//20 Function
高级程序设计徐编著课后习题答案
1源始值和引用值
原始值:存储在栈中的简单数据。即:它们的值是直接存储在变量访问的值。
引用值:存储在堆中的对象。即,存储在变量出的值是一个指针,指向存储对象的内存处。存放在栈中可以快速查询,由于原始类型占据的空间是固定的,所以可以将它们存储在较小的内存区域一.一..栈中。
为变量赋值时,ECMAScript的解释程序必须判断该值是原始类型还是引用类型。
2:原始类型
ECMAScript有5种原始类型(primitive type)即:Undefined, Null,String, Boolean, Numbero 可以用typeof运算符判断返回值讲解
undefined如果变量是Undefined类型
boolean如果变量是Boolean类型
number如果变量是Number类型 string
String类型
Object如果变量是引用类型或Null类型
现在,null被认为是对象的占位符,但因js的设计错误,Null仍是原始类型。
3:Undefined类型
该类型只有一个值,即undefinedo
如果声明了变量为初始化,该变量的默认值为undefined 当
函数无明确返回值时,返回的也是undefined
未声明的变量仅可以用typeof运算符,其他运算符时报错,虽不会包js错误,但不会显示想要的效果。
var test;
alert(typeof test); //undefined
alert(test==undefined);//true
alert(test=="undefined") //false
4:Null类型
该类型只有一个专用值null,值defined实际是从值null派生来的, 因此ECMAScript把它们定义是为相等的。
alert(null=defined); //true
尽决两值相等,但它们的含义不同。
undefined是声明了变量但为对其初始化。
null用于尚未存在的对象,如果函数或方法返回的是对象,那么找不到该对象时,通常返回 null
5:Bloolean类型有两个值true和false,即使false不等域0,0也可以在必要
时被转换成false
6:Number类型其值包
括整数和浮点数。
var test=086; //86 var t:070;//八进制56 其还包括几个特殊的值:Number.MAX_VALUE和Number.MIN_VALUE,它们定义了 Number值集合的外边界超出边界的值就会被赋值为边界,也也意味着不再有数字值。
如果计算返回的结果是无穷大值,那该结果不能再用于计算。
事实上有专门的值表示无穷大。 infinity:Number.POSlTlVE INFINITY,-
infinity:Number.NAGATlVE INFINITY 有判断是否有穷的方法isFinity var
iResult=iNum*some large_number; alert(isFinite(iResuIt)); finite:adj,
有限的。finity:n,有限还有一个特殊值NaN(not a number),发生在类型
(String,Boolean)转换失败时。
但由于其特殊性自身不等于自身。
alert(NaN==NaN) ;//false 不推荐使用NaN,而是用
isNaN()进行数字的判断。
7:String类型是唯一没有固定
大小的原始类型
8:类型转换
3种主要的原始值Boolean值,数字和字符串都有toString()方法
Number类型的toString比较特殊。默认模式和基模式默认模式下:
toSring方法只是用相应的字符串输出数字值
var a:070;
//56
var c=0.3e2;//30 基模式:
var
1 iNum=10; 0 alert(iNum.toString(2));//10var b=10.0;//1
alert(iNum.toString(8));//12
alert(iNum.toString(1 6));//A
parselnt("123and");//123 parselnt("red");//NaN
parseInt("AF",1 6);//175 如果十进制数包含前导0,那么
最好用基为10.否则会得到八进制 parselnt("010");//8
parseInt("010",8);//8 parselnt("010",1 0);//1 0
parseFloat()与paselnt不同之处是,字符串必须是以十进制形式表示浮点数。因该方法会忽略前导0。
parseFIoat("123abc");//123
parseFIoat("0xA");//NaN parseFIoat("
120.3.2'');//120.3 parseFloat与paselnt另
一个不同之处是,没有基模式。
---parselnt("12.3");//1 2
---parseFIoat("123");// 123
一强制类型转换一
一运算符一
的应用。 1:delete 删除对以前定义的对象〗属性或方法
var a=new Object();
a.name="shiy' alert(a.name);//shiy delete a.name,
alert(a.name) ;//undefined 这里删除name属性,意味着强制解除对它的引用,
将其值设置为undefined 2:void void运算符对任何值都返回undefinedo该
运算符通常用于避免输出不应该输出的值。
例如:从html的元素调用javascript函数,要正确做到这一点,函数不能返回有效值,否则浏览器将清空页而,只显示函数的结果。
click me 此时,window.open方法返回对新窗口的引用。然后该对象被转换成要显示的字符串。
为避免这种结果,可以用void运算符调用window.open()函数:
click
me 这使window.open()调用返回undefined,它不是有效值,不会显示在浏
览器中。
记住〗没有返回值的函数真正返回的是undefined
3:for-in语句 for-in语句是严格的迭代,用于
枚举对象的属性 for(propert in expression)
statement 例如: for(sProp in
window){ alert(sProp);
4:with语句 with语句用于设置代码在特定对象
中的作用域。
语法:with(expression)
var
word"' statement 例如: ss="hello
rCase()); with(smessage){ alert(t0Uppe
〖注意〗with语句是运行缓慢的代码段,尤其是在己经设置了属性值时,通常情况下尽量避免使用它。
5:js函数重载例
如
function a(){alert("no");}
function a(ok){alert(ok);}
alert();
alert("good"); 结果会显示:undefined, good 原因是:可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是最后一个函数。
6:(arguments对象〗
在函数对象代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问他们。 如:在函数sayHi()中,第一个参数是message,用arguments[0]也可以访问这个值。 function sayHi(){ if
(arguments[O]=="bye")
return; alert(arguments[O]);
此外,还可以用arguments对象检测传递给函数的参数个数, 引用属性arguments.length 即可。
例如:function
howManyArgs(){ alert(arguments.length);
howManyArgs("stirng",20);//2
与其他程序设计语言不同,ECMAScript不会检验传递给函数的参数个数是否等于函数定义的个数。
可以传给函数任意个数的参数,多的忽略,遗漏的都会以undefined传递给函数。
8•Function类用Function类可以直接创建函数语法 var function name= new Function(argumentl ,arguments2,...argumentN,function_body); 在这种形式中,每个argument都是一个参数,最后一个参数是函数体,这些参数必须是字符串。
function doAdd(iNum){alert(iNum+100);} doAdd=new Function("iNum","alert(iNum+10)"); doAdd的值指向对象的指针,函数名只是指向函数对象的引用值,行为就像其他指针一样。
甚至可以使两个变量指向同一个函数。
var alsoDoAdd=doAdd; 如果函数名只是指向函数的变量,那么可以把函数作为
参数传递给另一个函数?
function callAnotherFunc(fnFunciton, vArgument)
fnFunction(vArgument);
var doAdd=new Function("iNum","alert(iNum+10)");
callAnotherFunc(doAdd, 1 0) ;//20 Function