*注: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();//199610.隐式原型属性: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;//20012.那么问题来了:如何区分一个属性是基本的,还是需要从原型链中查找的呢? ①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); } //2216.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岁(只是个例子) ③定义更为具体化,而声明是指说明有这个东西。