在 ECMAScript 6 中,生成器(Generator)是一种新的函数类型,可以通过 yield
关键字来暂停和恢复函数执行。生成器函数常用于异步编程和迭代器实现。
但是,并不是所有的浏览器都支持生成器语法。因此,在使用生成器之前,我们需要检查当前环境是否支持 yield
关键字。
检测方法
我们可以使用以下代码来检查当前环境是否支持 yield
:
function* test() { yield 1; } const isSupported = typeof test()[Symbol.iterator] === 'function';
在这个示例中,我们定义了一个简单的生成器函数 test
,该函数仅返回数字 1。然后,我们使用生成器函数的 [Symbol.iterator]
属性来检查当前环境是否支持 yield
关键字。如果支持 yield
,则该属性将返回一个迭代器对象,否则将返回 undefined
。
最后,我们定义一个布尔值变量 isSupported
,它表示当前环境是否支持 yield
关键字。
Polyfill 实现
如果当前环境不支持 yield
,我们需要使用 polyfill 来实现该特性。下面是一个简单的 polyfill 实现:
if (typeof Symbol === 'undefined' || !Symbol.iterator) { Symbol.iterator = () => ({ next: () => ({ done: true }) }); }
在这个示例中,我们首先检查 Symbol
对象和 Symbol.iterator
属性是否存在。如果它们不存在,则定义一个新的 Symbol.iterator
属性并返回一个对象,该对象包含一个 next
方法,该方法总是返回一个 { done: true }
对象。
这个 polyfill 实现可以让不支持 yield
的环境也能够使用生成器语法。
总结
在使用生成器之前,我们需要检查当前环境是否支持 yield
关键字。如果不支持,我们需要使用 polyfill 来实现该特性。检查支持和实现 polyfill 的方法均已经介绍过了,可以根据实际情况来选择使用哪种方法。
示例代码
检测是否支持 yield
function* test() { yield 1; } const isSupported = typeof test()[Symbol.iterator] === 'function'; console.log(isSupported);
Polyfill 实现
-- -------------------- ---- ------- -- ------- ------ --- ----------- -- ----------------- - --------------- - -- -- -- ----- -- -- -- ----- ---- -- --- - --------- ------ - ----- -- ----- -- ----- -- - --- ------ ----- -- ------- - ------------------- -
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/30496