一:Function类型
每个函数都是Function类型的实例。而且函数是对象,因此函数名实际上是指向函数对象的指针,不会与某个函数绑定
function add(a,b) {
return a + b;
}
var sum = function(a,b) {
return a + b;
};
*解析器会率先读取函数声明并加到执行环境中,函数声明提升。
*函数表达式则必须等到解析器执行到他所在的代码行才会真正被解析。因为函数位于初始化语句中,执行所在行前变量名是不会保存对函数的引用。
*要访问函数的指针而不是执行函数的话,去掉函数名后面的()。
alert(add(1)); //3
alert(sum(1,2)); //报错
function add(a) { //函数声明提升
return a + 10;
}
var sum = function(a,b) {
return a + b;
};
var otherAdd = function(add,10) { //add作为参数传递
alert(otherAdd)
}
*每个函数包含两个属性:length和prototype
- length:函数接受的命名参数的个数
- prototype:属性不可枚举所以使用for-in无法发现
*每个函数有两个非继承而来的方法:apply()和call()。用于在特定的作用域中调用函数,实际上等于设置函数体内this对象的值
function sum(num1,num2) {
return num1 + num2;
}
function callSum(num1,num2) {
return sum.call(this,num1,num2); //传递的参数逐个列举出来
}
function applySum(num1,num2) {
return sum.apply(this,[num1,num2]); //传递的参数是数组
}
*EMCAScript5定义了一个方法bind()。这个方法会创建一个函数的实例,其this会被绑定到传给bind()函数的值。
window.color = "red";
var 0 = {color: "blue"};
function sayColor() {
alert(this.color);
}
var objSay = sayColor.bind(o);
objSay(); //blue
二:基本包装类型
EMCAScript还提供三个特殊的引用类型:Boolean、Number、String
*这些类型和其他引用类型相似,但同时也具备与各自基本类型相对应的特殊行为。实际上,每当读取一个基本类型值得时候,后台会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
例:
var s1 = "some text";
var s2 = s1.subString(2);
/*第二行代码等用于*/
var s1 = new String("some text"); //创建String类型的一个实例
var s2 = s1.subString(2); //在实例上调用指定的方法
s1 = null; //销毁这个实例
区别:
- 使用new创建的引用类型实例,在执行流离开当前作用域之前都一直保存在内存中。
- 自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立刻被销毁。意味我们不能再运行时为基本类型值添加属性和方法。
var s1 = "text";
s1.color = "red";
alert(s1.color); //undefined
1、Boolean类型
var falseObj = new Boolean(false); //布尔表达式中所有对象都会被转化为true
alert(falseObj && true); //true
var falseValue = false;
alert(falseValue && true); //false
alert(typeof falseObj); //object
alert(typeof falseValue); //boolean
alert(falseObj instanceof Boolean) //true
alert(falseValue instanceof Boolean) //false
2、Number类型
*toString(x):传递一个表示基数的数,告诉他是几进制,返回一个字符串形式
*toFixed(x):会按照指定的小树位返回数值的字符串表示
*toExponential():返回以指数表示法表示的数值字符串
3、String类型
var str = "hello";
alert(str.charCodeAt(1)); //101 --> e的字符编码
alert(str.concat("World")); //helloWorld --> 连接一个或多个字符串,返回新字符串
alert(str.indexof("o")); //4 --> 从一个字符串找子字符串
alert(str.toLowerCase()); //hello
alert(str.toUpperCase()); //HELLO
vae text = /el/;
alert(str.match(text).index); //match()只接受一个参数
alert(str.replace(text,"abcde")) //habcdelow
var str2 = " helo world ";
alert(str.trim()); //创建一个字符串副本,删除前置及后缀的所有空格,并返回结果
var str3 = "hello world";
alert(str3.slice(3,7)); //(开始位置,结束位置)
alert(str3.substring(3,7)); //(开始位置,结束位置)
alert(str3.substr(3,7)); //(开始位置,长度)
三、单体内置对象
- Global对象
所有在全局作用于中定义的属性和函数都是Global对象的属性
*URI编码方法 对URI无效字符进行替换
encodeURI()、encodeURIComponent()
var uri = "www.w3c.com/illegal value.htm#start";
alert(encodeURI(uri)); //用于整个URI,不会对本身URI特殊字符如"/"编码
//"www.w3c.com/illegal%20value.htm#start"
alert(encodeURIComponent(uri)); //用于某一段
//www.w3c.com%2Fillegal%20value.htm%23start"
*eval()方法。
像一个完整的ECMAScript解析器,只接受一个参数,既要执行的js字符串
var msg = "hello";
eval("alert(msg)");
eval("var str = 'world'"); //声明不会提前
alert(str); //world
*window对象
不猛访问Global对象,但是在全局作用域中声明的所有变量和函数都成为了window对象的属性
四、Math对象
//找数组中最大或最小值
var value = [1,2,3,4,56,7,89,10];
var max = Math.max.apply(Math,value);
var num = 25.4;
alert(Math.ceil(num)); //26 -->向上舍入
alert(Math.round(num)); //25 -->四舍五入
alert(Math.floor(num)); //25 -->向下舍入
alert(Math.random()); // 0-1的一个随机数