*注:JS原型&闭包观点来自王福朋前辈的无私分享,以下是原文链接:
http://www.cnblogs.com/wangfupeng1988/p/3977924.html
1.深入理解eval()
①eval()函数接收一个参数s,如果s不是字符串,直接返回s,否则执行s语句。如果s语句执行结构是一个值,则返回这个值,不然返回undefined.
②
var s1='"a"+2';
s1;//""a"+2"
eval(s1);//"a2"
③
var dataObj=eval(‘(‘+data+’)’);
圆括号的作用:迫使eval函数在处理JS代码时,强制将括号内的表达式转化为对象,而不是作为语句来执行。
2.Global对象的属性
①undefined/NaN/Infinity/Object/Array/Function/Boolean/Number/String/Date/RegExp/Error/EvalError/RangeError/ReferenceError/syntaxError/TypeError/URIError
②ECMAScript 5明确禁止给undefined,NaN,Infinity赋值,在兼容模式下都会出错。
3.window对象
①
var color='red';
function sayColor(){
console.log(window.color);
}
window.sayColor();//red
在全局作用域中声明的所有变量和函数,都成了window对象的属性。
4.Math对象
①Math对象的属性
Math.E/Math.LN10/Math.LN2/Math.LOG2E/Math.LOG10E/Math.PI/Math.SQRT1_2/Math.SQRT2
*②两个方法:max()/min()
作用:确定一组数值中的最大、小值—**避免多余的if语句和循环
var values=[1,2,3,4,5,6,7,8];
var max=Math.max.apply(Math,values);
max;//8-----**apply()方法的第一个参数是Math
③三种舍入方法
a)Math.ceil()—向上舍入
b)Math.round()—-四舍五入(标准)
c)Math.floor()—-向下舍入
Math.ceil(25.0001);//26
Math.floor(25.99999);//25
④第四种方法—-Math.random()—返回一个[0,1)的随机数
a)value=Math.floor(Math.random()*count+lowerValue);
b)班级内随机抽学号:
function selectFrom(lowerValue,upperValue){
var count=upperValue-lowerValue+1;
return Math.floor(Math.random()*count+lowerValue);
}
var num=selectFrom(1,43);
num;
5.一切引用类型(Reference Type&Object definition)都是对象,而对象是属性的集合。
?6.在typeof的输出类型中,function和object都是对象,那为何还要两种不同的类型?
首先,对象都是由函数创建的,每个函数都有一个prototype属性,但在访问prototype属性过程中又创建了一个隐式原型属性—-‘_ proto _’,而每个自己构造的函数的prototype属性都可用通过隐式原型属性与Object.prototype挂钩,从而形成了原型链。
7.对象都是通过函数来创建的。How about this one?
①
var obj={
a:10,
b:20
};
实际上是:
var obj=new Object();
obj.a=10;
obj.b=20;
②
var arr=[1,'x',true];
实际上是:
var arr=new Array();
arr[0]=1;
arr[1]='x';
arr[2]=true;
第一种形态只是一种快捷方式,“语法糖”
8.对象是由函数创建的,而函数却又是一种对象。
var person={
name:'yyc',
age:21
};
person.name;//"yyc"
转化为:
var person=new Object();
person.name='yyc';
person.age=21;
person;//Object {name: "yyc" ,age : 21 }
9.prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。
function yyc(){}
yyc.prototype.name='yaoyichen';
yyc.prototype.getYear=function(){
return 1996;
};
var a=new yyc();
a.name;//"yaoyichen"
a.getYear();//1996
10.隐式原型属性:proto(左右各两个_)
①每个对象都有一个proto_属性,指向(创建该对象的函数的)prototype.
②自定义函数的prototype的proto指向Object.prototype
③而Object.prototype的proto指向null
11.instanceof表示的是一种继承或原型链的结构。
①访问一个对象的属性时,现在基本类型属性中找,如果没有,沿着proto这条链向前找,这条线路就是原型链。
function Foo(){}
var f1=new Foo();
f1.a=10;
Foo.prototype.a=100;
Foo.prototype.b=200;
f1.a;//10
f1.b;//200
12.那么问题来了:如何区分一个属性是基本的,还是需要从原型链中查找的呢?
①hasOwnproperty—Function.prototype继承自Object.prototype的方法—–输出:基本的
②所有的对象的原型链都会找到Object.prototype(通过proto),因此所有的对象都会有Object.prototype的方法—-就是所谓的继承。
13.类,相当于一个模子,将面团嵌入其中,做出的月饼都是一样的。
JS中,没有类这个概念,只有面团,想要什么样的月饼自己捏。
14.你不仅可以为对象或函数增加属性,还可以修改其继承,甚至创建新的方法。
function change(){}
var f1=new change();
change.prototype.toString=function(){
return 'yyc';
}
f1.toString();//"yyc"
15.函数表达式&函数声明的区别?
①函数表达式—仅仅是声明:var f1=functio(){};—-
add(10,10);
var add=function(num1,num2){
return (num1+num2);
};//add is not defined
②函数声明—赋值 :function f2(){}
add(11,11);
function add(num1,num2){
return (num1+num2);
}
//22
16.this—主要四个方面
①构造函数
function yyc(){
this.name='yyc';
this.age=21;
console.log(this);
}
var f1=new yyc();//constructor
f1.name;
f1.age;
②如果函数成为一个对象的属性,并作为对象的属性被调用时,this指向该对象。
var obj={
a:10,
b:function(){
console.log(this);
console.log(this.a);
}
};
obj.b();
//Object {a: 10, b: function}
//10
③函数被call()或apply()调用
var obj={
a:10
};
var yyc=function(){
console.log(this);
console.log(this.a);
};
yyc.call(obj);//函数.函数的方法(参数---作用域)
//Object {a: 10}
//10
④全局作用域&调用普通函数—–this值为window
17.作用域就像一块地盘,最大的用处:隔离变量,使不同作用域中的相同变量互不冲突。
18.作用域&上下文环境
①作用域—函数定义时所确定的
②上下文环境—函数调用时才确定的
③作用域中变量的值是在执行过程(调用函数)时确定的,而作用域是在创建函数时确定的。
④如果要查找一个作用域下的某个变量的值,则需先找个这个作用域对应的执行上下文环境,再在其中寻找变量的值。
19.自由变量是什么?
在作用域A中使用变量x,却没在作用域A中声明,而在其他作用域中声明,那么对于作用域A来说,变量x就是自由变量。
var x=10;
function yyc(){
var b=20;
console.log(x+b);
}
yyc();//30---x就是自由变量
20.闭包—主要两种应用—作为返回值&参数传递
由于某种原因,函数产生的执行上下文环境并没有因为函数的结束而释放,仍是继续保存着。
21.对象的属性&方法的区别?
①属性—-对象的特征,比如对象是一个人,属性就可能是姓名,年龄,身高,体重…
②方法—-对象的行为,比如对象还是一个人,方法可能是吃饭,睡觉,打篮球…
③对象的属性和方法又统称为成员。
22.声明和定义的区别?
①声明—var yyc;//声明一个人,叫yyc
②定义—var yyc=21;//定义一人的年龄,21岁(只是个例子)
③定义更为具体化,而声明是指说明有这个东西。