zoukankan      html  css  js  c++  java
  • 《Javascript秘密花园》学习笔记(上)

    Javascript秘密花园网络阅读地址

    对象

    JavaScript 中所有变量都可以当作对象使用,除了两个例外 null 和 undefined。

    JavaScript 的对象可以作为哈希表使用,主要用来保存命名的键与值的对应关系。

    哈希表是根据关键码值(Key value)而直接进行访问的种数据结构,它可以提供快速的插入操作和查找操作。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。参考阅读

    当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止。为了判断一个对象是否包含自定义属性而不是原型链上的属性, 我们需要使用继承自 Object.prototype 的 hasOwnProperty方法 。hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。

    在JavaScript中,一共有两种类型的值,原始值和对象值.每个对象都有一个内部属性[[prototype]],我们通常称之为原型.原型的值可以是一个对象,也可以是null.如果它的值是一个对象,则这个对象也一定有自己的原型.这样就形成了一条线性的链,我们称之为原型链。参阅阅读

    使用 hasOwnProperty 过滤

    // foo 变量是上例中的
    for(var i in foo) {
        if (foo.hasOwnProperty(i)) {
            console.log(i);
        }
    }

    函数

    函数是JavaScript中的一等对象,这意味着可以把函数像其它值一样传递。 一个常见的用法是把匿名函数作为回调函数传递到异步函数中。
    function test(){}声明的方法(函数)会在执行前被 解析(hoisted),因此它存在于当前上下文的任意一个地方, 即使在函数定义体的上面被调用也是对的。
    闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。 因为 函数 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数(在外部函数中返回某函数)。
    模拟私有变量

    function Counter(start) {
        var count = start;
        return {
            increment: function() {
                count++;
            },
    
            get: function() {
                return count;
            }
        }
    }
    
    var foo = Counter(4);
    foo.increment();
    foo.get(); // 5
    

    在循环中使用闭包获得循环序号,最好使用 匿名包装器(自执行匿名函数,e.g.(function(){})();)

    for(var i = 0; i < 10; i++) {
    //创建变量 i 的拷贝e。
        (function(e) {
            setTimeout(function() {
                console.log(e);  
            }, 1000);
        })(i);
    }

    函数的arguments变量(并不是数组Array)维护着所有传递到这个函数中的参数列表。转化数组

    //创建一个新的数组,包含所有 arguments 对象中的元素。
    Array.prototype.slice.call(arguments);

    arguments 对象不管是否有被使用总会被创建,除了两个特殊情况 - 作为局部变量声明和作为形式参数

    apply与call的用法意义及区别:
    call([thisObj[,arg1[, arg2[, [,.argN]]]]])
    两个方法的作用都是一样的。调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。但两者在参数上有区别的。
    第一个参数意义都一样,但对第二个参数:
    apply传入的是一个参数数组,而call则作为call的参数传入(从第二个参数开始)。
    e.g. func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])
    同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入。

    JavaScript 中的构造函数和其它语言中的构造函数是不同的。 通过 new 关键字方式调用的函数都被认为是构造函数。
    尽管 JavaScript 支持一对花括号创建的代码段,但是并不支持块级作用域; 而仅仅支持 函数作用域。

    function test() { // 一个作用域
        for(var i = 0; i < 10; i++) { // 不是一个作用域
            // count
        }
        console.log(i); // 10
    }

    var关键字的使用

    // 脚本 A
    foo = '42';
    
    // 脚本 B
    var foo = '42'

    上面两段脚本效果不同。脚本 A 在全局作用域内定义了变量 foo,而脚本 B 在当前作用域内定义变量 foo。不使用 var 声明变量将会导致隐式的全局变量产生。

    JavaScript 中局部变量只可能通过两种方式声明,一个是作为函数参数,另一个是通过 var 关键字声明。

    名称解析顺序

    JavaScript 中的所有作用域,包括全局作用域,都有一个特别的名称 this 指向当前对象。

    函数作用域内也有默认的变量 arguments,其中包含了传递到函数中的参数。

    比如,当访问函数内的 foo 变量时,JavaScript 会按照下面顺序查找:

    1.当前作用域内是否有 var foo 的定义。
    2.函数形式参数是否有使用 foo 名称的。
    3.函数自身是否叫做 foo。
    4.回溯到上一级作用域,然后从 #1 重新开始。
    

    推荐使用匿名包装器(自执行的匿名函数)来创建命名空间。

    // 两种方式,等价
    +function(){}();
    (function(){}());
    

    这样不仅可以防止命名冲突, 而且有利于程序的模块化。

  • 相关阅读:
    pip安装不成功的解决办法
    nginx常用的请求头参数和防DDOS攻击
    nginx报错:‘open too many files’解决
    nginx根据http_user_agent来拦截访问
    centos7安装logstash
    aws创建实例ec2时关联IAM
    docker清理多余的镜像和stop的容器
    理想
    +: indexed part-select
    Features Download Pricing Mind Maps Blog XMind的快捷键
  • 原文地址:https://www.cnblogs.com/xihe/p/6138628.html
Copyright © 2011-2022 走看看