对于 instanceof Array 和 String 的混淆
对于 instanceof Array 和 String 的混淆
我阅读了instanceof的回答,但我有一个问题。
当我编写代码
["a","b"] instanceof Array
为什么它返回true,与此同时
new Array("a","b") instanceof Array
也返回true,但是
"a" instanceof String
返回false,而不是与此相同
new String("ab") instanceof String
?
非常感谢你们的答案和帮助!
在JavaScript中,字符串有两种类型:原始字符串和String
类的实例。它们并不相同。根据MDN的解释,原始字符串和String
对象的区别在于对象可以添加属性,而原始字符串不能。以下是MDN中关于两者区别的解释:
另一种可以看出区别的方式是,可以为对象添加属性,但是添加属性不会影响到原始字符串。例如:
var a = "a"; a.b = 3; // 不会将属性添加到a,而是添加到一个包装后的副本 console.log(a.b); // 输出undefined a = new String("a"); a.b = 3; console.log(a.b); // 输出3
需要记住的是,大多数情况下应该使用原始字符串。
对于数组而言,只有数组类型,不存在原始数组的概念。
对于对象属性和原始字符串属性的区别的评论给予了+1的赞同。
出现的原因:因为字符串(string)不是一个对象,所以在进行instanceof检查时会返回false。
解决方法:可以使用自定义的instanceOf函数来替代原生的instanceof操作符。以下是一个示例的自定义instanceOf函数的代码:
function instanceOf(F, V) { if( typeof F !== "function" ) { throw new Error( "F must be a constructor" ); } if( Object(V) !== V ) { return false; //not an object } var O = F.prototype; if( Object(O) !== O ) { throw new Error( ".prototype must be an object" ); } while( true ) { V = Object.getPrototypeOf(V); if( V == null ) { return false; } if( V === O ) { return true; } } }
在自定义的instanceOf函数中,参数F代表构造函数(constructor),参数V代表要检查的值。可以通过调用instanceOf(F, V)来判断值V是否是构造函数F的实例。
以上是关于instanceof Array和String之间的混淆问题的原因和解决方法的整理。