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

来源:互联网 发布:js判断上传文件的类型 编辑:程序博客网 时间:2024/06/08 17:24

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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝客服不说话也不发货怎么办 面对不说话的客人怎么办? 卖家客服不回复怎么办 2周小孩说话结巴怎么办 微信群里只领红包不说话的人怎么办 躺在微信不说话的客户怎么办 9岁儿童说话结巴怎么办 5岁儿童说话结巴怎么办 京东客服不说话怎么办 两岁宝宝说话有点结巴怎么办 孩子不敢跟外人说话怎么办? 孩子不爱跟外人说话怎么办 别人说我不说话怎么办 衣服屁股那块变亮怎么办 小孩家里说话外面不说话怎么办 2个月小宝宝便秘怎么办 3个月小宝宝便秘怎么办 微信客户不说话怎么办 一岁半宝宝便秘肛裂怎么办 网恋现在都不说话了怎么办 宝宝便秘四天了怎么办 月子里小孩吐奶怎么办 月子里的小孩吐奶怎么办 婴儿吃多了吐奶怎么办 20个月孩子便秘怎么办 一岁宝宝肛裂怎么办 婴儿吃饱了吐奶怎么办 23天新生儿吐奶怎么办 婴儿吐奶舌苔白怎么办 宝宝吐奶酸臭味怎么办? 1周岁吐奶有酸味怎么办 十多天的宝宝吐奶怎么办 未满月婴儿吐奶怎么办 2个月宝宝溢奶怎么办 四岁宝宝说话结巴怎么办 小孩说话结巴打顿怎么办 2岁宝宝突然说话结巴怎么办 2岁宝宝突然结巴怎么办 幼儿舌头起泡牙龈出血怎么办 小孩长得太快怎么办 脑出血压着神经不会说话怎么办