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(){}());
    

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

  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/xihe/p/6138628.html
Copyright © 2011-2022 走看看