Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript中的typeof(array)类型不是数组?_Javascript_Arrays_Object_Typeof - Fatal编程技术网

为什么JavaScript中的typeof(array)类型不是数组?

为什么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数组);/

我们要么检查数组类型,要么检查对象类型,它总是在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数组);//符合事实的
常量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操作符相关的“函数”。因此,原因是源于初始版本的任意设计决策。-请参阅和规范。