《JavaScript高级程序设计 第三版》学习笔记 (一)数据类型详解

来源:互联网 发布:mac网游 编辑:程序博客网 时间:2024/04/28 13:47

系列来自:http://blog.csdn.net/lbxx1984/article/details/38870111


一、基本概念

1.ECMAScript

(1)这是一个标准,虽然是伴随js而生的,但不意味着这就是js。这是用来规定语法、类型、关键字之类信息的。

(2)ActionScript也使用这个标准。js核心就是把符合这个标准的语句解析执行。

2.DOM(document)

(1)这不是js的组成部分,而是js的扩展,是经过扩展用于html应用程序变成的API接口,因此,在服务器运行的Nodejs就把这块扩展取消了。

(2)主要作用是选择、添加、修改、删除html元素。

(3)DOM分级别,最开始的1级最初级的,基本只支持选择、添加、删除;2级增加了DOM的视图、事件、样式、遍历等。3级增加了文档验证。

3.BOM(window)

(1)这也是js的扩展,针对的不是html元素,而是浏览器窗口。

(2)包括弹出新窗口、缩放关闭窗口、提供窗口详细信息的navagator对象、提供加载信息的location、提供分辨率信息的screen、对cookies的支持、ajax等。

(3)与DOM不同,BOM没有统一的规范标准。

 

二、脚本加载

1.script标签

(1)sync属性:异步下载外部脚本(避免脚本过大或无效产生的阻塞,影响其他页面生成),只对外部脚本文件有效。

(2)defer:表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。

(3)在script标签内嵌入式写js时,不要在代码的任何部分写"</script>",否则代码会失效。DW会检查这个错误。想写的话把"/"转义成"\/"。

(4)使用src属性引入外部脚本后,不能在标签内部再写其他代码。

(5)现代Web应用一般把外部script标签放在body最后,以避免加载js时body不渲染(这也是页面优化的23条原则之一)。

(6)对于js,没有硬性规定非要外部引用。但外部引用有好处,就是维护性强、可以缓存。

2.异步加载

(1)在script标签中设置defer,告诉浏览器立即下载外部脚本,但延迟执行,defer="defer",在实际中,延迟的脚本未必会按照原先的顺序执行,因此最好只包含一个延迟脚本。

(2)与defer类似,async属性也有这样的作用。但完全不保证执行顺序。defer还是尽量保证的。async ,在XHTML中,把async写成async="async"。

3.noscript标签

浏览器不支持或禁用了js时,可以用noscript标签判断并警告。

 

三、语法

1.大小写敏感,第一个字符必须是字母或_或$。

2.严格模式,在函数体第一行写“"use strict";”。严格模式下运行结果会不同,比如八进制数字字面量无效,引擎会抛错,var a=078;。支持严格模式的IE最少是10。

3.结尾可以有分号,也可以没有。

4.语法基本和c一致。但是label语句没有goto啥的,只能把lable放在break或continue后面。

 

四、数据类型

1.松散类型

ECMAScript是松散类型的,规定了五种基础数据类型:undefined、NULL、number、string、boolean;一个复杂数据类型Object。

2.typeof

(1)typeof只会返回如下结果:undefined、boolean、string、number、object、function。

(2)null是空对象的引用,所以 typeof null的结果是object。

(3)如果一个变量声明了,但没初始化,它的类型就是undefined。实际上,undefined派生自null,所以alert(null==undefined),返回true。

3.Number

(1)ECMAScript保存了正0和负0,这两个数在值上是相等的。

(2)永远不要比较两个浮点数是否相等,ECMAScript使用IEEE754保存所有的Number变量。

(3)Number.MAX_VALUE和Number.MIN_VALUE分别存放了所支持的数的上下界,另外还保存了极大值Number.POSITIVE_INFINITY和极小值Number.NEGATIVE_INFINITY。

(4)NaN是一个特殊的数字,意思是不是一个数Not a number。数学表达式的非法结果,都用NaN表示,比如a/0、parseInt("blue")。

(5)NaN的特点是任何与NaN的数学运算,结果都是NaN,NaN不与任何值相等。比如alert(NaN==NaN),返回false。可以用isNaN()判断一个变量是不是NaN。alert(!NaN)返回true。

(6)其他类型转换成数值:Number(),parseInt(),parseFloat()。

   <1>对于Number,传入boolean返回1或0;传入null返回0;传入undefined返回NaN;传入字符串,前缀是数值,返回这个数值,不是就返回NaN,空字符串返回0;传入对象,先调用valueOf(),然后处理,如果结果是NaN,再调用toString(),再处理一次。

   <2>对于parseInt,可以有另外一个参数,就是进制,标明第一个参数是什么进制,然后统统转成10进制;其他和Number类似,只不过parseInt传入空字符串返回NaN。

   <3>对于parseFloat,与parseInt的区别是会保留一个小数点;第二个区别是只解析十进制,解析式会忽略前导的0。如果传入字符串没有小数点,全是数字,就返回整数。所以传入的16进制串都转成0。

4.String

(1)ECMAString的字符串一旦生成就不可改变。因此string的加法操作很消耗资源。

(2)其他类型转换成字符串:toString()、String()

   <1>boolean、object、number、string都有这个方法。null和undefined没有。其中number的toString()可以带一个参数,表示用什么进制把十进制数转成字符串,可以是2、8、10、16,默认为10。

   <2>如果不知道变量有没有toString方法,可以用String(a)。如果有,String会自动调用。

5.Object

(1)创建一个对象,var a=new Object(); var b=new Object;var c={};。b这种方法不推荐,a和c的效果一样。

(2)Object类型是所有对象的基础,他具有的任何方法属性同样存在于更具体对象中。

(3)constructor,保存着用于创建当前对象的函数。

(4)hasOwnProperty(propertyName),用于检查当前对象实例(而不是在实例的原型中)是否存在某个属性:

[javascript] view plain copy
  1. var a=newObject();  
  2. a.b="b";  
  3. alert(a.hasOwnProperty("constructor"));//false  
  4. alert(a.hasOwnProperty("b"));//true  

(5)isPrototypeOf(object),用于检测传入的对象是否是另一个对象的原型。

(6)prototyIsEnumerable(propertyName),用于检测指定属性能否用for in枚举。

(7)toLocalString(),转换成字符串,该字符串与执行环境的地区对应。

(8)toString(),转换成字符串。

(9)valueOf(),返回对象的string、number或boolean表示。通常与toString()相同。

6.操作符引起的类型转换

(1)ECMAString所有数字用IEEE754 64位格式存储,但位操作并不是直接操作这64位,而是将这64位转换成32位整数,然后再操作,然后转换回来。存储的64位对程序员是透明的。

(2)ECMAString的逻辑运算是短路操作,比如连续与,如果第一个是false,后面的条件就不判断了。

(3)关于无穷一切不确定的结果,多半是NaN。Infinity*0=NaN;Infinity-Infinity=NaN;Infinity*Infinity=Infinity;Infinity*other=Infinity;Infinity/Infinity=NaN;(+Infinity)+(-Infinity)=NaN;(+0)+(-0)=(+0);(-0)-(-0)=(+0);

(4)加号操作,如果一个操作数是string,那么其他类型的操作数会自动调用String转换成字符串,然后拼串。

(5)减号、乘号、除号,如果操作数中有string、boolean、null或unsigned,先自动调用Number()把这些类型转换成数值,然后在进行减法运算。

(6)关系操作:

   <1>如果一个是number,另一个是非Object,则将另一转换成number然后比较;

   <2>如果一个是number,另一个是Object,则另一个调用valueOf,没有就调用toString。

   <3>如果一个是boolean,就先将其转换成number。

   <4>两个都是string,直接比较ASCII值。

   <5>操作数中有一个是NaN,比较大小返回false,比如"a"<3,相当于Number("a")<3,然后NaN<3,返回false。

   <6>操作数有一个是NaN,判断相等返回false,判断不相等返回true。

   <7>相等和不相等,一个操作数是string一个是number,调用Number;一个是Object一个是非Object,调用valueOf。

   <8>全相等和不全等,要判断类型。


0 0