前端代码学习笔记 javascript

1,数据类型

只有简单的number,string,boolean等少量类型,都是var来定义。
string是固定的,不想objc和java,分可变固定两种。

倘若var定义一个 变量,没赋初值,那它的值就是undefined。

2,函数参数

参数名字居然没有实际意义,仅仅是标识而已。参数在一个类似数组里面放着,argument带下标就可以去到参数,length可拿到参数个数。函数可以接受任意个参数,所以在func实现中,可以用length判断,不同参数个数对应不同功能,这就 好比c语言中的重载 啊。虽然javascript语言本身并没有重载的概念。

这种函数参数的灵活性,程序员可以方便传入大量可选参数。通常做法,必须值使用命名参数,用个args对象封装多个 可选参数,在函数实现中,根据typeof来判断,分别处理。

3,引用类型

javascript不能直接访问内存位置,也就是说不能像C一样直接操作对象的内存空间。引用类型的值是引用访问的,譬如那些object对象,我们可以动态添加其属性。

String在java等语言中是一个 对象,而在javascript中它是一个基本类型,同number一样,基本对象都是按值访问的。

javascript函数的参数传递,全部是 按值传递的。如果 是基本类型,就是copy一份;如果 是object引用类型,就是把引用的名字copy一份,两指向的还是同一个内存空间,(感觉这跟引用传递object对象一个 意思啊)。

typeof可以检测一个变量是否基本类型。instanceof检测应用类型是一个具体什么对象。
var b = true;
alert(typeof b);//boolean

alert(colors instanceof Array); //判断colors是否为array数据类型

4,执行环境

javascript最为重要的一个概念,每个执行环境都有一个与之关联的变量对象。
最外围的全局执行环境就是window对象。

执行环境掌管着代码执行过程中的内存,开发人员不需要关心。其实垃圾回收机制原理很简单,就是不在 继续用的内存,回收。一般按照固定时间间隔启动垃圾回收。

变量不在用的时候置为null,告诉环境不需要了,但不会立即释放,得等到下一个垃圾回收启动。

5,Array数组

JS中常见的数据类型。创建数组两种方式:

1,直接new: var colors = new Array(3); new关键字可以省略。
2,赋值方式: var colors = [“blue”,”green”,”red”];
如果这样: var colors = []; 则创建一个空数组。

不同于其他 语言,JS数组的length居然是可读写的。也就是说可以修改length值控制数组大小。
譬如上面的colors,若colors.length = 2,那colors[2]下标的值不是red,而是undefined

还可以通过这一特性,直接往数组尾部添加新项
colors[colors.length] = “black”;
colors[colors.length] = “brown”;

Array可以拓展为stack栈,list队列。根据不同的调用方法,pop(出栈),push(压栈),shift(取队首)
这三个 方法 都 会影响Array的length大小。

Array提供sort排序方法 ,接受比较函数作为参数,这就比较灵活啦。

6,Function函数

函数也是对象,即 Function的一个实例。下面两种方式一样的意思:

function sum (num1,num2)
{
return num1+num2;
}

var sum = function(num1, num2){ return num1 + num2 };

既然函数是 一个对象,那就可以 当作参数传递。
函数的两个内部属性,一个argumente上面讲过了,另外一个this同java和c++中差不多意思,代表函数的环境对象。
如果在网页 的 全局作用域中,this对象引用的就是window·

7, JS没有类

通过Construct Function来创建对象,这种特殊函数不带return,使用的时候直接new
这里写图片描述

还可以通过工厂模式,其实还是函数封装来创建对象,如下图:
这里写图片描述

每一个函数,以及 对象都有prototype, 带一个指针, 指向关系如下图:
这里写图片描述

prototype有什么用? 感觉像java的静态变量,当作instance实例的初始化默认值吧。可以覆盖改写的:
这里写图片描述

8 ,JS如何实现继承

9,搞清楚匿名函数和闭包

闭包是什么函数,就是那些有权访问其它函数域中变量的函数。譬如函数嵌套中,嵌套函数就能访问外部函数中的变量,同一执行环境。当你return嵌套的内部函数时,就是一个闭包。http://kb.cnblogs.com/page/110782/
这个帖子翻译的比较清楚。

function里嵌套function时,内部的function可以访问外部function里的变量。
function foo(x) {
    var tmp = 3;
    function bar(y) {
        alert(x + y + (++tmp));
    }
    bar(10);
}
foo(2)

不管执行多少次,都会alert 16,因为bar能访问foo的参数x,也能访问foo的变量tmp。

但,这还不是闭包。当你return的是内部function时,就是一个闭包。
内部functionclose-over外部function的变量直到内部function结束。

function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);

上面的脚本最终也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar还是能访问x和tmp。

闭包可能令代码难以理解和调试,JS库有bind方法,可将函数绑定到指定环境。

匿名函数很好理解,就是没有函数名,直接Function后面跟函数实现的代码。

10,JS是单线程语言

包括那些定时器实现,如:setTimeout和setInterval,执行时机并不能保证。事件处理程序,Ajax回调函数,都在一个线程里面运行着。浏览器好比OS,调度这些任务。

浏览器严格限制JS代码执行时间,避免JS获取过多资源,直接把计算机整崩溃了。我们有时会看到一个弹出框,告诉用户某个脚本用时过长,允许继续执行还是停止它。通常是函数过长执行或者过深嵌套。设置超时时间来限制下,还有任务分组、函数节流等方法。

11,识别浏览器

navigation识别客户端浏览器,其 plugins检测浏览器安装的插件。

检查浏览器和平台,做好兼容性的前提。用户代理字符串,见证了浏览器发展史。
微软发布IE浏览器后,由于Netsacape占据市场绝大数份额,也就是后来的firefox。所以微软将IE的用户代理字符串修改成Netscape兼容的 形式,就是伪装自己跟龙头一伙的。

目前 有IE,safari, opera,以及 老牌的firefox。平台linux,windows,mac
safari和chrome都用的webkit引擎,但javascript引擎却不同。

12,H5的变化

websoket让浏览器和服务器实现了全双工通讯。

支持离线的web应用是html5的又一特点。web开发者一直希望能与传统的PC客户端同场竞技。
h5提供了网络监测、应用缓存。以前都是cookie来存储,这么多年了,web storage想有所突破,可以跨会话。
IndexedDB则走的 更远了,直接弄一异步数据库来存储数据,感觉都要抛弃server了。呵呵,玩笑话。

HTML5中对表单的输入框提供原生验证,可以不用JS代码来做内容验证了 。

一些新的 有用API,像地图定位、本地文件访问、判断页面可见……..


一些经验点

在使用InnerHTML、OutHTML时候,最好先手工删除要被 替换的元素的所有事件处理程序和javaScript对象属性

一般来说,在 插入大量HTML标记时,使用InnerHTML属性与通过多次DOM操作先创建节点再指定他们之间的 关系相比,效率要快的 多。

不可避免地,创建和销毁HTML解析器也 带来性能损失,所以最后能将InnerHtML和OutHTML的使用次数控制在合理范围内。

事件处理越多,性能越慢。这些函数都是对象,要占用内存,浏览器代码与交互式js代码建立连接。我们通常用委托代理,即在元素上层做事件,同时删除空事件处理程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值