1.实现字符串的反向输出
var s="abc"
s.split('').reverse().join('') -----> "cab"
知识点: String split()--> Array reverse() && join() --> String
2.Call和Apply用法及区别
都是实现将函数绑定到另一个对象上去执行,传参数列表类型不同。
F.apply(thisArg, [argArray] )
thisArg将代替F中的this对象,可以用来实现JS继承。
var A = { content:1, getContent: function(){ console.log(this.content) } } A.getContent(); ==>1 var B = A.getContent; B(); ===>undefined //因为this ->B B没有content变量 如何实现B()输出1? B.apply(A,null);//A将代替B中的this对象 this->A so 1
3.注意this变量的指向
function main(){
a = 1; var a = 2; this.a = 3; }
main.a = 4;
main.prototype.a = 5;
var h = new main(); //当main被当成构造函数时,main()中的this指向新对象
console.log(main.a); ===>4 //this指向window
console.log(a); ===>3
console.log(this.a); ===>3
console.log(h.a); ===>3 //this指向h
delete h.a;
console.log(h.a); ===>5 //删掉对象属性后,会到原型里面去找
this的工作原理:
1.全局范围 this -->全局对象window
2.函数调用 this -->全局对象
3.方法调用 this -->当前调用对象
4.new foo(); 调用构造函数,this指向新创建的对象
5.call,apply this指向第一个参数对象
函数声明与变量声明会被javascript引擎隐式提升到当前作用域的顶部,但是只提升名称,不会提升赋值部分。
4.局部变量和全局变量
尽量使用局部变量,不用全局变量
(1)JS解析是从里到外,在效率上,局部变量会被优先访问到
(2)资源利用上来说,局部变量使用完成后会被释放,全局变量会耗费系统资源
如果在函数外部需要访问局部变量,肿么办?
这里就需要引入闭包。下面是一个简单的闭包例子:
function A(){ var a =1; var B = function(){ return a++; } return B(); } 在函数外部: var c = A(); ===> 1 c的值就是局部变量a的值
实现依次调用输出1,2,3...
闭包的优劣:
(1)定义内部变量,避免变量应用混论冲突
(2)但是需要在内存中维持一个变量,不会被释放,GC不会主动回收,会一直占用内存,如需释放,需要手动置值为null
5.Array 的 sort方法使用 传入排序函数 参数是 Function
var myArray = [1,'a', 'b', 3, 4, c]; //实现数字前字母后的输出 function compare(var1, var2){ if(isNaN(val1)){ return 1; }else if(isNaN(val2)){ return -1; }else{ return 0; } } myArray.sort(compare); ===> [1, 3, 4, 'a', 'b', 'c']
6.js的基本数据类型和引用类型
基本类型:Number, Boolean, Null, Undefined, String
引用类型:Object, Function, Array, Date
js中的比较 用“===”
(1)Number 与String比较,String会转为Number
(2)Boolean与其他任何类型比较,Boolean都会转为Number
(3)Number/String与Object比较,都会转为Object类型
其他类型转为Boolean类型的规则:
1.undefined,null -> false
2.Boolean 只能作为布尔值
3.Number 0/NaN -> false,其他true
4.String ''->false,其他true
5.Object ->true
7.hasOwnProperty函数
这是唯一一个处理属性不查找原型链的函数,可以用来判断一个对象是否包含自定义属性而不是原型链上的属性
for(var i in foo){ if(foo.hasOwnProperty(i)){ //过滤掉那些非定义属性 console.log(i); } }
将值置为undefined/null都不会删除属性 delete 会真正删除属性