js高级程序设计(第三版)这一遍的总结——第三章基本概念

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kellywong/article/details/79098641

一、undefined和null的区别

我的理解:undefined 值是派生自null 值的,null多用于表示空对象指针,undefined多用于未经初始化的变量。无论在什么情况下都没有必要把一个变量的值显式地设置为undefined,可是同样的规则对null 却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null 值。

之前不是特别理解上面的描述,后边面试的时候一个面试官这么说它们的区别的:undefined是为计算机设计的,不会显式的人为定义,只是为了让计算机使用,比如当我们声明了一个变量并且没有赋值,我们不会人为的定义这个值是undefined,但是计算机会知道他的值是undefined;而null刚好相反,它是为人定义的,需要人显式的声明,大概就是这样。

二、关于Number数值类型需要注意的几点

1、小数以整数形式保存

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript 会不失时机地将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样地,如果浮点数值本身表示的就是一个整数(如1.0),那么该值也会被转换为整数。

2、浮点数运算时候的误差

浮点数值的最高精度是17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加0.2的结果不是0.3,而是0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。因此,永远不要测试某个特定的浮点数值。

3、NaN的特点

任何涉及NaN 的操作(例如NaN/10)都会返回NaN;NaN 与任何值都不相等,包括NaN 本身。

4、数值转换
1、Number()

把null和”“转换为0;把true和false转换为1和0;数值均转换为十进制;其余转换为NaN;如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符
串值。

2、parseInt()和parseFloat()

这两个函数则专门用于把字符串转换成数值。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。为了避免歧义,最好加上第二个基数参数,例如:

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

parseFloat()和parseInt()差不多,区别在于这个函数会识别第一个小数点,忽略前导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

三、关于String数值类型需要注意的几点

把一个值转换为字符串,可以使用tostring()或者用+号连接起来。

四、函数

1、参数

传递进函数的参数可以使任意个,不一定要和函数规定的参数相等,之所以会这样,原因是ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。在函数体内可以通过arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。arguments 对象是一个类数组,并不是真的数组,但是可以像使用数组那样来使用它。我们举个例子:

function sayHi() {
alert("Hello " + arguments[0] + "," + arguments[1]);
}
sayHi("wallace","chung")

这个函数没有定义参数,但是调用它的时候依然可以传递参数进去。
还有一点很重要的是,arguments 对象可以与命名参数一起使用,再举一个例子:

function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}

这个例子中arguments[0] =num1;arguments[1] =num2;并且它们的值永远保持同步,函数修改了arguments[1]的值,那么num2的值也会相应的改变,但是他们的命名空间始终是独立的。

猜你喜欢

转载自blog.csdn.net/kellywong/article/details/79098641