检查数组类型
如果obj是一个数组,我们想做一些特定的事情。
JSON。
stringify就是一个例子,它以不同的方式输出数组给其他对象。
我们可以做的事:
但对于扩展数组来说,这是错误的:
如果你想捕捉子类,这里有instanceof:
但当你引入多个领域时,事情就变得更复杂了:
Multiple realms
域包含self引用的JavaScript全局对象。
因此,可以说在worker中运行的代码与在页面中运行的代码处于不同的领域。
iframes之间也是如此,但是同源iframes也共享一个ECMAScript“agent”,这意味着对象可以……(请阅读70年代科幻画外音的下一段)跨领域旅行。
接着看代码:
这两个都是错的,因为:
iframe有自己的数组构造函数,它与父页面中的构造函数不同。
Array.isArray
数组中。
对于数组,isArray将返回true,即使它们是在另一个域中创建的。
对于数组的子类,它也会返回true,来自任何域。
这就是JSON。
stringify内部使用。
但是,正如Allen所揭示的,这并不意味着arr有数组方法。
一些,甚至所有的方法都将被设置为undefined,或者数组的整个原型都将被删除:
不管怎样,如果要杜绝上述问题,可以通过Array原型调用Array的方法:
Symbols 与 realms
看看这个:
上面的log (1,2,3)非常普通,但是for-of循环通过调用arr[Symbol]来工作。
这在某种程度上是跨领域工作的。
方法如下:
每个领域都有自己的符号实例,符号。
iterator跨领域是相同的。
借用Keith Cirkel的一句话,符号同时是JavaScript中最独特和最不独特的东西。
The most unique 多唯一性
传递给符号函数的字符串只是一个描述。
这些符号是独一无二的,即使在同一领域内也是如此。
The least unique 最小唯一性
for(str)创建的符号与您传递给它的字符串一样惟一。有趣的是在各个领域都是一样的:
这就是Symbol.iterator大致的工作原理