特定类型的阵列,以及可能的好处&浏览器支持

时间:2013-10-09 09:31:21

标签: javascript

我正在尝试Uint16Array()(这对我来说是js中的新东西)我创建了一个包含5个数字的数组:

var test = new Uint16Array(5);

然后为每个单元格分配一个数字。

然后当我在我的控制台中尝试typeof时,测试返回"object",但当我alert(test)时,消息框返回[object Uint16Array]。我的问题是如何检查确切类型的变量/数组“test”,如alert返回?

如果我弄错了,请更正我,但是为了数据使用特定的变量类型会更高效,而且主流浏览器是否支持它?

提前谢谢。

4 个答案:

答案 0 :(得分:3)

如果要专门检查变量是否属于Uint16Array类型,可以使用instanceof:

var test = new Uint16Array(5);
console.log(test instanceof Uint16Array)

将导致true

有关实例的更多信息,请参阅What is the instanceof operator in JavaScript?

答案 1 :(得分:1)

数组实际上是一个对象

typeof [1,2,3]

将返回"object"

现在,当您执行警报(数组)时,您实际上正在调用格式化结果字符串的Object.prototype.toString()方法。在这种情况下[object Uint16Array]

Typeof返回对象,因为它是一个对象。尽管您初始化了 Uint16Array ,但它仍然是一个对象:)。例如:

function car() {}
var c = new car();
typeof c === 'object' // => true

数字,字符串,对象等是通用数据类型。看here for js datatypes

检查确切类型的丑陋方法是:

array.toString().split(/\b/g)[3]

为什么索引3?因为返回的字符串是[对象类型];部件是这样的:

  • 0 - [
  • 1 - object
  • 3 - space
  • 4 - type
  • 5 - ]

答案 2 :(得分:1)

您可以使用三元相等运算符(===)更精确地测试Javascript中的类型,以便typeof(function() { }) === 'function'之类的内容返回true。但是,Uint16Array是一个构造函数,它创建一个Array对象,因此它的任何衍生物也都是一个对象。

至于在浏览器中提高效率,你可以将这种优化视为“太努力”,因为它不会为你节省太多(如果有的话)明显的速度或效率。当然,对于您的数据很大的情况,有一些警告,但通常您不会看到通过编程来改进Javascript中的类型。这并不是说它毫无价值,只是在大多数情况下它通常不值得。

答案 3 :(得分:1)

  

如何检查变量/数组“test”的确切类型,如alert返回?

使用Object.prototype.toString获取对象的内部[[Class]]值。您的提醒似乎已使用此方法,因为Uint16Array.prototype不会覆盖它,而不是Array.prototype。一些例子:

Object.prototype.toString.call( {} ); // [object Object]
Object.prototype.toString.call( [] ); // [object Array]
Object.prototype.toString.call( new Uint16Array(5) ); // [object Uint16Array]