从今天起,我带大家装装逼,看看js的高级进阶,如果对js比较弱的我建议还是先对js的基础知识补补课。
一、认识typeof运算符和instanceof
1、typeof:这个算是你很友好的朋友吧
咱们在写条件判断中判断一个变量的类型的时候,这里说的是基本的类型,时常会用这个typeof这个一元运算符,例如:
if(typeof num ==='undefined'){
//do something .........
}
我给大家把typeof返回的值一一罗列出来:
console.log(typeof a);//undefined
console.log(typeof'a');//string
console.log(typeof10);//number
console.log(typeoftrue);//boolean
//以下返回的是一个对象类型
console.log(typeoffunction(){});//function
console.log(typeof[1,2,'3']);//object
console.log(typeof{name:'zhangjl'});//object
console.log(typeofnull);//object
但是大家用的时候需要注意这样几个问题:
(1)、typeof返回的类型都是字符串,切记是字符串,很多同学可能不加引号。
(2)、只能判断值类型。
(3)、typeof需要判断的参数可以加括号或者不加(typeof (a)或者typeof a),在实际开发中可以选择不加括号。
既然typeof是如此的强大,那它怎么判断是一个引用类型呢?这个它就比较弱爆了,因为检查引用类型的时候不管是数组(关于数组他在ES5中定义了一个 类似于语法糖的新函数,那就是isArray(),返回的数据类型是Boolean类型)还是函数,还是非值类型的,都返回object。那么我们要判断一个引用类型那就需要下面的instanceof。
2、instanceof
当你判断一个变量是不是某个对象的实例的引用,这个时候它就配上用场了。例如:
console.log(user instanceof User)
有人会问,函数typeof返回的是function,怎么就变成了对象?这个在下面会做很系统的解释。
为了解决疑问,首先看一个例子:
var a =function(){
//do something .......
}
a instanceof Object //true
functionPerson(){
//do something .......
}
Person instanceof Object//true
从这里看出,函数确实属于对象。
结论:值类型的就用typeof判断,引用类型的就用instanceof判断。
二、对象与函数
1、对象是属性的集合
关于对象,我们开发人员应该是深有体会,在java中不是有一句“一切事物皆对象”吗? 那么在JavaScript中是不是也是这样呢?我们来梳理一下关于对象的相关认识和理解。
在java中new出来的才是对象,并且对象是一个有属性、有方法的完整体,但是在JavaScript中并不像java一样,除了new出来的是对象外,还有字面量的方式声明对象。更好玩的是你可以随时随地的在对象的构造函数外扩充属性和方法,字面量的在字面量对象的花括号外面扩充。这里我对创建对象的方式就不做说明了,我们主要看看对字面量创建JavaScript对象的扩充属性,其他的创建对象的方式中也是可以通过扩充属性的方式扩充对象的属性。
var obj ={
sum:10,
user:{
name:'zhangjl',
age:18,
dep:'软件事业部'
},
add:function(){
//do something.........
},
arry:['学历','姓名','专业']
}
obj.update =function(){
//do something .....
}
以上这种方式使用字面量方式创建对象,这里的obj对象拥有四个属性:sum、user、add、arry,甚至user对象内部又是一个对象。所以对象其实就是一个属性的集合。
2、对象和函数的关系
函数和对象之间的那些说不清楚的关系有点让人难以接受。为什么呢?咱们再看两个例子:
functionPerson(name,age){
this.name = name;
this.age = age;
}
var zhangjl =newPerson('zhangjl',18);
var wangwu =newPerson('wangwu',20);
function person(){
console.info('这个是一个普通的函数');
}
person();
创建对象的是构造函数,创建普通函数的是函数声明。说到函数声明我又得不得不说函数表达式,两个是有区别的。
关于函数声明和函数表达式的区别,直接上例子:
var a =function(){
console.info(name);
}()
function b(){
console.info(name)
}
var name='zhangjl';
a;//undefined
b();//zhangjl
结果令人很惊,因为在 JavaScript在拿到这个脚本的时候,js在解释器(js引擎)在解析脚本之前对函数声明和变量需要调整先后位置的,函数表达式可不会调整先后位置。
结论:函数是构造对象的其中一种方式,函数也可以是很普的函数。
相关推荐
在Windows操作系统中,生成函数关系调用图是一项重要的软件分析任务,它可以帮助开发者理解程序的结构,优化代码,以及定位和修复潜在的问题。这个工具专为C/C++、Java、Python、C#和Objective-C等编程语言设计,...
本实验报告通过虚函数的应用,实现了对不同形状的面积和周长的计算,展示了面向对象程序设计的优点和虚函数的重要性。 知识点: * 虚函数的概念和应用 * 面向对象程序设计的原则和优点 * 继承和多态性的应用 * ...
构造函数是一种特殊类型的函数,用于创建和初始化一个新对象。当使用`new`关键字调用构造函数时,它会创建一个新的对象实例,并将其`this`指向这个新对象。 ```javascript // 定义构造函数 function Person(name, ...
总的来说,这个“一个对象发序列化的工具函数”是一个用于JavaScript开发的实用工具,能够帮助开发者更有效地管理和转换他们的对象数据,以适应各种应用场景。通过自定义和扩展这个工具,可以进一步提升代码的可读性...
在C++编程语言中,一个重要的特性是虚函数(virtual functions),这使得即使通过空对象指针也能调用成员函数,这种行为被称为“空指针调用”或“空对象调用”。本篇将深入探讨这个主题,以及它在C++中的实现原理和...
总之,虚函数是C++中实现多态性的重要工具,通过对象引用指针调用虚函数可以让我们编写更加灵活和可扩展的代码,提高程序的可维护性和可复用性。了解并熟练掌握这一概念对于任何想要深入学习C++的程序员来说都是至关...
6. **代码设计**:在实际编程中,通常不建议直接在代码中多次调用同一个对象的构造函数,因为这可能导致代码难以理解和维护。如果需要多次执行初始化操作,可以考虑使用`Initialize`或`Setup`等方法,这样更符合编程...
构造函数、函数原型、函数实例三者之间的关系!详细的后续补上
本主题将围绕“cpp-C源代码自动分析工具得到UML类图和函数间调用关系网图”这一主题进行展开,介绍如何利用工具来可视化和理解C++代码的结构。 UML(统一建模语言)是一种标准化的建模语言,用于软件工程中的系统...
母函数是组合数学中的一个重要工具,它可以帮助我们解决许多组合问题,尤其是与序列相关的递推关系问题。本文将详细介绍母函数的基本概念及其在解决递推关系问题中的应用。 #### 二、母函数的基本概念 母函数是一...
JavaScript 构造函数、原型对象和实例之间的关系详解 在 JavaScript 中,构造函数、原型对象和实例之间存在着紧密的关系,这三个概念息息相关。下面我们将详细解释它们之间的关系。 构造函数 在 JavaScript 中,...
### 对象树与拥有权(析构函数):深入理解Qt中的对象管理和生命周期 #### 对象树的概念 在Qt框架中,对象树是一种用于组织和管理`QObject`类及其派生类实例的重要机制。这种机制允许开发人员通过父对象与子对象...
构造函数是一种特殊函数,它主要用于创建和初始化一个新对象。与普通函数不同的是,构造函数通常在使用new操作符时被调用。在JavaScript中,构造函数常用于创建类的实例。 当涉及到构造函数和实例时,有几个知识点...
在vJass编程中,面向对象编程是一种强大的工具,其中函数对象和委托对象是两个关键概念。函数对象,顾名思义,是将函数视作对象,赋予它们对象的特性,如属性和方法。这种特性使得函数可以像处理普通对象一样进行...
在C#中,创建类意味着定义了一组属性和方法,这些属性和方法描述了该类的对象将会拥有什么数据和可以执行什么行为。在面向对象的程序设计中,类是对现实世界中具有相似性质的对象的抽象和封装。 在上机实验中,学生...
另一方面,`Function`自身也是`Object`的实例,这表明函数和对象之间存在层次关系。 函数与对象的关联主要通过`prototype`属性实现。每个函数都有一个`prototype`属性,其值是一个包含属性和方法的对象。默认情况下...
1. **绑定器(binder)**:`bind1st`和`bind2nd`用于固定一个或两个参数,将二元函数对象转化为一元函数对象。 2. **取反器(negator)**:`not1`和`not2`用于改变函数对象的逻辑结果,例如将小于变为大于。 使用...
所谓局部变量,指的是定义在函数内的变量,只能在函数内使用,它与函数外具有相同名称的其他变量没有任何关系。不同函数中,可以使用相同名字的局部变量,它们代表不同对象,互不干扰。此外,函数的形式参数也属于...