• 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

  • 相关阅读:
    JVM 基础知识
    Maven 学习
    Java 中 split() 方法
    JDK、JRE、JVM三者联系与区别
    Effective C++ 笔记 —— Item 5: Know what functions C++ silently writes and calls
    Effective C++ 笔记 —— Item 4: Make sure that objects are initialized before they’re used
    Effective C++ 笔记 —— Item 3: Use const whenever possible
    Effective C++ 笔记 —— Item 2: Prefer consts, enums, and inlines to #defines
    Idea社区版使用插件完成正常开发
    DNS配置
  • 原文地址:https://www.cnblogs.com/jiandankuaile/p/3501565.html
Copyright © 2020-2023  润新知