JavaScript学习

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

你可能感兴趣的:(JavaScript)