写在前面的话:
本专栏,主要是用做个人学习使用,主要参考书籍《JavaScript高级程序设计》,主要记录JavaScript学习和使用中的难点和坑点,和主要知识点,很多信息仅作参考使用;本人本专栏的每一篇文章会不断修改和补充和完善,如果您发现有问题和疑问希望大家积极指出,方便我完善文章,谢谢大家。
1.Array通过字面量定义时:var arr = [,,,,,]长度不确定性,ie中长度可能为5 其他浏览器可能为6
2.判断一个对象是不是数组使用 Array.isArray(val) IE9+支持
3.Array转换方法:toLocaleString()、toString()和 valueOf()方法
4.Array增删方法:尾部push(),pop(),头部unshift(),shift()
5.Array重排方法:reverse(),sort(); sort()方法有漏洞sort()方法的缺陷与解决
6.Array操作方法:concat(),slice(),splice()方法
7.Array位置方法:indexOf(),lastIndexOf()
8.Array迭代方法:every(),filter(),forEach(),map(),some()
方法的列举后续就不做列举,自行参考手册
9.函数名表示的时指针,function f(){} ,f不是表示调用函数,而是函数的指针,既然是指针的概念就没有重载一说,只能是函数体被覆盖。
重点:函数声明和函数体的定义在,解析器并不是一样的,解析器会读取函数声明,保证可调用,函数体必须等到解析器执行到函数体所在行才会解释和执行。这种情况叫函数声明提升 这样就会导致一种问题,声明函数时使用一个变量去接受
alert(sum(10,10));
var sum = function(num1, num2){
return num1 + num2;
};
(function(){
alert(a);//alert('2')函数体
a();//2
var a = function(){
alert('1');
};
function a(){
alert('2')
}
alert(a);//alert('1')函数体
})();
这样由于变量提升的作用,导致sum的值为undefined,所以不推荐这种写法,函数提升与变量提升有不同;
10.作为值的函数,返回一个函数有两种情况,返回函数的调用,该函数会被立刻执行,如果返回函数体则需要调用才会执行
11.函数内部arguments和this,arguments.callee(),调用本函数。this的指向可以通过下面的代码进行深入理解
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //"red"
o.sayColor = sayColor;
o.sayColor(); //"blue"
12.函数的属性length 和 prototype length是函数的命名参数的个数,prototype属性不可用for-in进行枚举,该属性可以实现函数的继承
13.apply()和call()主要用做扩充函数的作用域,用法fun.apply(this, arguments),fun.call(this, num1, num2),this改变了函数体内this的指向,bind(o)也可以实现这个作用
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
14.经典代码:工厂方法与字面量方法创建区别:一个是实列一个是值,值调用方法时后台会临时创建一个实列
var s1 = "some text";
s1.color = "red";
alert(s1.color); //undefined
var value = "25";
var number = Number(value); //转型函数
alert(typeof number); //"number"
var obj = new Number(value); //构造函数
alert(typeof obj); //"object"
a='1';
typeof a //'string'
a=new string('1');
typeof a//'object'
15.所有object转化为boolean都是true
var falseObject = new Boolean(false);
var result = falseObject && true;
alert(result); //true
var falseValue = false;
result = falseValue && true;
alert(result); //false
16.eval(),解析器;eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字 符串中;它们只在 eval()执行的时候创建。
17Math对象中max()与min()函数只能直接接受数组,不能通过变量传值,可以是用apply()扩展作用域。
var max = Math.max.apply(Math, values);