JS

来源:互联网 发布:eclipse json编辑器 编辑:程序博客网 时间:2024/06/14 01:28
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <!-- 所有<script>元素都应该放在页面的<head>元素中 -->
    <script type="text/javascript" src="example.js"></script>
    <title></title>
</head>
<body>
    <script type="text/javascript" src="example.js"></script>
    <!-- 避免东西太多影响加载正常页面 -->
</body>
</html>
<script async>
    //立即下载脚本,只对外部脚本文件有效
    //并不保证按照指定他们的先后顺序执行
    //异步脚本不要再加载期间修改DOM
    //XHTML中要使用async = "async"
</script>
<script charset="utf-8"></script>
<script defer="defer" src="example.js">
    //脚本可以延迟到文档完全被解析和显示之后执行,只对外部文件有效
    //立即下载,但延迟执行
    //按照先后顺序执行(事实是不一定)
</script>
<script src="" type="text/javascript">
    //外部文件
    //带有src不应该再有嵌入代码,只会执行外部文件。嵌入的会被忽略
    function sayHi() {
        alert("Hi !  ");
        var result = Number.MAX_VALUE + Number.MIN_VALUE + Number.MIN_SAFE_INTEGER;
    }
</script>
<!--  null 被认为是一个空对象的引用,所以 typeof(null) 的结果是 object
      函数也是对象,不是数据类型
      null == undefined; //true
      null === undefined; //false
      只要意在保存对象的变量还没有真正保存对象,就应该明确地让改变量保存null值
      null作为空对象指针
      有助于区分undefined
      NaN,即非数值(Not a Number)是一个特殊的数值,
      alert(NaN == NaN);   //false
      ECMAScript中的对象其实就是一组数据和功能的集合
      Object 的每个实例都具有下列属性和方法。
         constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor) 就是 Object()。
         hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在
         isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
         propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举
         toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。 
         toString():返回对象的字符串表示。
        valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值 相同。
    按位非操作的本质:操作数的负值减 1
    使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined
   
    使用 label 语句可以在代码中添加标签,以便将来使用。以下是 label 语句的语法:
    label: statement
    加标签的语句一般都 要与 for 语句等循环语句配合使用
   
    break 和 continue 语句都可以与 label 语句联合使用,从而返回代码中特定的位置。这种联合 使用的情况多发生在循环嵌套的情况下
    with 语句的作用是将代码的作用域设置到一个特定的对象中。with 语句的语法如下:
    with (expression) statement;
    不建议使用 with 语句
   
    switch 语句中使用任何数据类型(在很多其他语言中只能使用数值),无论是字符串,还是对象都没有 问题。
    其次,每个 case的值不一定是常量,可以是变量,甚至是表达式
   
    switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换
   
    -->
    <!-- 函数
    ECMAScript 中的函数在定义时不必指定是否返回值
    return 语句也可以不带有任何返回值。在这种情况下,函数在停止执行后将返回 undefined 
  
    即便你定义的函数只接收两个参数, 在调用这个函数时也未必一定要传递两个参数
    原因是 ECMAScript中的参数在内部是用一个数组来表示的。
    ECMAScript中也没有函数签名的概念,,函数接收 到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。
    命名的参数只提供便利,但不是必需的。解析器不会验证命名参数
     arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名 参数的个数决定的
    没有传递值的命名参数将自动被赋予 undefined 值。
    ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
   
    如果在 ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
    未指定返回值的函数返回的是一个特殊的 undefined 值。
    可以向ECMAScript函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数。
     由于不存在函数签名的特性,ECMAScript函数不能重载。
    -->
<!--4 变量、作用域和内存问题  -->
    <!-- 基本类型和引用类型的值
        基本类型值指的是 简单的数据段,而引用类型值指那些可能由多个值构成的对象
        5种 基本数据类型:Undefined、Null、Boolean、Number 和 String。这 5种基本数据类型是按值访问 的,因为可以操作保存在变量中的实际的值。
       
        定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。
        但是,对于引用类型的值,我们可以为其添加属 性和方法,也可以改变和删除其属性和方法。
        当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到 为新变量分配的空间中
        。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一 个对象。
       
        ECMAScript 中所有函数的参数都是按值传递的。
       
        通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象
        result = variable instanceof constructor
        如果变量是给定引用类型的实例 instanceof 操作符就会返回true
        alert(person instanceof Array); //变量person 是 Array 吗?
        所有引用类型的值都是Object的实例。
        因此在检测一个引用类型值和Object构造函数时,instanceof 操作符始终会返回true
       
       
        执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为
        每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
        虽然我们编写的代码无法访问这个对象,但解析器在处理数据时会后台使用它
       
        根据 ECMAScript实现所在的宿主环境不同,表示执行环 境的对象也不一样。
        Web浏览器,全局执行环境被认为是Window队形
       
        每个函数都有自己的执行环境
        当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。 而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境
        当代码执行到一个环境中执行的时候,会创建变量对象的一个作用域链。
        作用域链是保证对执行环境有权访问的所有变量和函数的有序访问
        作用域链的前端,始终都是当前执行的代码所 在环境的变量对象。
        作用域链中 的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。
        这样,一直延 续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。
        标识符解析是沿着作用域链一级一级地搜索标识符的过程
        内部环境可以通过作用域链访问所有的外部环境
       
        JavaScript 没有块级作用域经常会导致理解上的困惑
        如果用 ECMAScript的话来讲,就是它们自己的执行环境
        每个函数都有自己的执行环境
       
        使用 var 声明的变量会自动被添加到最接近的环境中。
        。在函数内部,最接近的环境就是函数的局部 环境;
        在 with 语句中,最接近的环境是函数环境。如果初始化变量时没有使用 var 声明,该变量会自 动被添加到全局环境
       
         执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;
        -->
<!-- 引用类型 -->
    <!-- ARRAY
        ECMAScript 数组的每一项可以保存任何类型的数据。
        ECMAScript 数组的大小是可以动态调整的
        创建数组的基本方式有两种。
            第一种是使用 Array 构造函数:
                var color = new Array();
                var color = new Array(20);
                var color = new Array("red","green","blue");
            第二种基本方式是使用数组字面量表示法
                var names = [];
        与对象一样,在使用数组字面量表示法时,也不会调用 Array 构造函数
        数组的 length 属性很有特点——它不是只读的
        检测数组 : instanceof
        instanceof 操作符的问题在于,它假定只有一个全局执行环境
        如果网页中有多个框架,那么不同框架下的数组分别具有不同的构造函数
       
        ECMAScript 5新增了 Array.isArray()方法。这个方法的目的是终确定某 个值到底是不是数组,而不管它是在哪个全局执行环境中创建的
        Array.IsArray(value);
        toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串
        valueOf()返回的还是数组
        数组继承的 toLocaleString()、toString()和valueOf()方法,在默认情况下都会以逗号分隔的字 符串的形式返回数组项
       
        如果使用 join()方法,则可以使用不同的分隔符来构建这个字符串。
        join()方 法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串。
       
        栈方法 push(),pop();
        队列方法: push();shift;//弹出第一项
        unshift();在数组前端添加任意个项并返回数组长度
        reserve();//反转数组项的顺序
        sort();//按照升序排序,但是会先统一转换成字符串,针对字符串进行排序
        因此对于数值排序不准确,所以可以接收一个比较函数作为参数
        values.sort(compare);
        Concat()方法可以基于当前数 组中的所有项创建一个新数组,复制数组
         slice(),它能够基于当前数组中的一或多个项创建一个新数组。slice()方法可以 接受一或两个参数,即要返回项的起始和结束位置。
        。在只有一个参数的情况下,slice()方法返回从该 参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项— —但不包括结束位置的项
        如果 slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位 置
         splice();
        splice(0,2)会删除数组中的前两项
        splice(2,0,"red","green")会从当前数组的位置 2开始插入字符串"red"和"green
        splice (2,1,"red","green")会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串 "red"和"green"。
        splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何 项,则返回一个空数组)
        indexOf()和 lastIndexOf()。
        这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1
        :reduce()和 reduceRight()
        。这两个方法都会迭 代数组的所有项,然后构建一个终返回的值。
        其中,reduce()方法从数组的第一项开始,逐个遍历 到后
        。而 reduceRight()则从数组的后一项开始,向前遍历到第一项。
       
        reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象
        这 个函数返回的任何值都会作为第一个参数自动传给下一项。
        -->
    <!-- Date类型 -->
        <!-- var now = new Date();
            新创建的对象自动获得当前日期和时间
            Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日 期的毫秒数。
                如果传入 Date.parse()方法的字符串不能表示日期,那么它会返回 NaN
            Date.UTC()方法同样也返回表示日期的毫秒数
            Data.now()方法,返回表示调用这个方法时的日期和时间的毫秒数
           
            Date 类型的 toLocaleString()方法会按照与浏览器 设置的地区相适应的格式返回日期和时间。
            而 toString()方法则通常返回带有时区信息的日期和 时间
                 -->
    <!-- RegExp 类型  -->
        <!-- ECMAScript通过 RegExp 类型来支持正则表达式
            var expression = / pattern / flags ;
             g:表示全局(global)模式,
             i:表示不区分大小写(case-insensitive)模式,
             m:表示多行(multiline)模式,
           
            使用正则表达式字面量必须像直接调用 RegExp 构造函数一样,每次都创 建新的 RegExp实例
           
            RegExp实例属性 :
                第一个模式使用的是字面量,
                第二个模式使用了 RegExp 构造函数,但它们的 source 属性是相同的。
           
               RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。
            exec()接受一个参数,即 要应用模式的字符串,然后返回包含第一个匹配项信息的数组;
                  或者在没有匹配项的情况下返回 null。
           
                返回的数组虽然是 Array 的实例,但包含两个额外的属性
                    index 表示匹配 项在字符串中的位置,
                   而 input 表示应用正则表达式的字符串。
                  在数组中,第一项是与整个模式匹配 的字符串,其他项是与模式中的捕获组匹配的字符串
             test(),它接受一个字符串参数。在模式与该参数匹配的情况下返回 true;否则,返回 false;
            RegExp构造函数属性 :
            -->
    <!-- Function 类型  -->
        <!-- 每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。
             因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定
            在使用函数表达式定义函数时,没有必要使用函数名
            var sum = function(num1,num2){
                return num1 + num2;
            };
            一个函数可能会有多个名字
           
           
            函数声明与函数表达式
            解析器会率先读取函数声明,并使其在执行 任何代码之前可用(可以访问);
            至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真 正被解释执行
           
            函数声明:
            function sum(num1, num2){     return num1 + num2; }
            函数表达式:
            var sum = function(){};
            之所以会在运行期间产生错误,原因在于函数位于一个初始化语句中,而不是一个函数声 明。
           
            要访问函数的指针而不执行函数的话,必须去掉函数名后 面的那对圆括号
          
            可以从一个函数中返回另一个函数,而且这也是极为有用的一种技术。
             -->
<script>
    function createComparisonFunction(propertyName) {
        return function (object1, object2) {
            var value1 = object1[propertyName];
            var value2 = object2[propertyName];
            if (value1 < value2) {
                return -1;
            }
            else if (value1 > value2) {
                return 1;
            }
            else {
                return 0;
            }
        };
    }
    var data = [{ name: "Zachary", age: 28 }, { name: "Nicholas", age: 29 }];
    data.sort(createComparisonFunction("name"));
    alert(data[0].name);
</script>
        <!-- 函数内部属性
            arguments :是一个类数组对象,包含着传入函数中的所有参数
                这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
            this :
            -->
<script>
    function factorial(num) {
        if (num <= 1) {
            return 1;
        }
        else {
            //return num * factorial(num - 1);//函数执行和函数名紧密耦合,不灵活
            return num * arguments.callee(num - 1);//无论引用是函数名字是什么,都可以保证正常完成递归调用
        }
    }
    var trueFactorial = factorial;
    alert(trueFactorial(5));
</script>
            <!-- this:
                this 引用的是函数据以执行的环境对象——或者也可以说是 this 值(
                函数的名字仅仅是一个包含指针的变量而已。
                因此,即使是 在不同的环境中执行,全局的 sayColor()函数与 o.sayColor()指向的仍然是同一 个函数。
                 -->
<script>
    window.color = "red";
    var o = { color: "blue" };
    function sayColor() {
        alert(this.color);
    }
    sayColor();//red
    o.sayColor = sayColor;
    o.sayColor();//blue
</script>
        <!-- caller:
            保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null
原创粉丝点击