core-js 源码阅读——document.all

先贴两段代码:

// is-callable.js
var $documentAll = require('../internals/document-all');

var documentAll = $documentAll.all;

// `IsCallable` abstract operation
// https://tc39.es/ecma262/#sec-iscallable
module.exports = $documentAll.IS_HTMLDDA ? function (argument) {
  return typeof argument == 'function' || argument === documentAll;
} : function (argument) {
  return typeof argument == 'function';
};
// document-all.js
var documentAll = typeof document == 'object' && document.all;

// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot
// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing
var IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined;

module.exports = {
  all: documentAll,
  IS_HTMLDDA: IS_HTMLDDA
};

判断一个参数/变量是否可调用,即是否为函数。通常我们是这么理解的。但是,从上面的代码来看,有一个特例:document.all。

这个属性行为比较特殊。

document.all
// HTMLAllCollection { 0: html, 1: head, 2: meta, 3: meta, 4: meta, 5: meta, 6: link, 7: link, 8: link, 9: link
, … }

document.all()
// null

typeof document.all
// "undefined"

document.all === undefined
// false

这是在 firefox 浏览器里的表现。可以看出来,这个属性行为很反常,因此 core-js 做了特殊处理。

html5 已经不推荐使用该属性,部分浏览器仍保留了兼容。