spacer.gifJavaScript 的核心是什么?由哪三部分组成?

JavaScript 实现是由以下 3 个不同部分组成的:

  • 核心(ECMAScript)

  • 文档对象模型(DOM)

  • 浏览器对象模型(BOM)


HTML 4.01为 <script>定义了下列 6个属性。 

  • async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或

等待加载其他脚本。只对外部脚本文件有效。 

  • charset:可选。表示通过 src 属性指定的代码的字符集。由于大多数浏览器会忽略它的值,

因此这个属性很少有人用。 

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

效。IE7及更早版本对嵌入脚本也支持这个属性。 

  •  language:已废弃。原来用于表示编写代码使用的脚本语言(如 JavaScript、JavaScript1.2

或 VBScript)。大多数浏览器会忽略这个属性,因此也没有必要再用了。 

  • src:可选。表示包含要执行代码的外部文件。 

  • type:可选。可以看成是 language 的替代属性;表示编写代码使用的脚本语言的内容类型(也

称为 MIME类型)。虽然 text/javascript 和 text/ecmascript 都已经不被推荐使用,但人

们一直以来使用的都还是 text/javascript。实际上,服务器在传送 JavaScript文件时使用的

MIME类型通常是 application/x–javascript,但在 type 中设置这个值却可能导致脚本被

忽略。另外,在非IE浏览器中还可以使用以下值:application/javascript和application/ecmascript。

考虑到约定俗成和最大限度的浏览器兼容性,目前 type 属性的值依旧还是

text/javascript。不过,这个属性并不是必需的,如果没有指定这个属性,则其默认值仍为text/javascript。 


在XHTML中的用法

在兼容 XHTML的浏览器中,这个方法可以解决问题。但实际上,还有不少浏览器不兼容 XHTML,

因而不支持 CData片段。怎么办呢?再使用 JavaScript注释将 CData标记注释掉就可以了: 


<script type="text/javascript"> 

//<![CDATA[ 

function compare(a, b) {  10 

if (a < b) { 

alert("A is less than B"); 

} else if (a > b) { 

alert("A is greater than B"); 

} else { 

alert("A is equal to B"); 

//]]>  

</script>


<noscript>元素

<noscript>元素中的内容只有在下列情况下才会显示出来: 

  •  浏览器不支持脚本; 

  •  浏览器支持脚本,但脚本被禁用。 



严格模式

ECMAScript 5引入了严格模式(strict mode)的概念 "use strict";

这行代码看起来像是字符串,而且也没有赋值给任何变量,但其实它是一个编译指示(pragma),

用于告诉支持的 JavaScript引擎切换到严格模式。这是为不破坏 ECMAScript 3语法而特意选定的语法。 

function doSomething(){ 

"use strict";  

//函数体 


关键字和保留字

ECMA-262描述了一组具有特定用途的关键字,这些关键字可用于表示控制语句的开始或结束,或

者用于执行特定操作等。按照规则,关键字也是语言保留的,不能用作标识符。以下就是 ECMAScript

的全部关键字(带*号上标的是第 5版新增的关键字): 


break         do           instanceof        typeof 

case          else         new               var 

catch         finally      return            void 

continue      for          switch            while 

debugger*     function     this              with 

default       if           throw  

delete        in           try 



ECMA-262还描述了另外一组不能用作标识符的保留字。尽管保留字在这门语言中还没有任何特定

的用途,但它们有可能在将来被用作关键字。以下是 ECMA-262第 3版定义的全部保留字: 


abstract      enum            int            short 

boolean       export          interface      static 

byte          extends         long           super  

char          final           native         synchronized 

class         float           package        throws 

const         goto            private        transient 

debugger      implements      protected      volatile 

double        import          public 


typeof 操作符可能返回下列某个字符串:

  • "undefined"——如果这个值未定义 

  • "boolean"——如果这个值是布尔值 

  • "string"——如果这个值是字符串 

  • "number"——如果这个值是数值 

  • "object"——如果这个值是对象或 null 

  • "function"——如果这个值是函数 


浮点数

 不要做这样的测试! 因为浮点数值不能用于比较

if (a + b == 0.3){           
alert("You got 0.3."); 
}  else {

alert("You got 0.30000000000000004. not 0.3 ,it`s  wrong"); 

}



 NaN


 即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数
未返回数值的情况(这样就不会抛出错误了)

 但在ECMAScript中,任何数值除以0会返回NaN ,因此不会影响其他代码的执行

NaN 与任何值都不相等,包括 NaN 本身   

alert(NaN == NaN);   //false

针对 NaN 的这两个特点,ECMAScript定义了 isNaN()函数。这个函数接受一个参数,该参数可以
是任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN()在接收到一个值之后,会尝试
将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或 Boolean 值。而任何
不能被转换为数值的值都会导致这个函数返回 true。 

alert(isNaN(NaN));         //true 
alert(isNaN(10));          //false(10是一个数值) 
alert(isNaN("10"));        //false(可以被转换成数值 10) 
alert(isNaN("blue"));      //true(不能转换成数值) 
alert(isNaN(true));        //false(可以被转换成数值 1) 

isNaN(0100)   // false  貌似对二进制无效


parseInt()

parseInt('4567ab6678cd4456')        //4567

parseInt("");                                      // NaN


对于ECMAScript3 和 ECMAScript5 中 对 8 进制的支持程度,来看 5 对 8 不支持,所以解析进制最好加入转化的进制数值 以免发生转换分歧 如下

var num1 = parseInt("10", 2);      //2  (按二进制解析) 
var num2 = parseInt("10", 8);      //8  (按八进制解析) 
var num3 = parseInt("10", 10);     //10 (按十进制解析) 
var num4 = parseInt("10", 16);     //16 (按十六进制解析)


parseFloat()


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 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其
他用途的字符。这些字符字面量如下表所示: 
说实话看到这个词的时候还是头一回听说专业术语果然博大精深,TMD 就不能通俗点儿

字  面  量  含  义 
\n  换行   \t  制表    \b  空格     \r  回车   \f  进纸    \\  斜杠    

\'  单引号('),在用单引号表示的字符串中使用。例如:'He said, \'hey.\'' 
\"  双引号("),在用双引号表示的字符串中使用。例如:"He said, \"hey.\"" 
\xnn  以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A" 
\unnnn  以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ 

 字符串的特点

var lang = "Java"; 
lang = lang + "Script"; 

以上示例中的变量lang开始时包含字符串"Java"。而第二行代码把lang的值重新定义为"Java" 12 
与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳 10个字符的
新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字
符串"Script",因为这两个字符串已经没用了。这个过程是在后台发生的,而这也是在某些旧版本的

浏览器(例如版本低于 1.0的 Firefox、IE6等)中拼接字符串时速度很慢的原因所在。但这些浏览器后
来的版本已经解决了这个低效率问题。 


终于知道了 IE6 在拼字符串时候为什么那么慢了,不过对于以前内存等都已32M / 64M 计算的时候觉得IE6销毁机制还是不错的.


 toString()

var a = 1234;   a.toString()                          // "1234"

var a = function(){ return 1234;}; a.toString();           //"function (){ return 1234;}"

 var a = 0xf ;     a.toString(10);                     //"15"  转化为10进制的字符串    


 Object类型 

var o = new Object();

Object 的每个实例都具有下列属性和方法。 

 1.constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)
就是 Object()。  

 2.hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例
的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例
如:o.hasOwnProperty("name"))。 
 3. isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型(第 5 章将讨论原
型)。 
4.propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句
(本章后面将会讨论)来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符
串形式指定。 
5.toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。 
6.toString():返回对象的字符串表示。 
7.valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值 
相同。 


位操作符


 | & ~ 什么时候用到 说实话这三个看懂是如何计算的,但是不知道用途在什么地方?有没有哪位大神能举例说明在软件开发中的应用?在下感激不尽


for-in 语句

for (var propName in window) { 
 document.write(propName); 
}

个人觉得这个对于调试浏览器兼容性还是大有好处的,可以查到每个对象自己的方法和属性有什么进行对比.


label语句 
使用 label 语句可以在代码中添加标签,以便将来使用。以下是 label 语句的语法: 

label: statement 

下面是一个示例: 

start: for (var i=0; i < count; i++) { 
alert(i);  


这个例子中定义的 start 标签可以在将来由 break 或 continue 语句引用。加标签的语句一般都
要与 for 语句等循环语句配合使用。


switch语句

switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如,
字符串"10"不等于数值 10)。 


参数

function sayHi(name, word) { 
alert("Hello " + name + "," + word); 

// 以下形式 arguments[0] 就等于传递的第一个参数值,依次类推



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



function doAdd() { 
if(arguments.length == 1) { 
alert(arguments[0] + 10); 
} else if (arguments.length == 2) { 
alert(arguments[0] + arguments[1]); 

}  7 

doAdd(10);         //20 
doAdd(30, 20);     //50 

函数 doAdd()会在只有一个参数的情况下给该参数加上 10;如果是两个参数,则将那个参数简单
相加并返回结果。因此,doAdd(10)会返回 20,而 doAdd(30,20)则返回 50。虽然这个特性算不上完
美的重载,但也足够弥补 ECMAScript的这一缺憾了。 


变量、作用域和内存问题


基本类型和引用类型的值 

基本数据类型:Undefined、Null、Boolean、Number 和 String

引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的 。 

引用类型

var person = new Object();  
person.name = "Nicholas"; 
alert(person.name);     //"Nicholas" 

基本类型

var name = "Nicholas"; name.age = 27; 
alert(name.age);    //undefined