概况
JavaScript区分大小写
ECMAScript5 保留5个关键字
Class const enum export extends import super
严格还有argument eval
语句结束可选分号
JavaScript数据类型分两类:
原始类型primitive type
数字、字符串、布尔值、null和undefined
对象类型
object、全局object、函数
JavaScript解释器有自己的内存管理机制,自动垃圾回收,是一种面向对象的语言
JavaScript变量是无类型的,用var来声明。变量采用词法作用域,在函数外的是全局变量,函数内的局部变量
JavaScript不区分整数和浮点值,均为64位浮点,最大+-1.79e308,最小+-5e-324,负号是一元求反运算符,不是数字直接量语法测的组成部分。整数支持十六进制表示如0xfa。严格模式不支持8进制。
算数运算
Math.pow(2,53) | 2的53次幂 |
Math.round(.6) | 0.6四舍五入 |
Math.ceil(.6) | 向上求整 |
Math.floor(.6) | 向下求整 |
Math.random() | 生成一个在[0, 1)区间的伪随机数 |
被0除返回无穷大Infinity,无意义的运算返回NaN如0/0或Infinity/Infinity。Number.MAX_VALUE+1是Infinity。
NaN与任何值都不相等,包括自身。所以无法用x==NaN来判断x是不是NaN,而应该用x!=x来判断或用isNaN()
isFinite()在参数不是NaN,Infinity和-Infinity的时候返回true。负零等于正零,但作为除数时除外。
JavaScript浮点数有足够的精度,但不能精确表述
日期时间
var now = new Date(2013, 0, 1) //2013年1月1日
var later = new Data(2013, 0, 1, 17, 10,30) //用一天,当地时间17:10:30pm
var elapse = later - now;
later.getFullYear()
later.getMonth()
......
字符串
JavaScript使用UTF-16,大部分字符都是16位的。Html中字符串单引号双引号处理建议:
<button οnclick="alert('Thank\'s buddy!')">ClickMe</button>
var s = "hello, world"
s.charAt(0) //"h"
s.charAt(s.length-1) //"d"
s[s.length-1] //"d" ECMAScipt5支持这种表示
s.substring(1,4) //"ell"
s.slice(1,4) //"ell"
s.slice(-3) //"rld"
s.indexOf("1") //2
s.lastIndexOf("1") //10
s.indexOf("1", 3) //3 在位置3及以后首次出现字符1的位置
s.split(", ") //["hello", "world"]
s.replace("h", "H")
s.toUpperCase()
记住,这些方法都返回编辑后的字符串,原字符串不变
正则表达式的模式匹配
var text = "testing 1,2,3"
var pattern = /\d+/g //g代表所有,类似还有i表示忽略大小写
text.search(pattern) //返回首次匹配成功的位置
text.match(pattern) //返回所有匹配组成的数组
text.replace(pattern, "#") ;//替换所有匹配
text.split(/\D+/) //用非数字字符截取字符串
null和undefined
除null或undefined之外的任何值都具有toString()方法,结果通常和String()返回结果一致
显式类型转换
Number("3") //3
String(false) //"false"
Boolean([]) //true
Object(3) //new Number(3)
数字转换
var n = 123456.789
n.toFixed(0); //"123457"
n.toFixed(2); //"123456.79"
n.toFixed(5); //"123456.78900"
n.toPrecision(7); //"123456.8"
parseInt("3 blind mice") //3
parseFloat("3.14 miteers") //3.14
parseInt()可以接收第二个可选参数,指定数字转换基数,2~36
=、==和===运算符
几个JavaScript特点的运算符:
delete | 删除属性 var o = {x:1, y:2}; delete o.x; |
typeof | 检测操作数类型 (typeof value == "string") ? "'" + value + "'" : value typeof null返回object typeof一个函数返回function |
>>> | 无符号右移(>>是有符号右移) |
和=== | 恒等,==会在比较时自动类型转换,而===不会 |
!== | 恒非等 |
void |
|
in
| var point = {x:1, y:1}; x in point; //返回true |
instanceof | var d = new Date(); d instance of Date; //为计算这个表达式,JavaScript先计算Date.prototype,然后在d的原型链中查找有没有Date.prototype。 |
原型链
对象中存在一个隐藏的成员,这个成员指向其父的原型,如果父类的原型是另外一个类的实例的话,则这个原型对象中也存在另一个隐藏成员指向另一个原型
eval()函数
eval()只有一个参数,若参数为字符串,则会将字符串当成JavaScript代码进行编译,若编译成功,则开始执行这段代码,并返回代码中最后一个表达式语句的值。
eval使用了调用它的变量作用域来处理字符串中变量的作用域
语句
JavaScript支持for(varp in o)循环表示,每次循环将属性名字赋给变量p
debugger语句
use strict语句
对象
Object.create()静态方法
一个现在看不大懂但以后会经常用到的函数
function inherit(p) {
if (p == null) throw TypeError();
if (Object.create)
return Object.create(p);
var t = typeof p;
if (t !== "object" && t !== "function")throw TypeError();
function f() {};
f.prototype = p;
return new f();
}
属性赋值要么失败,要么创建一个属性,要么在原始对象中设置属性
一种简练的,可以避免因属性不存在而报错的方法:
var len = book && book.subtitile &&book.subtitle.length;
hasOwnProperty()检测属性是否存在于某个对象中
var o = {x: 1};
o.hasOwnProperty("x"); //返回true
perpertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到自由属性且这个属性可枚举才返回true
除了用in之外,另一种更简单的方法判断一个属性是否是undefined
var o = {x: 1};
o.x !== undefined; //返回false
"x" in o //返回true
属性 getter和setter的定义:不用冒号,例:
var o = {
data_prop: value,
get accessor_prop() {},
set accessor_prop(value) {}
}
描述数据属性的属性有value, writable, enumerable和configurable,用Object.getOwnPropertyDescriptor()能得到属性的特性
对象的三个属性,原型prototype、类class和可扩展性extensible attribute
原型属性
是用来继承属性的,非常重要,经常将o的原型属性直接叫做o的原型
用isPrototypeOf()来检测一个对象是否是另一个对象的原型
类属性
可以用toString()然后slice(8, -1)来获得类属性
可扩展性
表示是否可以给对象添加新属性
序列化对象
使用JSON.stringify()和JSON.parse()来序列化和还原JavaScript对象
o = {x:1, y:{z:[false, null, ""]}};
s = JSON.stringify(o);
p = JSON.parse(s);
对象方法
toString(), toLocaleString(), toJSON(), valueOf()
数组
稀疏数组,可以用Array()或简单指定数组索引值大于当前数组长度来创建稀疏数组
数组长度用o.length获取和设置,当设置的长度小于当前长度,多出来的会被删除。可以用Object.defineProperty()让数组的length属性变成只读的
JavaScript不支持多维数组,但可以用数组的数组来近似,如
var table = new Array(10);
for (var i=0; i<table.length; i++) {
table[i] = new Array[10];
}
数组方法
joint()将数组中所有元素转化为字符串并连接在一起
reverse()反转, sort()排序(可指定参数自定义排序函数), slice()返回子数组,参数是起始和末尾下标
slice()插入或删除数组元素的通用方法,push()和pop()能将数组当作栈来使用,
unshift()和shift()类似于push和pop,区别是shift是在头部而非微博进行插入和删除操作,
toString()和toLocaleString()
ECMAScript5中的数组方法
forEach(), map(), filter(), every()和some(),reduce()和reduceRight(), indexOf()和lastIndexOf()
检测数组类型
o instanceof Array或Array.isArray()
字符串也可以作为数组来对待,但区别是字符串数组是不可更改的
函数
构造函数调用:若没形参则可以省略括号如var o = new Object;
间接调用:使用call()和apply()
变长实参列表:实参对象。即可以在函数体内用arguments[x]来获得第x个参数
可以将函数对象用作属性值