《Javascript秘密花园》学习笔记(上)

来源:互联网 发布:js判断上传文件的类型 编辑:程序博客网 时间:2024/04/30 21:25

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关键字的使用

// 脚本 Afoo = '42';// 脚本 Bvar 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(){}());

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

0 0
原创粉丝点击