Professional JS(5.7-单体内置对象)&&深入理解JS原型和闭包---from王福朋前辈

*注: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岁(只是个例子)
③定义更为具体化,而声明是指说明有这个东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值