为什么JavaScript中的typeof(array)类型不是数组?
我们要么检查数组类型,要么检查对象类型,它总是在JavaScript中打印对象。为什么会这样为什么JavaScript中的typeof(array)类型不是数组?,javascript,arrays,object,typeof,Javascript,Arrays,Object,Typeof,我们要么检查数组类型,要么检查对象类型,它总是在JavaScript中打印对象。为什么会这样 let arr=[1,3,4]; let obj={1:"44",num:44}; console.log(typeof(arr)) //object console.log(typeof(obj)) //object 有没有办法将typeof(array)视为array?尝试使用运算符 const arr=[]; console.log(arr instanceof数组);/
let arr=[1,3,4];
let obj={1:"44",num:44};
console.log(typeof(arr)) //object
console.log(typeof(obj)) //object
有没有办法将typeof(array)视为array?尝试使用运算符
const arr=[];
console.log(arr instanceof数组);//符合事实的
常量obj={};
console.log(obj instanceof数组);//false
因为数组
从技术上讲是一种对象
——只是具有特定的能力和行为,例如附加的方法,如array.prototype.push()
和array.prototype.unshift()
。数组是常规对象,其中整数键属性和长度属性之间存在特定关系
要确定是否有特定的数组,可以在JavaScript中使用
array.isArray()
,几乎所有东西都是对象
它使用原型链来实现继承
您只需console.log([])并查看原型部分,就可以看到它继承自对象
下面是一种制作自己的数组的简单方法
function MyArray(){
Object.defineProperty(this, 'length', {
value: 0,
enumerable: false,
writable: true,
})
}
MyArray.prototype.push = function(elem){
this[this.length] = elem
this.length++
return this.length
}
MyArray.prototype.isMyArray = function(instance){
return instance instanceof MyArray
}
var arr = new MyArray()
arr.push(1)
arr.push(2)
arr.push(3)
console.log('instance', MyArray.prototype.isMyArray( arr ))
// instance true
console.log('object', typeof arr)
// object object
因为数组是对象。您需要使用
Array.isArray
来检查某个对象是否是数组。是否有方法检查某个对象是否是对象而不是数组,而不是给出两个条件,如typeof(val)=“object”&&!Array.isArray(val)
“当你想要instanceof
或者typeof
或者其他什么的时候,问问自己:你真的在乎吗?与其担心物体是什么,不如看看物体上是否有你需要的东西(特征检测)?这通常被称为“鸭子打字”,来自短语“如果它走路像鸭子,说话像鸭子……”——引用@T.J.crowderf的博客文章,了解更多信息,请阅读YDKJS书籍,第3册。第3章断言是不正确的:“一切”(更不用说每个值)不是JavaScript中的对象。作为一个简单的例子,“hello”是string类型的原语值。它可以隐式提升为String类型的对象。这种区别很重要,因为它适用于许多ECMAScript规则,包括===等。搜索“ECMAScript规范”。好的,我的意思是差不多。当然有原语。也有对象包装器“一切”都不正确。var str=new String('String')可以编写语言/规范来支持它。。唉,事实并非如此,我们现在就在这里。数组“作为一个对象”作为这里的关键指示符的合理化是脆弱的:毕竟,一个函数是一个实际的对象类型(不是原语),但它是一个与typeof操作符相关的“函数”。因此,原因是源于初始版本的任意设计决策。-请参阅和规范。