概览
1995年,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。
JavaScript是按ECMAScript规范实现的一种脚本语言,其他的还有JScript、ActionScript。这三种语言还提供了ECMA规范外的额外功能。
完整的JavaScript实现由3个不同部分组成:
- ECMAScript:核心
- 文档对象模型(DOM):是HTML和XML的应用程序接口。DOM将把整个页面规划成由节点层级构成的文档。
- 浏览器对象模型(BOM)
基础概念:
- 程序是用Unicode字符集编写的。
- 区分大小写。
- 产量是弱类型的。
- 每行结尾的分号可有可无。
- 标识符(用来对变量和函数进行命名)必须以字母、下划线、美元符开始。
- 不区分整数值和浮点数值。所有数字均用浮点数值表示。
- 字符串是不可变的。
数据类型
数据类型分为两类:
- 原始类型(5种:Number、String、Boolean、null、undefined)
- 对象类型
ECMAScript没有字符类型,可用双引号或单引号声明字符串。
布尔值、数字、字符串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。
Number类型
ECMAScript默认把具有6个或6个以上前导0的浮点数转换成科学计数法。
Number.MAX_VALUE
Number.MIN_VALUE
**NaN(Not a Number)**表示非数。不能用于算术计算;它与自身不相等。函数isNaN
String类型
字符串字面量是由双引号或单引号声明的。而Java则是用双引号声明字符串,用单引号声明字符。由于ECMAScript没有字符类型,所以可使用这两种表示法中的任何一种。
类型转换
JavaScript可以自由地进行数据类型转换。
字符串转换成数字:parseInt()和parseFloat()。
强制类型转换
引用类型
对象是属性的集合,每个属性都由“名/值对”构成。
- Object类
- Boolean
- Number
- String
变量
变量是无类型的,变量可以被赋予任何类型的值,同样一个变量也可以重新赋予不同类型的值。
使用var关键字来声明变量。当声明的变量未初始化时,该变量的默认值是undefined。
// 如果未在声名语句中指定变量初始值,默认初始值为undefined
var i;
var i, j;
变量作用域
- 函数定义是可以嵌套的。
- JavaScript使用了函数作用域(function scope):变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。
var scope = "global";
function f() {
console.log(scope);// 输出“undefined”,而不是“global”
var scope = "local";// 变量在这里赋值初始化,但变量本身在函数体内任何地方均是有定义的
console.log(scope);// 输出“local”
}
f()
- 全局变量在程序中始终都是有定义的;局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的。
表达式与运算符
运算符分类:
- 算术运算符:+、-、*、/、%等
- 一元操作:++、--
- 逻辑运算符:!、&&、||
- 关系运算符
- 赋值操作:=、复合赋值(+=、-=、*=、/=)
- 特殊运算符:delete、instanceof、typeof
typeof:检测操作数类型
delete:删除属性
===:判断恒等,无类型转换返回true
!==:判断非恒等
问题 1:==与===的区别?
==表示先转换类型再比较;===先判断类型,非同一类型直接返回 false,类型相同,再判断值。
语句
- 条件语句:if/else、switch
- 循环语句:while、do/while、for、for/in
- 跳转语句,让解释器跳转至程序的其他部分继续执行,如break、return、throw
JavaScript中没有块级作用域,在语句块(花括号括起来的多条语句)中声名的变量并不是语句块私有的。
对象
JavaScript 除了字符串、数字、true、false、null 和 undefined 之外,其他值都是对象。
创建对象的方式:
- 对象直接量。由若干名/值对组成的映射表,名/值对中间用冒号分隔,之间用逗号分隔,整个映射表用花括号括起来。属性名可以是 JavaScript 标识符也可以是字符串直接量;属性值可以是任意类型的 JavaScript 表达式。
var empty = {}; // 没有任何属性的对象
var p = {id: 3, age: 56}; // 两个属性
var phone = {
"s color": "red",
manufacture: {
name: "xx"
}
};
- 通过 new 创建对象。
获取对象中的属性值
object.property
object["property"]
数组
JavaScript 数组是无类型的:数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型。数组的元素甚至也可能是对象或其他数组。
创建数组
// 方式一:使用数组直接量,方括号中将数组元素用逗号隔开即可。
var v = [2, true, 'a'];
// 方式二:调用构造函数 Array()
var a = new Array(); // 空数组
var a = new Array(10);
var a = new Array(5, 3, 'test');
数组元素增删
var a = [];
a[1] = 'one';
// push() 在数组末尾增加一个或多个元素
a.push('two');
a.push('one', 'two');
delete a[1]; // 删除索引 1 的元素。delete 操作并不影响数组长度。
1 in a; // => false:索引 1 并未在数组中定义
数组方法
join() // 将数组中所有元素转化为字符串并连接在一起
reverse()
函数
JavaScript里,函数即对象,程序可以随意操控它们。
JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量。
// 函数定义两种写法
var f = function(x) { return x+1; }
function f(x) {
return x+1;
}
function p(o) {
for(var p in o) {
console.log(p + ":" + o[p] + "\n");
}
}
var s = {x:1, y:2};
p(s)
类
其他
console
- console.log()
- console.error()
- console.warn()
- console.info()
常用浏览器
- Chrome
- Internet Explorer:简称IE。
- Firefox
- Safari
- Opera
参考
- JavaScript 权威指南 第6版
- JavaScript 高级程序设计 第3版