Javascript是一种解释型语言,不需要提前编译。通常情况下,JavaScript放在网页中,在浏览器中运行。
1 JavaScript的数据类型
JavaScript的简单数据类型有5种:Number,String,Boolean,Undefined,Null,一种复杂类型Object,一种代码类型Function。
区分undefined 和 null
Null:
(1) null 意味着没有值,即缺少数据。
(2)包含 null 的变量包含“无值”或“无对象”。换句话说,该变量没有保存有效的数、字符串、boolean、数组或对象。可以通过给一个变量赋 null 值来清除变量 的内容。
(3) Null类型只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null时会返回"object"的原因(null是一种特殊的object)
Undefined:
(1) undefined常量用于尚未初始化的变量或未初始化的动态对象属性的特殊值(未定义的值和定义未赋值的为undefined)
(2)Undefined类型只有一个值,即特殊的undefined(注意大小写,用的时候也不用加引号,人家不是string)。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined
实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true,但是使用全等运算符(===)对null和undefined进行比较时,比较结果为不相等。
Number:NaN和infinity是两个特殊数,NaN表示一个无法用数值来表示的数字,infinity表示一个无穷大的数字,相对的,-infinity表示负无穷大。
注意:(1)NaN != NaN
(2)infinity/infinity = NaN;
String:字符串,在javascript中没有字符的概念,字符串是表示文本的最小单位。在字符串中,有这样的两个函数,分别是charAt(index)和charCodeAt(index)分别返回对应索引的字符和字符Unicode编码。在我们平时,可能经常会使用下标的方式访问,如s[10],可是这并不是ECMAScript的标准,应该尽量避免。
1.1 Number类型
Number类型用来存储数值,描述64位的浮点类型。
1.2 String类型
String类型用来表示文本,用单引号或双引号来包含文本。任何放在引号内的符号都会被认为是string类型。
1.3 Boolean类型
1.4 Undefined类型
当我们声明一个变量后并没有对其赋值时,他就是undefined。
在javascript中有一个和undefined类似的值:null。Undefined表示“变量已声明但没有赋值”,null表示“变量已赋值但为空”,注意:undefined = = null 的值为true。
Javascript中表达式的优先级:|| 优先级最低,&& 次之,然后是比较运算符,最后是其他(比如!)
typeof 运算符返回一个用来表示表达式的数据类型的字符串。
typeof的运算数未定义,返回的就是 "undefined".
运算数为数字 typeof(x) = "number"
字符串 typeof(x) = "string"
布尔值 typeof(x) = "boolean"
对象,数组和null typeof(x) = "object"
函数 typeof(x) = "function"
1.5 类型转换
类型转化是将一种类型的值转化成另一种类型的值,使用“= =”进行比较时会有类型转化,使用“= = =”(全等于)可以禁止类型转化。我们在上面提到undefined= = null 的值是true,但我们typeof(null)时可以发现结果是object,说明null 是object类型,所以在比较的过程中发生了类型转换。
例:
var a = 1;
var b = “1”;
(a = = b) 结果为true
(a = = = b)结果为false
(a = = = Number)) 结果为true
2 Javascript基本流程控制
和其他编程语言一样,javascript的逻辑控制也是顺序、循环和条件。
注意:
//这个例子挺好的 var myObject ={hisName:"javascript", age:11, belonging:"ECAM"}; for(var prop in myObject){ document.write("myObject." + prop + "=" + myObject[prop]+"<br />"); } //输出: // myObject.hisName = javascript //myObject.age = 11 //myObject.belonging = ECMA
var myObject ={hisName:"javascript", age:11, belonging:"ECAM"}; for(var prop in myObject){ document.write(prop+"<br />"); } //输出: // javascript //11 //ECMA
3 函数
<script type="text/javascript"> function Hello() { alert("Hello"); } Hello(); function Hello() { alert("Hello World"); } Hello(); </script>
我们会看到页面连续输出两次“Hello World”,说明javascript并非完全按顺序解释执行,而是在解释之前会对javascript进行一次“预编译”,在”预编译“的过程中会把定义式的函数优先执行,也会把所有var 变量创建,默认值为undefined,提高执行效率。上面的一段代码其实被JS引擎预编译为这样的形式:
<script type="text/javascript"> var Hello = function() { alert("Hello"); } Hello = function() { alert("Hello World"); } Hello(); Hello(); </script>
我们可以通过上面的代码很清晰地看到,其实函数也是数据,也是变量,我们也可以对“函数“进行赋值(重赋值)。
3.1 变量的作用域
在javascript中变量可以分为全局变量和局部变量。
在Javascript,全局环境本身就一个对象。在浏览器宿主中这个对象是window,而当Javascript用于其它非浏览器的宿主,如嵌入式的环境中,可能会是其它的对象。
有很多人都认为Javascript只在浏览器中使用,其实Javascript也能在很多非Web情况下使用。
当我们写下:var i=1时,其实就是声明了一个window作用域的一个变量。
而当我们写下i=1时,是声明了一个window的属性。
函数的作用域问题,每当代码进入一个函数时,JavaScript引擎就会自动创建一个新的作用域,然后把新的作用域作为当前作用域的子作用域,然后把当前的代码作用域切换到新的作用域,当代码退出函数时,这个作用域销毁,把代码作用域交给他的父作用域。
每个变量找不到自己的定义时,就会沿着作用链向上查找,有可能出现未知的错误,给排错添加了很多的困难,也有可能修改父作用域上变量的值,因此我们在声明变量时应尽量加上var。
3.2 嵌套函数
Javascript允许在函数体内嵌套函数,在某种程度上可以控制一些变量在某些函数内的共享。内嵌函数可以访问外部函数的参数,全局变量等。在调用函数时,通常是不能直接访问内嵌函数的。
3.3 函数调用的机制
Javascript使用栈和上下文机制来调用函数,我们可以将javascript执行的代码的顺序看做是上下文,并且使用栈来存储上下文。
当我们调用一个方法时,在调用前,栈会保存当前上下文,然后调用函数,在调用结束后,栈会从之前保存的上下文开始顺序执行。如果上下文增长过快,会导致堆栈溢出,例如当我们在A方法中调用B方法,然后在B方法中调用A方法,这种循环调用的方式很容易就将堆栈搞坏了。
3.4 函数的可变参数
Javascript在调用函数时,并不会限制传入参数的个数,当传入参数的个数多余定义中的参数的个数时,多余的参数会被忽略;当传入参数的个数小于函数定义中参数的个数时,缺失的参数默认为undefined。
4 eval函数
一段字符串传递给JS解释器,由javascript解释器将这段字符串解释成javascript代码,并且执行它。
eval()函数动态执行的代码并不会创建新的作用域,其代码就是在当前的作用域执行的。因此也就是说,eval()函数也完全可以使用当前作用域的this,argument等对象。例:
var test = function () { eval("var i=3"); alert(i); } test(); alert(i);
结果是首先弹出3,然后是再提示 i 未定义。
参考: http://www.cnblogs.com/wing011203/p/3175463.html
http://www.cnblogs.com/kym/archive/2010/01/18/1650333.html
http://www.cnblogs.com/tonylp/archive/2013/01/26/2878206.html