JavaScript学习笔记-JavaScript概述
特点
具有面向对象能力的、解释性的程序语言
基于对象和事件驱动,并具有相对安全的客户端脚本语言
松散性:变量不必具有一个明确的类型
对象属性:对象把属性名映射为任意的属性值
继承机制:基于原型的继承机制
ECMA(欧洲计算机制造商协会)标准化:ECMAScript,ECMA-262
JavaScript核心
核心(ECMAScript)
文档对象模型(DOM):HTML中的树
浏览器对象模型(BOM):没有标准
ECMAScript组成:语法、类型、语句、关键字、保留字、操作符、对象
语法
区分大小写
标识符组成:字母、、$开头,其他字符为字母、数字、、$
字面量:{x:1, y:2}对象字面量表达式;[1, 2, 3, 4, 5]数组字面量表达式
声明变量:var box; var box = 100; 声明变量没有初始化时值为undefined
var box = 100;和box = 100;作用域不同
数据类型
5种简单数据类型:undefined、null、boolean、number、string
1种复杂数据类型:object
不支持自定义数据类型
typeof 获取变量类型
{}为空的对象,对象已创建,但没有东西;null为空对象,表示没有创建
var box = {};和var box = new Object();相同
typeof为操作符,而非函数
建议变量声明时初始化;var box = ""; var box = 0; var box = false; var box = null;
undefined派生于null,两者相等,但类型不同,所以 undefined == null true; undefined === null false
number类型:八进制0开头,16进制0x开头
单引号和双引号用于字符串时完全相同,但必须成对
运算符
===表示恒等,需要类型和值均相等才为true
逻辑运算&& || !
函数
JavaScript函数不支持重载
对象和数组
对象包含属性和方法
对象属性名可以加引号,与不加引号相同
数组中每个元素可以保存任何类型
数组也是object类型
toString()方法和valueOf()方法作用相同
数组拥有栈方法push()和pop(),后进先出
数组拥有队列方法push()和shift(),先进先出,unshift()方法可为数组前端添加元素
reverse()逆向排序,sort()正向排序,可以传排序函数作为参数
splice()方法可以支持删除、增加、替换元素
函数类型
函数实际上是对象
函数可以作为参数传递给函数
函数内部有两个特殊的对象arguments和this
arguments包含了传入函数的所有参数
arguments.callee指向函数本身
函数有两个属性length和prototype
变量、作用域和内存
变量类型:基本类型(放在栈)和引用类型(放在堆中的对象)
所有函数参数都是按值传递,不会按引用传递
数组、对象、正则表达式都是对象
instanceof Array、instanceof Object、instanceof RegExp
全局变量和局部变量
没有if/for类块级作用域
函数中带var为局部,不带var为全局,不建议不使用var来初始化变量
JavaScript具有自动垃圾收集机制
一旦不再使用,将其设置为null,加速垃圾回收
内置对象
Global和Math
全局变量和全局函数,均属于Global对象
eval方法执行字符串代码
面向对象与原型
JavaScript没有类的概念,只有对象
工厂函数可以解决多个对象重复实例化的问题
可以采用构造函数创建特定对象,构造函数类似其他语言中的类
构造函数:第一个字母必须大写;必须new 构造函数
构造函数用普通函数方式调用一般无效,必须使用new运算符
每个函数都有一个prototype属性,它是个对象
JavaScript继承依靠原型链实现
function Box() {
this.name = "Lee";
}
function Desk() {
this.age = 100;
}
Desk.prototype = new Box();
var desk = new Desk();
console.log(desk.age);
console.log(desk.name);
匿名函数和闭包
闭包是指有权访问另一个函数作用域中的局部变量的函数
优点同时是缺点:可以把局部变量驻留在内存中,可以避免使用全局变量
function box() {
var age = 100;
return function() {
age ++;
return age;
}
}
var b = box();
console.log(b());
console.log(b());
因会更加消耗内存,建议在非常必要时使用闭包
闭包不属于对象的属性或方法,在运行时this指向window