JavaScript高级程序设计中第2、3章中细节知识点
第2章
1、<script src='script.js' type='text/javascript'></script>中,只要不包含defer和async属性,浏览器都会按照<script>元素在页面的出现顺序对它们依次进行解析。
2、defer属性 <script>中的defer属性的用途是表明脚本在执行时不会影响页面的构造,即,脚本会被延迟到整个页面都解析完毕后在运行。所以设置了defer属性就是相当于告诉浏览器立即下载但延迟执行。
defer=“defer”;
3、async属性 <script type="text/javascript" async src="script.js"></script>指定async属性的目的是不让页面等待脚本下载和执行,从而异步加载页面其他内容。为此,建议异步脚本不要在加载期间修改DOM。
4、嵌入外部script的好处:a、可维护性;b、可缓存,如果有两个页面都使用同一个文件,那么这个文件只需要下载一次,所以,最终结果就是能够加快页面加载的速度;c、适应未来。
第3章
1、在脚本中添加"use strict"; 启用严格模式;
2、数据类型:5中简单数据类型(也称为基本数据类型):Undefined Null Boolean Number String。1中复杂数据类型---Object。
3、typeof操作符---“object”——如果这个值是对象或者null;“function”——如果这个值是函数。typeof是一个操作符而不是一个函数。
4、undefined 对于未声明的变量只能执行一项操作,即使用typeof操作符检测其数据类型。
var message; //未声明 //var age; alert(message); //undefined alert(age); //产生错误 alert(typeof message); //undefined alert(typeof age); //undefined
5、Null null表示一个空对象指针,所以使用typeof操作符检测null值时会返回‘object’。实际上,undefined是派生自null值的,所以alert(undefined == null); //true;
只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值。
6、Boolean 要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean();
7、Number 八进制字面值的第一位必须是零(0),八进制数字序列(0—7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。
var num1 = 070; //八进制的56; var num2 = 79; //无效的八进制数值----解析为79;
十六进制字面值前两位必须是0x;
进行算术计算时,所有的八进制和十六进制表示的数值最终都将被转换成十进制数值。
浮点数值的最高精度是17为小数。
8、NaN 即非数值 是一个特殊的数值。首先, 0除以0返回NaN,正数除以0返回Infinity,负数除以0得-Infinity;其次,NaN与任何值都不相等,包括本身。
9、String类型 字符串特点:字符串是不可变的,也就是,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首次要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
var lang = "Java"; lang = lang + "Script"; 操作过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后异步是销毁原来的字符串“Java”和字符串“Script”;
关于toString()和String():toString()数值、布尔值、对象和字符串值都有这个方法;但是undefined和null没有这个方法。多数情况下,调用toString()方法不必传递参数
var num = 10; num.toString(2); //"1010"; num.toString(8); //"12"; num.toString(16); //"a";
不知道要转换的值是不是null和undefined的情况下,可以使用String():1、如果值有toString()方法,则调用该方法并返回相应的结果;2、如果是null返回”null”,undefined返回“undefined”
10、布尔操作符
逻辑与&&:逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么不会再对第二个操作数求值
逻辑或||:如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
11、相等和不相等(== === != !==):如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,true转换为1;
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值。
12、理解参数(arguments):(1)即便定义的函数只能接收两个参数,在调用这个函数时也未必一定要传递两个参数,可以传递一个、两个、三个甚至不传递参数,原因是参数在函数内部是用一个数组来表示。实际上,在函数体可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。其实,arguments对象只是与数组类似,可以使用方括号语法访问它的每一个元素;(2)arguments对象可以与命名参数一起使用
function doAdd(num1,num2){ if(arguments.length == 1){ alert(num1 + 10); } else if(arguments.length == 2){ alert(arguments[0] + num2); } }
(3)arguments的值永远与对应命名参数的值保持同步
function doAdd(num1,num2){ arguments[1] = 10; alert(arguments[0] + num2); }
这并不是说读取这两个值会访问相同的内存空间,arguments[1] 和 num2 的内存空间的独立的,但是它们的值是同步的。如果值传入一个参数,那么arguments[1]设置的值不会反应到命名参数中。
没有传递值的命名参数将自动被赋予undefined值。
13、如果定义了两个名字相同的函数,则该名字只属于后者定义的函数。