今天开始看《javascript高级程序设计》,准备写点简单笔记,记录学习之路,因为刚入门,所以只是简单总结,同时也为了督促自己,相信以后有了更多的体会再来看这本书,又是不一样的感受。而我一直相信,罗马非一日建成。
day 01
chapter 21,在使用<script>嵌入Javascript代码时,不要在代码中任何地方出现"</script>"字符串,因为当浏览器遇到字符串"</script>"时,就会认为那是结束的</script>标签,而通过把这个字符串分隔为两部分可以解决这个问题,如下:
///
alert("\/script");
2,引入外部js文件时,使用src属性,<script type="text/javascript" src="xxx.js"></script>
与解析嵌入式javascript代码一样,在解析外部js文件时,页面的处理也会暂时停止,如果是在DHTML文档中,也可以省略前面实例代码中结束的</script>标签。例如:
<script type="text/javascript" src="xxx.js" />
但是,不能在HTML文档中使用这种语法,原因是不符合HTML规范,而且也得不到某些浏览器(尤其是IE)的正确解析。
3,按惯例,所有<script>元素都应该放在页面的<head>元素中,这样做是为了将所有外部文件(包括css文件和js文件)的引用都放在相同的地方,但这样就意味着必须等到全部js代码被下载、解析及执行完以后才能开始呈现页面的内容(浏览器遇到<body>标签时才开始呈现内容)。这样的话在遇到有多个js文件的页面时加载会出现明显延迟,延迟期间浏览器中将是一片空白,为了避免这种情况,一般把js放在<body>元素页面的内容后面,如下:
<html>
<head>
<title>
</title>
</head>
<body>
<!-- 这里放内容 -->
<script type="text/javascript" src="xxx.js"></script>
</body>
</html>
chapter 3局部变量与全局变量
1,var message
如上,用var 关键字来定义一个变量,如果该声明放在函数当中,即为局部变量,一旦函数执行完毕退出,该变量将被销毁。
如下:
funciton test(){
var message = "hi";//局部变量
}
test();
alert(messsage);//报undefined
如果不用var关键字修饰,则默认为全局变量funciton test(){
message = "hi";//全局变量
}
test();
alert(messsage);//hi
注:虽然省略var操作符可以定义全局变量,但是并不推荐,因为在局部作用域中定义的全局变量很难维护,给未经声明的变量赋值在严格模式下会导致抛出ReferenceError错误。数据类型
1,一共有五种简单数据类型(基本数据类型)
Undefined、Null,Boolean、Number、String
一种复杂数据类型
Object
Undefined类型
1,Undefined类型只有一个值,即是特殊的undefined。使用var来声明但并未对其进行初始化时,其值为undefined。如下:
var message;
alert(message == undefined);//true
不过包含undefined值的变量与尚未定义的变量还是不一样的,如下:var message;// 这个变量声明之后默认取得了undefined值
// a 并没有声明
// var a
alert(message);// undefined
alert(a);//产生错误
typeof 操作符1,"undefined" ---值未定义或声明
"boolean" ---值是布尔值
"string" ---值是字符串
"number" ---值是数值
"object" ---值是对象或null (特殊值null会被认为是个空的对象引用)
"function" ---值是函数
对于未初始化的变量和未声明的变量执行typeof操作符都会返回undefined值
var m;
alert(m == undefined); //true
alert(typeof(m)=="undefined");//true
alert(typeof(a)); //"undefined"
alert(typeof(a) == typeof(m)); //true
Null 类型1,Null类型是第二个只有一个值得数据类型,即null
var car = null;
alert(typeof(car));//"object"
如果定义的变量准备用来保存对象,那么最好将该变量初始化为null而不是其他值,这样的话方便检查通过null值检查就可以知道是否已经保存了一个对象的引用。但undefined值实际上是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true:alert(null == undefined); //true
虽然有这样的关系,但它们的用途完全不同。无论如何都没有必要将一个变量的值显式的设置为undefined,但同样的规则对null不适用。即只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值。这样做不仅可以体现null作为空指针的惯例,还能进一步区分null和undefined。NaN (not a number)
1,NaN本身有2个特点:
一、任何涉及NaN的操作(如NaN/0)都会返回NaN
二、NaN与任何值都不相等,包括自己,如下:
alert(NaN == NaN); //false
针对以上特性,定义了isNaN()函数,该函数接受一个任何类型的参数,可以用来判断该参数是否“不是数值”.isNaN()也适用于对象。基于对象调用isNaN()时,首先会调用该对象的valueOf()方法,然后确定该方法的返回值是否能转化为数值,如果可以就返回false,否则就再基于这个返回值再调用toString()方法,再测试返回值。
数值转换
以下三个函数可以将非数值转换为数值:
Number() parseInt() parseFloat()
第一个可以用于任何数据类型,第二第三个则专门用于字符串转换成数值。
Number()
1,如果是Boolean值,true和false分别转换为1和0
2,数字的话简单返回和传入
3,null值,返回0
4,undefined,返回NaN
5,字符串
a,字符串只包含数字,转换成十进制数值
b,包含有效浮点格式,转换对应浮点数值
c,包含有效十六进制,转换为大小相同的十进制整数值
d,字符串为空(不包含任何数值),转换为0
e,包含除上述以外的字符,转换为NaN
f,对象的话,则调用对象的valueOf()方法,再依照前面的规则转换为大小相同的十进制数值;如果
转换的为NaN,则调用对象的toString(),然后再按照之前的规则进行转换。
一元加操作符的操作和Number()函数相同。