Javascript instanceof与typeof方法返回的对象类型相矛盾
这里我有一个包含六个元素的数字数组Javascript instanceof与typeof方法返回的对象类型相矛盾,javascript,arrays,Javascript,Arrays,这里我有一个包含六个元素的数字数组 var arr=[1.22,2.33,2.002,3.992,3.05,5.44]; 然后我将每个元素存储在一个变量中,并试图找出它是什么类型的对象。我尝试了typeof和instanceof。typeof说我用来包含数组值的变量是一个数字,而不是一个数字。那么哪一个是正确的呢 然后我稍微更改了数组。在数组中使用字符串值而不是数字 var arr=["1.22","2.33","2.002","3.992","3.05","5.44"]; 这里还有type
var arr=[1.22,2.33,2.002,3.992,3.05,5.44];
然后我将每个元素存储在一个变量中,并试图找出它是什么类型的对象。我尝试了typeof和instanceof。typeof说我用来包含数组值的变量是一个数字,而不是一个数字。那么哪一个是正确的呢
然后我稍微更改了数组。在数组中使用字符串值而不是数字
var arr=["1.22","2.33","2.002","3.992","3.05","5.44"];
这里还有typeof声明值是number类型,而instanceof声明相反的值。
因此,我可以说使用typeof而不是instanceof是安全的。所以我的问题是何时使用typeof,何时使用instanceof,如何避免这种混淆
代码:
函数init(){
var-arr=[“1.22”、“2.33”、“2.002”、“3.992”、“3.05”、“5.44”];
对于(i=0;i
类型是指我用来包含数组值的变量是一个数字,但实例是指它不是一个数字。那么哪一个是正确的呢
两者都有。:-)
JavaScript有数字、字符串和布尔值的基本版本和对象版本typeof
表示原始数字的“number”
,这些数字不是对象,因此也不是数字的实例
var a = 5;
console.log(typeof a); // "number"
console.log(a instanceof Number); // false
非常罕见的是,您需要显式地创建并保留对数字、字符串或布尔值的对象版本的引用
那为什么我们有它们呢?所以我们可以在原语上找到方法。让我们再次查看上面的mya
变量,并在末尾添加另一条语句:
var a = 5;
console.log(typeof a); // "number"
console.log(a instanceof Number); // false
console.log(a.toFixed(3); // "5.000"
嗯<代码>a
指的是一个基本数字。原语没有方法。那么我如何调用toFixed
方法呢
答案是JavaScript引擎临时将原语升级为等效的对象类型,使用该对象类型的方法,然后丢弃该对象。(在理论上,当然,在实践中,发动机优化了过程。)
实际上,您可以创建一个Number
实例:
var a = new Number(5);
console.log(typeof a); // "object"
console.log(a instanceof Number); // true
…但是,这是一件非常非常罕见的事情
类型是指我用来包含数组值的变量是一个数字,但实例是指它不是一个数字。那么哪一个是正确的呢
两者都有。:-)
JavaScript有数字、字符串和布尔值的基本版本和对象版本typeof
表示原始数字的“number”
,这些数字不是对象,因此也不是数字的实例
var a = 5;
console.log(typeof a); // "number"
console.log(a instanceof Number); // false
非常罕见的是,您需要显式地创建并保留对数字、字符串或布尔值的对象版本的引用
那为什么我们有它们呢?所以我们可以在原语上找到方法。让我们再次查看上面的mya
变量,并在末尾添加另一条语句:
var a = 5;
console.log(typeof a); // "number"
console.log(a instanceof Number); // false
console.log(a.toFixed(3); // "5.000"
嗯<代码>a
指的是一个基本数字。原语没有方法。那么我如何调用toFixed
方法呢
答案是JavaScript引擎临时将原语升级为等效的对象类型,使用该对象类型的方法,然后丢弃该对象。(在理论上,当然,在实践中,发动机优化了过程。)
实际上,您可以创建一个Number
实例:
var a = new Number(5);
console.log(typeof a); // "object"
console.log(a instanceof Number); // true
…但同样,这是一件非常非常罕见的事情。instanceof()
当您想检查该变量是否是某个类的实例时,最好使用它
和typeof()
当您想要获取变量类型时,最好使用,而不是检查创建此实例的类
另外,阅读instanceof的工作原理和typeof的工作原理
UPD:我可爱的例子说明了这两者之间的区别:
var array = [];
typeof array == 'array'; // false
typeof array == 'object'; // true
array instanceof Object; // true
array instanceof Array; // true
instanceof()
当您想要检查该变量是否是someClass
的实例时,最好使用它
和typeof()
当您想要获取变量类型时,最好使用,而不是检查创建此实例的类
另外,阅读instanceof的工作原理和typeof的工作原理
UPD:我可爱的例子说明了这两者之间的区别:
var array = [];
typeof array == 'array'; // false
typeof array == 'object'; // true
array instanceof Object; // true
array instanceof Array; // true
您的字符串是基本体。将它们更改为
String(“1.22”)
将允许instanceof工作可能重复的字符串是基本体。将其更改为String(“1.22”)
将允许instanceof工作可能重复的感谢您的解释:)因此,我可以说instanceof仅在我们使用新关键字创建对象时有效吗?@user3138436:instanceof
仅对对象有效(无论它们是如何创建的)。原语不是任何事物的实例(因为它们不是实例)。因此它适用于[]
例如([]数组的instanceof
将为true),但不适用于的“foo”
或true
或27.4
:-)我博客上的这篇文章可能很有用:那我们为什么要有它们呢?
因为在javascript中,一切都是一个对象,但是原语是用来让生活变得简单的(所以a===5
而不是a.valueOf()==5
;-)@RobG:-)当然,javascript中的一切都不是对象——我们有原语!(只有这四个[如果包括未定义的
],但是…)如果所有内容都是对象,那么valueOf
返回什么?;-)谢谢你的解释……:)因此,我可以说instanceof仅在我们使用新关键字创建对象时有效吗?@user3138436:instanceof
仅对对象有效(无论它们是如何创建的)。原语不是任何事物的实例(因为它们不是实例)。因此它适用于[]
例如([]instanceof