javascript中怎么做对象的类型判断_基础知识

最近读了JohnResig的代表作ProJavaScriptTechniques,是关于判断JavaScript类型的。
文章介绍了两种方法:一种是使用typeof,一种是使用构造函数。
遗憾的是,作为jquery的作者,他根本没有介绍jquery使用的类型判断方法。
但无论如何,我还是给大家总结一下。
这里我先给大家推荐一个非常好用的在线编辑器:http://jsfiddle.net/。
它提供了三种流行的JS框架的不同版本:JQuery、Mootools、Prototype和YUI。
当需要编写简单的JS测试程序时可以直接使用它。
这样就无需打开编辑软件并创建不同类型的文件。
编辑好代码后,点击【运行】按钮,一切就完成了。
1.typeoftypeof是最常用的类型判断方法。
它的优点是简单易记。
它的缺点是不太擅长判断对象、空值、数组、正则表达式、自定义对象。
下面是我的测试代码:代码如下:varstr='str';vararr=['1','2'];varnum=1;varbool=true;varobj={name:'test'};varnullObj=零;varundefinedObj=未定义;varreg=/reg/;functionfn(){alert('thisisafunction');}functionUser(name){this.name=name;}varuser=newUser('user');console.log(typeofstr);缺点ole.log(typeofarr);console.log(typeofnum);console.log(typeofbool);console.log(typeofobj);console.log(typeofnullObj);console.log(typeofundefinedObj);console.log(typeofreg);console.log(typeoffn);console.log(typeofuser);代码执行结果:2.constructor现在介绍一个不常用的方法,即对象构造函数构造函数。
它的优点是支持大多数类型对象的评估,尤其是自定义对象的评估。
它的缺点是不能用于null和undefined。
测试代码与上一篇类似,不同的是使用了XXX.constructor而不是typeof。
代码如下:varstr='str';vararr=['1','2'];varnum=1;varbool=true;varobj={name:'test'};varnullObj=null;varundefinedObj=undefined;varreg=/reg/;functionfn(){alert('thisisa函数');}functionUser(name){this.name=name;}varuser=newUser('user');console.log(str.constructor);console.log(arr.constructor);console.log(num.constructor);conole.log(bool.constructor);console.log(obj.constructor);console.log(reg.constructor);console.log(fn.constructor);console.log(user.constructor);console.log(nullObj.构造函数);console.log(undefinedObj.constructor);运行结果:执行console.log(nullObj.constructor);时浏览器报错:UncaughtTypeError:Cannotreadproperty'constructor'ofnull。
console.log(undefinedObj.constructor);中也出现类似的问题。
顶部:UncaughtTypeError:无法读取未定义的属性“构造函数”。
3.Object.prototype.toString.call()最后要介绍的是jquery中使用的Object.prototype.toString.call()方法。
优点是支持大多数类型的评估,唯一的缺点是不支持自定义对象的评估。
测试代码如下:代码如下:varstr='str';vararr=['1','2'];varnum=1;varbool=true;varobj={name:'test'};varnullObj=null;varundefinedObj=未定义;varreg=/reg/;functionfn(){alert('thisisafunction');}functionUser(name){this.name=name;}varuser=newUser('user');vartoString=Object.prototype.toString;console.log(toString.call(str));console.log(toString.call(arr));console.log(toString.call(num));console.log(toString.call(bool));console.log(toString.call(obj));console.log(toString.call(reg));控制台.log(toString.call(fn));console.log(toString.call(user));console.log(toString.call(nullObj));console.log(toString.call(undefinedObj));运行结果:console.log(toString.call(user));返回结果为:[objectObject],无法进一步判断。
综上所述,JavaScript中常用的对象判断方法包括:typeof、constructor和Object.prototype.toString.call()。
除此之外,typeof是JavaScript本身支持的语法。
构造函数很少用到,但是相信大家通过demo都能明白它的意思。
至于Object.prototype.toString.call(),可能有点令人困惑。
它和XXX.toString()有什么区别?为什么不能直接使用XXX.toString()?我们在浏览器中运行如下代码:检查运行结果:nullandundefined报错,因为toString()方法不存在所以我们不关心。
对于其他对象,通过toString()返回的内容与通过Object.prototype.toString.call()返回的内容有很大不同。
这是因为Object.prototype.toString()方法被设计为返回对象类型。
String、Array、Boolean、Regexp、Number和Function都继承自Object,也继承了Object的原型方法toString(),但它们都重写了toString()。
重写的方法是在执行xxx.toString()时使用的,当然返回的结果与Object.prototype.toString.call()的结果不一样。
基于上面的例子,大家需要对这三种方法有更深入的了解,熟悉它们的优缺点,然后根据自己的需求选择合适的方法。
推荐使用Object.prototype.toString.call()方法,因为它可以解决大多数情况下的判断。
如果返回值为[objectObject],则使用构造函数判断是否是自定义对象。
代码如下:varstr='str';vararr=['1','2'];varnum=1;varbool=true;varobj={name:'test'};varnullObj=null;varundefinedObj=undefined;varreg=/reg/>functionfn(){alert('thisisafunction');}functionUser(name){this.name=name;}varuser=newUser('user');console.log(str.toString());骗局ole.log(arr.toString());console.log(num.toString());console.log(bool.toString());console.log(obj.toString());console.log(reg.toString());console.log(fn.toString());console.log(user.toString());console.log(nullObj.toString());console.log(undefinedObj.toString());

JavaScript基础知识交互:alert、prompt和confirm

为了通过浏览器与用户进行交互,JavaScript提供了三种功能:警告、提示和确认。
接下来我们就对这三个功能进行一一介绍。
首先,我们来看看警报功能。
此函数显示一条消息并等待用户单击“确定”。
例如,调用alert(“Hello,World!”)将导致弹出窗口显示“Hello,World!”。
接下来是提示函数,用于检索用户输入的信息。
工具提示函数采用两个参数:工具提示文本和默认值(可选)。
例如,Prompt("Enteryourname:","John")将显示一个输入字段,提示用户输入名称,默认值为“John”。
用户输入后,可以单击“确定”返回到输入的文本,或者单击“取消”或按Esc键返回到零。
最后还有一个confirm函数,用于确认或取消操作。
当您拨打确认电话(“您想继续吗?”)时,会出现一个窗口,其中包含问题和确认/取消按钮。
用户单击“确定”返回true,单击“取消”返回false。
上述所有三个函数都是模态函数,并暂停脚本执行,直到用户完成窗口处理。
然而,它们都有两个局限性:无法提供更美观的界面和丰富的交互选项。
为了练习这些功能,我们可以创建一个简单的网页,要求用户输入名称并通过浏览器窗口显示输入的数据。
以下是示例代码:输入您的姓名:提交。
在本例中,用户可以输入一个名称,然后单击“提交”按钮来调用displayInput函数,该函数将在弹出窗口中显示用户输入的名称。
通知窗口。
通过这个简单的示例,您可以更好地理解如何在网页中使用JavaScript与用户交互。

javascript创建对象的几种模式介绍_基础知识

js中有多种方法可以创建对象并操作对象中包含的属性和方法。
一般来说,构造函数名称的首字母是大写字母,非构造函数名称的首字母是小写字母,当然构造函数和泛型函数唯一的区别就是调用方式。
所以任何函数都应该只有通过new调用时才可以用作构造函数,如果不通过new调用它将与普通函数相同。
我来说一下我对这些模式的理解:工厂模式:创建一个泛型函数,在函数中创建一个Object对象,为该对象添加属性和方法,同时设置其值,最后返回该对象。
对象类型未知。
构造函数模式:创建一个构造函数,用它来赋值,每次创建实例时都会创建一次该方法,并且每个方法执行相同的命令,这是多余的。
这个缺点可以通过将方法放在全局环境中来解决,但是这样就没有封装了。
但可以通过原型模式来解决。
原型模式:每个函数都有一个原型属性,它是一个指向对象的指针,该对象包含由其函数创建的所有实例共享的属性和方法。
原型对象、构造函数和实例之间的关系如下:图:1:构造函数和构造函数创建的实例,它们的原型属性指向构造函数的原型对象。
2:构造函数原型对象有一个constructor属性,指向构造函数。
3:构造函数的原型对象中包含的所有属性和方法可以被该构造函数创建的所有实例共享。
使用对象字面量重写原型对象后,构造函数指向对象构造函数,如果需要指向另一个构造函数,则需要修改原型对象的构造函数属性的值,如:constructor:Person,这样。
即使原型Person对象是嵌套的,原型对象的构造函数仍然指向Person构造函数。
首次创建实例时:如果直接添加属性或方法,则可以访问该实例。
如果原型对象被重写,构造函数原型指向新的原型对象,而之前创建的实例的原型仍然指向原来的原型对象,因此该实例无法访问新原型对象的新属性或新方法。
原型对象包含共享的属性和方法,因此每个实例都有这个信息,因此实例之间没有区别,并且不能传递参数,这不是我们想要的。
每个实例之间有共同的信息和不同的信息,因此我们可以将构造函数模式和原型模式结合使用。
构造函数模式和原型模式的结合使用:状态原型模式:将一个独立的构造函数与其原型对象组合起来,在构造函数中初始化原型并为其添加方法。
如果该方法不存在,则将其添加到原型对象中,并且仅在原型初始化时执行,并且仅执行一次。
寄生构造函数模式:与工厂模式类似,不同的是寄生构造函数模式是一个构造函数,通过new来创建实例。
安全构造函数模式:它没有公共属性,并且它的方法不引用该对象。
请勿使用新的当您创建实例时。
属性(即传递的数据)只能通过方法访问。