JavaScript权威指南下载

词法结构

javascript是Unicode字符集编写,是ASCII和Latin-1的超集

区分大小写      //单行注释    /*一段注释*/

直接变量:12    1.2    "hello world"    true    false    /javascript/gi(正则表达式直接量)    null

标识符,必须以字母、下划线、美元符号开始

类型、值和变量

//Math对象的属性定义的函数和常量
Math.pow(2,10)    // 2的10次幂
Math.round(.6)    // 1.0 四舍五入
Math.ceil(.6)    // 1.0 向上求整
Math.floor(.6)    // 0.0 向下求整
Math.abs(-5)    // 5 取绝对值
Math.max(1,2,3)    // 3 返回最大值
Math.min(1,2,3)    // 1 返回最小值
Math.random()    // 生成0-1之间的伪随机数
Math.PI    // π 圆周率
Math.E    // e 自然对数的底数
Math.sqrt(3)    // 3的平方根
Math.pow(3,1/3)    // 3的立方根
Math.sin(0)    // 三角函数 还有:Math.cos, Math.atan等
Math.log(10)    // 10的自然对数
Math.log(100)/Math.LN10    // 以10为底100的对数
Math.log(100)/Math.LN2    // 以2为底100的对数
Math.exp(3)    // e的三次幂
Infinity 正无穷的      NaN 非数字值

Javascript采用IEEE-754浮点数表示法(几乎所有现代编程所采用),
这是一种二进制表示法,可以精确分数(1/21/81/1024),而并不能精确表示类似0.1这样的数字

var x=.3-.2;    var y=.2-.1;    x==y //false 两值不相等
//字符串属性及方法
var s='hello, world';

s.length   //字符串s的长度
s.charAt(0)  // h 第一个字符
s.charAt(s.length-1)  // d 最后一个字符
s.substring(1,4)   // ell 第2-4个字符
s.slice(1,4)   // ell
s.slice(-3)   // rld 最后三个字符
s.indexOf('l')   // 2 字符l第一次出现的位置
s.lastIndexOf('l')   // 10 字符l最后一次出现的位置
s.indexOf('l',3)   //3 在位置3及之后首次出现字符l的位置
s.split(', ')   // ["hello","world"] 分割成数组
s.replace('h','H')   // "Hello, world" 全文字符替换
s.toUpperCase()   // 'HELLO, WORLD' 转大写
//两个对象比较非值的比较
var o={x:1},p={x:1};
o===p   // false  两个单独对象永不相等 
var a=[],b=[];
a===b   // false  两个单独数组永不相等

//引用比较
var a=[];
var b=a;   // b引用同一个数组
a===b   // true a与b引用同一个数组,因此相等

//如果需要比较单独的对象或数组,需遍历它们的属性或元素再做比较
//转换方法
var n=17;
n.toString(2) // 10001
"0"+n.toString(8)  // 021
"0x"+n.toString(16)  //0x11

//数字转换
var n=123456.789;

n.toFixed(0) // 123456
n.toFixed(2) // 123456.79
n.toFixed(5) // 123456.78900

n.toExponential(1) // 1.2e+5
n.toExponential(3) // 1.235e+5

n.toPrecision(7)  // 123456.8
n.toPrecision(10) // 123456.7890

parseInt()
parseFloat()

//得到原始值,没有则返回对象本身,时间会转成毫秒数
valueOf()
//JavaScript对象转字符串
先调ToString()方法 没有则调用valueOf() 再没有就抛出类型异常

//JavaScript对象转数字
先调valueOf()方法 没有则调用ToString() 再没有就抛出类型异常
var scope='global';
function fn(){
  console.log(scope); //输出undefined,而不是global
  var scope='local'; //变量这里赋初始值,但变量在函数体内任何地方均有意义(变量声明“提前”至函数体顶部)
  console.log(scope); //输出local
}

表达式和运算符

//不管哪种属性访问表达式,在使用“.”和“[”之前,会计算结果是null或undefined则会抛出异常,因为这两个值都不包含任意属性
//如果命名的属性不存在,属性访问表达式的值就是undefined
//如果属性名字是一个保留字或包含空格和标点符,或数字,则必须使用方括号"[]"
//函数体返回return的值,没有则值为undefined
//对象创建表达式
new Object()
new Object //不传参给构造函数,可省略空圆括号
//in运算 判断对象是否有某属性
var point={x:1,y:1};
"x" in point; //true
"z" in point; //false
"toString" in point; //true 对象继承了toString()方法
//instanceof运算 (左侧的对象是右侧类的示例为true 反之false)
var d=new Date();
d instanceof Date; //true
d instanceof Object; //true
d instanceof Number; //false
var a=[1,2,3];
a instanceof Array; //true
a instanceof Object; //true
//eval()函数
直接调用eval解析为局部范围
别名调用eval解析为全局范围
//IE9之前的的版本 eval 都为局部范围,可用execScript()来代替(但总是返回null)
//delete 一元操作符 删除对象属性或数组元素
//删除数组的某一元素 数组的长度(length属性)没有改变
//不能删除通过var声明的变量

语句

//JavaScript没有块级作用域,在语句块中声明的变量并不是语句块私有的
//JavaScript数组是一种特殊的对象,因此,for/in循环可以枚举对象属性一样枚举数组索引
//break和continue是JavaScript中唯一可以使用语句标签的语句
mainloop: while (token != null) {
    continue mainloop;
}
//从标签名开始
compute_sum: if (matrix) {
    for (var x = 0; x < matrix.length; x++) {
        var row = matrix[x];
        if (!row) break compute_sum;
        for (var y = 0; y < row.length; y++) {
            var cell = row[y];
            if (isNaN(cell)) break compute_sum;
            sum += cell;
        }
    }
    success = true;
}
//break语句跳转至此
break语句带不带标签,它的控制权都无法越过函数的边界
continue语句和break语句类似,用在嵌套的循环中,可以跳出多层次的嵌套的循环体逻辑
breakcontinue语句在跟标签的时候不能有换号(因为JavaScript解析器会把换行补上分号;)

try-catch-finally
try先执行 出错先catchfinally 如果trycatchreturn 再返回之前会执行finally 
如果finallyreturn语句,尽管已抛出异常,都会替代原抛出的异常正常的返回。

对象

ECMAScript5中,对象直接量中的最后一个属性后的逗号将会忽略
ECMAScript3中,   大部分实现了可忽略这个逗号,(IE8-、Opera会报错)

检测属性:in、hasOwnPreperty()、propertyIsEnumerable() propertyIsEnumerable继承的属性不算

数组

//数组的length属性,可指定长度,会删除或新增一些项,新增的值为undefined
//delete删除数组的某项,length长度不变,值会变成undefined

//在嵌套循环里面数组的长度应该只查询一次
for (var i = 0, len = keys.length; i < len; i++) {
    //循环体
}
map()方法将调用的数组的每个元素传递给指定的函数,并返回一个数组,不改变原数组的值

//isArray()函数
var isArray = Function.isArray || function (o) {
    return typeof o === "object" && Object.prototype.toString.call(o) === "[object Array]";
};

函数

函数里面的 arguments 对象非数组,arguments.callee属性指代当前正在执行的函数,调用匿名函数非常有用 

//数组直接量
var a = [function (x) { return x * x; }, 20];
a[0](a[1]); // 400
Function()构造函数,全局作用域中执行的eval(),循环构造函数,执行效率会瘦影响

//IE8- 非函数,为可调用的宿主对象,而非内置函数,非Function对象,IE9实现为真正的函数
window.alert();
document.getElementById()

留言

ˆ