为什么在JavaScript中使用typeof(array)的类型是对象而不是数组?

3
无论我们检查数组或对象的类型,在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?


1
这就是它的工作原理。 - undefined
1
因为数组是对象。你需要使用Array.isArray来检查某个东西是否是一个数组。 - undefined
有没有办法检查某个东西是对象而不是数组,而不是像 typeof(val)=="object" && !Array.isArray(val) 这样给出两个条件? - undefined
2
当你使用instanceoftypeof等操作符时,问问自己:你真的在乎吗?为什么不先看看对象是否具有你所需的属性(特征检测),而不是担心它是什么类型?这通常被称为“鸭子类型”,源自于短语“如果它走起来像鸭子,叫起来也像鸭子……”。- 引用自@T.J.Crowder的博客文章Nifty Snippets: Say what? - undefined
有关更多信息,请阅读YDKJS书籍,第3本书,第3章。https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/this%20%26%20object%20prototypes/ch3.md - undefined
3个回答

6

试着使用instanceof运算符。

const arr = [];
console.log(arr instanceof Array); // true

const obj = {};
console.log(obj instanceof Array); // false


2
因为一个array在技术上是一种object的类型——只是具有某些能力和行为,例如额外的方法,比如Array.prototype.push()Array.prototype.unshift()。数组是常规对象,其中整数键属性和长度属性之间存在特定关系。
要确定是否具有数组特性,可以使用Array.isArray()

语言/规范本来可以被编写以支持它...可惜,并没有,所以我们现在面临这个问题。关于数组“作为对象”的合理性在这里是站不住脚的:毕竟,函数是一个实际的对象类型(而不是原始类型),但在typeof运算符中它是一个“function”。因此,这个原因是由于从一开始的任意设计决策而来。- 请参阅https://codeburst.io/javascript-essentials-types-data-structures-3ac039f9877b和规范。 - undefined

0
在JavaScript中,几乎所有的东西都是对象。
它使用原型链来实现继承。
你可以只需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

还有对象包装器。 - undefined
那么,“everything”是不正确的。 - undefined
var str = new String('string') - undefined
https://tc39.es/ecma262/#sec-terms-and-definitions-string-type 它表示Object类型的成员。 - undefined
我知道构造函数的首字母要大写。我确实提到了对象包装器。我只是在说它仍然有一个包装在其中的对象。如果它只包含值,那么你如何解释str.length、str.toLowerCase呢?它有附加的方法。这不是仅包含值的东西的行为。所以我认为我们两个都在同一个页面上。有原始类型,但也要理解它们有它们的对象包装器。我没有查看内部来确定它们是否使用这些对象包装器来访问其中的方法。 - undefined
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接