一、语法
1、标识符:
1、应以字母开头,可以包含一个或多个字母、数字,下划线(javascript规范中标识符可以包含字母、数字、_、$的组合,但不能以数字开头)
2、数字
1、内部是一个64为的浮点型数。不区分浮点型和整形,只需要知道是一个数。
2、可以声明含有指数部分的数字字面量,3.14e10 表示3.14 乘以10的10次方。
3、负数可以用前置的-表示
4、NaN 是一个数值,表示不能产生正常结果的运算结果,NaN不表示任何值,包括它自己。 isNaN(number)检测NaN。
5、infinity 表示所有大于 1.7976931348623157e+308 的数
3、字符串
1、字符串,可以包含在单引号和双引号之中。
2、反斜线\ 表示转义。\u 约定用来指定数字字符编码。
3、字符有一个length属性,表示字符长度"hello".length
4、字符串是不可变的一旦创建就不能改变它,可以用 + 号连接两个字符串,生成一个新的字符串
4、语句
1、不像其他语言,JavaScript中的代码不会创建新的作用域,因此变量应该定义在函数的头部,而不是代码块中
2、false、null、undefined、空字符串""、数字0、数字NaN 会被当成false 其他所有值都会被当成真
3、for in 语句会枚举一个对象的所有属性名,常用 object.hasOwnProperty(属性名) 来确定一个属性名是对像成员
二、对象
1、概述
1、JavaScript的简单数据类型包括数字、字符串、布尔值、null、undefined值,其他值都是对象。
2、javaScript中的对象是可变的键控集合,在JavaScript中数组是对象,函数是对象,正则表达式是对象,对象也是对象
3、对象是属性的容器,每个属性都有名字和值,属性的名字可以是包含空字符串的任意字符,属性值是可以除了undefined之外的任何值
4、象用于汇集和管理数据,对象可以包含其他对象,JavaScript对象是无类型的。对新属性的名字和属性的值没有限制
5、JavaScript 包含一种原型链的特征,允许对象继承另一个对象的属性,正确使用能减少对象的初始化消耗时间和内存
2、字面量创建对象
对象字面量创建对象,一个字面量就是包围在一对花括号中的零个或多个名/值对。对象字面量可以出现在任何表达式出现的地方。
var empty_object = {};
var stooge = {
"first-name": "Jerome",
"last-name": "Howard"
};
属性名可以包含空字符串在内的任意字符串,也就是说属性名可以不是标识符。如果属性名是合法的标识符则可以省略""号
var flight = {
'':"hello",//属性名可以包含空字符串
airline: "Oceanic",
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55",
city: "Sydney"
},
arrival: {
IATA: "LAX",
time: "2004-09-23 10:42",
city: "Los Angeles"
}
};
3、检索属性
如果属性是一个合法的标识符,有两种方式获取属性值 “[]” 和 “.” ,如果属性只是一个字符串则只能用[] 获取属性
var s = stooge["last-name"];
s = stooge["first-name"];
s = flight[""];
s = flight["airline"];
s = flight.airline;
s = flight.departure.IATA;
如果获取的属性不存在会返回undefined
s = flight["hello"];
console.log(s);
s = flight.abc;
console.log(s);
可以用||来为属性填充一个默认值
var middle = stooge["middle-name"] || "(none)";
var status = flight.status || "unknown";
从undefined的属性中获取值会抛出异常,可以使用&&来避免
flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment && flight.equipment.model // undefined
对象里的值可以通过赋值语句更新,若属性存在替换更新属性,若不存在则扩充添加到都对象中
stooge['first-name'] = 'Jerome';
stooge['middle-name'] = 'Lester';
stooge.nickname = 'Curly';
flight.equipment = {
model: 'Boeing 777'
};
flight.status = 'overdue';
对象之间通过引用来传递,永远不会复制。 每个对象都有一个原型对象,并且可以从中继承属性。通过字面量创建的属性都连接到Object.prototype,他是javaScript的标配对象。对象字面量创建的对象可以用obj.proto 获取原型对象
console.log(flight.__proto__ == Object.prototype);//true
console.log(flight.__proto__);
检索属性若对象没有这个属性会从对象原型中找,如果原型中也没有会从原型的原型中找依此类推最终到达Object.prototype,若还是没有就返回undefined,这个过程称为委托
原型是动态的。像原型对象中添加一个属性,所有基于该原型的对象都可见
var per1 = {
name:"zhangsan",
age:19
};
var per2 = {
name:"ergou",
age:18
}
console.log(per1.hello);//undefined
console.log(per2.hello);//undefined
Object.prototype.hello = "hello";
console.log(per1.hello);//hello
console.log(per2.hello);//hello
4、反射
typeof 返回变量的类型 obj.hasOwnProperty() 如果属性是对象自己独有的返回true
typeof flight.number // 'number'
typeof flight.status // 'string'
typeof flight.arrival // 'object'
typeof flight.manifest // 'undefined'
typeof flight.toString // 'function'
typeof flight.constructor // 'function'
flight.hasOwnProperty('number') // true
flight.hasOwnProperty('constructor') // false
5、枚举
for in 语句可以遍历出一个对象的所有属性,包括函数和原型中的属性。可以用typeof、hasOwnProperty() 过滤掉不想要的属性。属性名的顺序是不确定的
6、删除对象属性
delete运算符可以用来删除对象中的属性,不会删除原型中的属性。删除对象中的属性可能会让原型中的属性透现出来
7、减少全局变量污染
JavaScript可以随意的定义全局变量,全局变量可能带来不必要的麻烦。可以只定义一个全局对象作为变量容器
var MYAPP = {};
MYAPP.stooge = {
"first-name": "Joe",
"last-name": "Howard"
};
MYAPP.flight = {
airline: "Oceanic",
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55",
city: "Sydney"
},
arrival: {
IATA: "LAX",
time: "2004-09-23 10:42",
city: "Los Angeles"
}
};