js
1.组成:
Core
JavaScript核心编程。内置的对象、方法等。
DOM
文档对象模型。JavaScript是一种嵌入式脚本语言,它也没有权利和义务提出如何控制浏览器的IO(输入和输出)方法。不同浏览器留出了允许JavaScript控制的接口,DOM是HTML和XML的应用程序接口(API),DOM能够把整个文档提炼为以节点为单元的树形结构,并具备检索树形结构、操作树形结构,以及编辑节点内容的能力。
BOM
BOM主要处理浏览器窗口和框架,不过浏览器一般把它看做是客户端JavaScript脚本语言的扩展,包括window对象、navigator对象、location对象、cookie操作支持、ajax支持等等。
2.复制、传递和比较数据
Numbers 和 Boolean 类型的值 (true 和 false) 是按值来复制、传递和比较的。当按值复制或传递时,即使更改原来的值,也不会影响所复制的值(反过来也一样),因为这两个值是独立的实体。
对象、数组以及函数是按引用来复制、传递和比较的。 当按地址复制或传递时,如果更改原始项,则将同时更改原始项和复制项(反过来也一 样)。实际上只有一个实体;“复本”并不是一个真正的复本,而只是该数据的又一个引用。
当按引用比较时,要想比较成功,两个变量必须参照完全相同的实体。例如,两个不同的 Array 对象即使包含相同的元素也将比较为不相等。要想检查两个数组是否包含了相同的元素,比较 toString() 方法的结果。
字符串是按引用复制和传递的,但是是按值来比较的,但字符串对象按引用比较。假如有两个 String 对象(用 new String("something") 创建的),按引用比较它们,但是,如果其中一个或者两者都是字符串值的话,按值比较它们。
3.typeof
语法:typeof[()expression[]];
typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: “number” , “string” , “boolean” , “object” , “function” 和 “undefined“。
typeof 语法中的圆括号是可选项。
特别注意,当x为对象、数组和null,typeof(x)返回“object”。
a === undefined; //报错
var b;
b === undifined; //返回true
typeof(c) == ‘undefined’; //返回true
用typeof来判断变量是否已初始化是最保险。
4.null
这是一个对象,但是为空。因为是对象,所以 typeof null返回 ‘object’ 。
null 参与数值运算时其值会自动转换为 0 。
5.undefined
undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 ‘undefined’ 。
当变量未申明,或申明未赋值时其初始值为undefined。
undefined参与任何数值计算时,其结果一定是NaN。
6.类型转换
String
var yy = “” + xx; //自动调用xx.toString()
Number(转换为数值就只有parseInt和parseFloat两个方法)
Var i = parseInt(“35px”); //返回35
Var j = parsetInt(“asdf”); //返回NaN
Var k = parseFloat(“36.6px”); //返回36.6
Var m = “123” * 1 + 1; // 返回124
7.JavaScript简化语法
数组
var arr = new Array(1, 2, 3, 4);
var arr = [1, 2, 3, 4];
对象
var obj = new Object();
var obj = {};
正则表达式
var regExp = new RegExp(“\d+”, “i”);
var regExp = /\d+/i;
8.This指针
在Javascript里面,this指针代表的是执行当前代码的对象的所有者。
var name = "Kevin Yang";
function sayHi() {
alert("你好,我的名字叫" + this.name);
}
sayHi(); //等价于window.sayHi()
全面的对象、变量、函数都属于window对象。当前代码是第3行,此代码块的对象是sayHi函数对象,而sayHi函数对象属于window对象,所以上面的this指向window对象。
9.函数解析
1>.在函数内部的最后,使用return arguments.callee; 可以返回函数自身
2>.下面示例在函数声明前调用函数也是合法的,并能够被正确解析,所以返回值为1。
f(); // 调用函数,返回值1
function f(){
alert(1);
}
但是,如果按下面方式定义函数,则JavaScript解释器会提示语法错误。
f(); // 调用函数,返回语法错误
var f = function(){
alert(1);
}
这是因为,上面示例中定义的函数仅作为值赋值给变量f,所以在预编译期,JavaScript解释器只能够为声明变量f进行处理,而对于变量f的值,只能等到执行期时按顺序进行赋值,自然就会出现语法错误,提示找不到对象f
10.一个经典代码:
Function.prototype.make = function(n, f){
this.prototype[n] = f;
}
// 定义类
var Box = function(){}
// 为类制造方法
Box.make("set", function(x){
this.x = x;
})
Box.make("get", function(){
return this.x;
})
这段主要的奇异点在第2行。在JS中,属性和方法可用数组方式访问,比如myDiv.id也可 以写成myDiv["id"],"asdf".substr(1,2)也可以写成"asdf"["substr"](1,2),知道了这一点奇异也就不再 “奇异”了。此处的属性是个函数,执行第7行时,与this.prototype.set=function(x) {...}的效果一样。
在jQuery的源码中有大量这样的用法,好处在于可以将函数名以字符串的方式传入,从而实现动态定义类的方法。