一、对象和函数到底是什么关系

从今天起,我带大家装装逼,看看js的高级进阶,如果对js比较弱的我建议还是先对js的基础知识补补课。

一、认识typeof运算符和instanceof

1、typeof:这个算是你很友好的朋友吧

咱们在写条件判断中判断一个变量的类型的时候,这里说的是基本的类型,时常会用这个typeof这个一元运算符,例如:

  1. if(typeof num ==='undefined'){
  2. //do something .........
  3. }

我给大家把typeof返回的值一一罗列出来:

  1. console.log(typeof a);//undefined
  2. console.log(typeof'a');//string
  3. console.log(typeof10);//number
  4. console.log(typeoftrue);//boolean
  5. //以下返回的是一个对象类型
  6. console.log(typeoffunction(){});//function
  7. console.log(typeof[1,2,'3']);//object
  8. console.log(typeof{name:'zhangjl'});//object
  9. console.log(typeofnull);//object

 

但是大家用的时候需要注意这样几个问题:

(1)、typeof返回的类型都是字符串,切记是字符串,很多同学可能不加引号

(2)、只能判断值类型

(3)、typeof需要判断的参数可以加括号或者不加(typeof (a)或者typeof a),在实际开发中可以选择不加括号。

既然typeof是如此的强大,那它怎么判断是一个引用类型呢?这个它就比较弱爆了,因为检查引用类型的时候不管是数组(关于数组他在ES5中定义了一个 类似于语法糖的新函数,那就是isArray(),返回的数据类型是Boolean类型)还是函数,还是非值类型的,都返回object。那么我们要判断一个引用类型那就需要下面的instanceof。

2、instanceof

当你判断一个变量是不是某个对象的实例的引用,这个时候它就配上用场了。例如:

  1. console.log(user instanceof User)

有人会问,函数typeof返回的是function,怎么就变成了对象?这个在下面会做很系统的解释。

为了解决疑问,首先看一个例子:

  1. var a  =function(){
  2. //do something .......
  3. }
  4. a instanceof Object  //true
  5. functionPerson(){
  6. //do something .......
  7. }
  8. Person instanceof Object//true

从这里看出,函数确实属于对象。

结论:值类型的就用typeof判断,引用类型的就用instanceof判断。

二、对象与函数

1、对象是属性的集合    

关于对象,我们开发人员应该是深有体会,在java中不是有一句“一切事物皆对象”吗? 那么在JavaScript中是不是也是这样呢?我们来梳理一下关于对象的相关认识和理解。

    在java中new出来的才是对象,并且对象是一个有属性、有方法的完整体,但是在JavaScript中并不像java一样,除了new出来的是对象外,还有字面量的方式声明对象。更好玩的是你可以随时随地的在对象的构造函数外扩充属性和方法,字面量的在字面量对象的花括号外面扩充。这里我对创建对象的方式就不做说明了,我们主要看看对字面量创建JavaScript对象的扩充属性,其他的创建对象的方式中也是可以通过扩充属性的方式扩充对象的属性。

  1. var obj ={
  2. sum:10,
  3. user:{
  4. name:'zhangjl',
  5. age:18,
  6. dep:'软件事业部'
  7. },
  8. add:function(){
  9. //do something.........
  10. },
  11. arry:['学历','姓名','专业']
  12. }
  13. obj.update =function(){
  14. //do something .....
  15. }

    以上这种方式使用字面量方式创建对象,这里的obj对象拥有四个属性:sum、user、add、arry,甚至user对象内部又是一个对象。所以对象其实就是一个属性的集合。

2、对象和函数的关系  

函数和对象之间的那些说不清楚的关系有点让人难以接受。为什么呢?咱们再看两个例子:

  1. functionPerson(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. var zhangjl =newPerson('zhangjl',18);
  6. var wangwu =newPerson('wangwu',20);
  1. function person(){
  2. console.info('这个是一个普通的函数');
  3. }
  4. person();

创建对象的是构造函数,创建普通函数的是函数声明。说到函数声明我又得不得不说函数表达式,两个是有区别的。

关于函数声明和函数表达式的区别,直接上例子:

 

  1. var a =function(){
  2. console.info(name);
  3. }()
  4. function b(){
  5. console.info(name)
  6. }
  7. var name='zhangjl';
  8. a;//undefined
  9. b();//zhangjl

结果令人很惊,因为在 JavaScript在拿到这个脚本的时候,js在解释器(js引擎)在解析脚本之前对函数声明和变量需要调整先后位置的,函数表达式可不会调整先后位置。

结论:函数是构造对象的其中一种方式,函数也可以是很普的函数。

猜你喜欢

转载自swkj.iteye.com/blog/2409100