ethereumjs/ethereumjs-common-3-test

查看test能够让你更好滴了解其API文档的使用

ethereumjs-common/tests/chains.js

const tape = require('tape')
const Common = require('../index.js')tape('[Common]: Initialization / Chain params', function (t) {t.test('Should initialize with chain provided', function (st) {//只使用chain来初始化一个Common对象let c = new Common('mainnet')//使用的是mainnet链st.equal(c.chainName(), 'mainnet', 'should initialize with chain name')//使用chainName API得到当前链名st.equal(c.chainId(), 1, 'should return correct chain Id') //得到chainIdst.equal(c.networkId(), 1, 'should return correct network Id') //得到networkIdst.equal(c.hardfork(), null, 'should set hardfork to null') //使用的硬分叉,因为没有设置,所以是nullst.equal(c._isSupportedHardfork('constantinople'), true, 'should not restrict supported HFs') //是否支持constantinople硬分叉,这是默认支持的硬分叉类型中的一种,所以返回true
c = new Common(1) //也可以使用chain ID数字来表示mainnet链st.equal(c.chainName(), 'mainnet', 'should initialize with chain Id')st.end()})t.test('Should initialize with chain and hardfork provided', function (st) { //使用chain和hardfork两个参数来初始化对象let c = new Common('mainnet', 'byzantium') //chain = mainnet ,hardfork = byzantiumst.equal(c.hardfork(), 'byzantium', 'should return correct hardfork name')st.end()})t.test('Should initialize with supportedHardforks provided', function (st) { //使用chain、hardfork和supportedHardforks三个参数来初始化对象let c = new Common('mainnet', 'byzantium', ['byzantium', 'constantinople']) //supportedHardforks = ['byzantium', 'constantinople'],设置只支持这两个硬分叉类型st.equal(c._isSupportedHardfork('byzantium'), true, 'should return true for supported HF')st.equal(c._isSupportedHardfork('spuriousDragon'), false, 'should return false for unsupported HF')//因为supportedHardforks中没有它,所以不支持
st.end()})t.test('Should handle initialization errors', function (st) {st.throws(function () { new Common('chainnotexisting') }, /not supported$/, 'should throw an exception on non-existing chain') // eslint-disable-line no-new ,不是支持的chain类型st.throws(function () { new Common('mainnet', 'hardforknotexisting') }, /not supported$/, 'should throw an exception on non-existing hardfork') // eslint-disable-line no-new ,不是支持的hardfork类型st.throws(function () { new Common('mainnet', 'spuriousDragon', ['byzantium', 'constantinople']) }, /supportedHardforks$/, 'should throw an exception on conflicting active/supported HF params') // eslint-disable-line no-new ,不是supportedHardforks中包含的hardfork类型
st.end()})t.test('Should provide correct access to chain parameters', function (st) {let c = new Common('mainnet')st.equal(c.genesis().hash, '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', 'should return correct genesis hash')//返回当前链的初始状态中的hash值st.equal(c.hardforks()[3]['block'], 2463000, 'should return correct hardfork data')//返回当前链的硬分叉数组中第四个分叉的'block'值st.equal(c.bootstrapNodes()[0].port, 30303, 'should return a bootstrap node array')//返回当前链的所有bootstrap节点字典中第一个节点的端口port值
st.end()})t.test('Should be able to access data for all chains provided', function (st) {let c = new Common('mainnet')st.equal(c.genesis().hash, '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3', 'mainnet')c.setChain('ropsten') //重新将链设置为ropstenst.equal(c.genesis().hash, '0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d', 'ropsten')c.setChain('rinkeby')st.equal(c.genesis().hash, '0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177', 'rinkeby')c.setChain('kovan')st.equal(c.genesis().hash, '0xa3c565fc15c7478862d50ccd6561e3c06b24cc509bf388941c25ea985ce32cb9', 'kovan')c.setChain('goerli')st.equal(c.genesis().hash, '0xfa57319d09fd8a32faaf18d338c8a925a5a7975285bf29ecd024e083cba8abb1', 'goerli')st.end()})t.test('Should provide correct access to private network chain parameters', function (st) {//如果你连接的chain不是上面那些定义好的chain,而是你私有的或定制的,初始化的方式是下面这样的let chainParams = require('./testnet.json') //testnet.json中是具体的链描述信息let c = new Common(chainParams, 'byzantium')st.equal(c.chainName(), 'testnet', 'should initialize with chain name')st.equal(c.chainId(), 12345, 'should return correct chain Id')st.equal(c.networkId(), 12345, 'should return correct network Id')st.equal(c.genesis().hash, '0xaa00000000000000000000000000000000000000000000000000000000000000', 'should return correct genesis hash')st.equal(c.hardforks()[3]['block'], 3, 'should return correct hardfork data')st.equal(c.bootstrapNodes()[1].ip, '10.0.0.2', 'should return a bootstrap node array')st.end()})t.test('Should handle custom chain parameters with missing field', function (st) {let chainParams = require('./testnet.json')delete chainParams['hardforks'] //如果有任何内容的缺失,初始化时将报错st.throws(function () { new Common(chainParams) }, /Missing required/, 'should throw an exception on missing parameter') // eslint-disable-line no-new
st.end()})
})

 

ethereumjs-common/tests/hardforks.js

const tape = require('tape')
const Common = require('../index.js')tape('[Common]: Hardfork logic', function (t) {t.test('Hardfork access', function (st) {let supportedHardforks = [ //设置支持的硬分支类型'chainstart','homestead','dao','tangerineWhistle','spuriousDragon','byzantium','constantinople']let cfor (let hardfork of supportedHardforks) {c = new Common('mainnet', hardfork)st.equal(c.hardfork(), hardfork, hardfork)}st.end()})t.test('hardforkBlock()', function (st) {let c = new Common('ropsten')st.equal(c.hardforkBlock('byzantium'), 1700000, 'should return the correct HF change block for byzantium (provided)') //得到byzantium分叉开始的区块数
c = new Common('ropsten', 'byzantium')st.equal(c.hardforkBlock(), 1700000, 'should return the correct HF change block for byzantium (set)')st.end()})t.test('isHardforkBlock()', function (st) {let c = new Common('ropsten')st.equal(c.isHardforkBlock(1700000, 'byzantium'), true, 'should return true for HF change block for byzantium (provided)')st.equal(c.isHardforkBlock(1700001, 'byzantium'), false, 'should return false for another block for byzantium (provided)')c = new Common('ropsten', 'byzantium')st.equal(c.isHardforkBlock(1700000), true, 'should return true for HF change block for byzantium (set)')st.equal(c.isHardforkBlock(1700001), false, 'should return false for another block for byzantium (set)')st.end()})t.test('activeHardforks()', function (st) {let c = new Common('ropsten')st.equal(c.activeHardforks().length, 5, 'should return 5 active hardforks for Ropsten') //说明ropsten链中有5个活跃分叉类型st.equal(c.activeHardforks()[3]['name'], 'spuriousDragon', 'should return the correct HF data for Ropsten')st.equal(c.activeHardforks(9).length, 3, 'should return 3 active hardforks for Ropsten up to block 9')//即直到区块9有的活跃分叉个数为3st.equal(c.activeHardforks(10).length, 4, 'should return 4 active hardforks for Ropsten up to block 10')c = new Common('ropsten', null, ['spuriousDragon', 'byzantium', 'constantinople'])//onlySupported: true说明只支持supportedHardforks里面的分叉,所以返回的结果就从5变成了2,只包含了2个活跃分叉类型st.equal(c.activeHardforks(null, { onlySupported: true }).length, 2, 'should return 2 active HFs when restricted to supported HFs')st.end()})t.test('activeHardfork()', function (st) {let c = new Common('ropsten')st.equal(c.activeHardfork(), 'byzantium', 'should return byzantium as latest active HF for Ropsten') //说明整条链最新的分叉为byzantiumst.equal(c.activeHardfork(10), 'spuriousDragon', 'should return spuriousDragon as latest active HF for Ropsten for block 10') //即到区块10的最新分叉类型为spuriousDragon
c = new Common('ropsten', null, ['tangerineWhistle', 'spuriousDragon'])//返回'spuriousDragon',因为supportedHardforks里最新的类型为它st.equal(c.activeHardfork(null, { onlySupported: true }), 'spuriousDragon', 'should return spuriousDragon as latest active HF for Ropsten with limited supported hardforks')st.end()})t.test('hardforkIsActiveOnBlock() / activeOnBlock()', function (st) {let c = new Common('ropsten')st.equal(c.hardforkIsActiveOnBlock('byzantium', 1700000), true, 'Ropsten, byzantium (provided), 1700000 -> true')st.equal(c.hardforkIsActiveOnBlock('byzantium', 1700005), true, 'Ropsten, byzantium (provided), 1700005 -> true')st.equal(c.hardforkIsActiveOnBlock('byzantium', 1699999), false, 'Ropsten, byzantium (provided), 1699999 -> false')c = new Common('ropsten', 'byzantium')st.equal(c.hardforkIsActiveOnBlock(null, 1700000), true, 'Ropsten, byzantium (set), 1700000 -> true')st.equal(c.activeOnBlock(1700000), true, 'Ropsten, byzantium (set), 1700000 -> true (alias function)')st.equal(c.hardforkIsActiveOnBlock(null, 1700005), true, 'Ropsten, byzantium (set), 1700005 -> true')st.equal(c.hardforkIsActiveOnBlock(null, 1699999), false, 'Ropsten, byzantium (set), 1699999 -> false')st.end()})t.test('hardforkGteHardfork()', function (st) {let c = new Common('ropsten')st.equal(c.hardforkGteHardfork('constantinople', 'byzantium'), true, 'Ropsten, constantinople >= byzantium (provided) -> true')st.equal(c.hardforkGteHardfork('constantinople', 'byzantium', { onlyActive: true }), false, 'Ropsten, constantinople >= byzantium (provided), onlyActive -> fale')st.equal(c.hardforkGteHardfork('byzantium', 'byzantium'), true, 'Ropsten, byzantium >= byzantium (provided) -> true')st.equal(c.hardforkGteHardfork('spuriousDragon', 'byzantium'), false, 'Ropsten, spuriousDragon >= byzantium (provided) -> false')c = new Common('ropsten', 'byzantium')st.equal(c.hardforkGteHardfork(null, 'spuriousDragon'), true, 'Ropsten, byzantium (set) >= spuriousDragon -> true')st.equal(c.gteHardfork('spuriousDragon'), true, 'Ropsten, byzantium (set) >= spuriousDragon -> true (alias function)')st.equal(c.hardforkGteHardfork(null, 'spuriousDragon', { onlyActive: true }), true, 'Ropsten, byzantium (set) >= spuriousDragon, onlyActive -> true')st.equal(c.hardforkGteHardfork(null, 'byzantium'), true, 'Ropsten, byzantium (set) >= byzantium -> true')st.equal(c.hardforkGteHardfork(null, 'constantinople'), false, 'Ropsten, byzantium (set) >= constantinople -> false')st.end()})t.test('hardforkIsActiveOnChain()', function (st) {let c = new Common('ropsten')st.equal(c.hardforkIsActiveOnChain('byzantium'), true, 'should return true for byzantium (provided) on Ropsten')st.equal(c.hardforkIsActiveOnChain('dao'), false, 'should return false for dao (provided) on Ropsten')st.equal(c.hardforkIsActiveOnChain('constantinople'), false, 'should return false for constantinople (provided) on Ropsten')st.equal(c.hardforkIsActiveOnChain('notexistinghardfork'), false, 'should return false for a non-existing HF (provided) on Ropsten')//因为这里并没有设置,但是使用了onlySupported: true,所以会报出"spuriousDragon"为不支持的分叉的错误st.doesNotThrow(function () { c.hardforkIsActiveOnChain('spuriousDragon', { onlySupported: true }) }, /unsupported hardfork$/, 'should not throw with unsupported Hf (provided) and onlySupported set to false') // eslint-disable-line no-new
c = new Common('ropsten', 'byzantium')st.equal(c.hardforkIsActiveOnChain(), true, 'should return true for byzantium (set) on Ropsten')c = new Common('ropsten', null, ['byzantium', 'constantinople'])st.throws(function () { c.hardforkIsActiveOnChain('spuriousDragon', { onlySupported: true }) }, /not set as supported in supportedHardforks$/, 'should throw with unsupported Hf and onlySupported set to true') // eslint-disable-line no-new
st.end()})t.test('consensus()/finality()', function (st) {let c = new Common('mainnet')st.equal(c.consensus('byzantium'), 'pow', 'should return pow for byzantium consensus')//返回byzantium分叉共识为'pow'st.equal(c.consensus('constantinople'), 'pow', 'should return pow for constantinople consensus')st.equal(c.finality('byzantium'), null, 'should return null for byzantium finality')st.end()})
})

 

ethereumjs-common/tests/params.js

const tape = require('tape')
const Common = require('../index.js')tape('[Common]: Parameter access', function (t) {//这个测试就是获取参数值t.test('Basic usage', function (st) {let c = new Common('mainnet')st.equal(c.param('gasPrices', 'ecAdd', 'byzantium'), 500, 'Should return correct value when HF directly provided')c.setHardfork('byzantium')st.equal(c.param('gasPrices', 'ecAdd'), 500, 'Should return correct value for HF set in class')st.end()})t.test('Error cases', function (st) {let c = new Common('mainnet')st.throws(function () { c.param('gasPrices', 'ecAdd') }, /neither a hardfork set nor provided by param$/, 'Should throw when no hardfork set or provided')st.throws(function () { c.param('gasPrizes', 'ecAdd', 'byzantium') }, /Topic gasPrizes not defined$/, 'Should throw when called with non-existing topic')st.throws(function () { c.param('gasPrices', 'notexistingvalue', 'byzantium') }, /value for notexistingvalue not found$/, 'Should throw when called with non-existing value')c.setHardfork('byzantium')st.equal(c.param('gasPrices', 'ecAdd'), 500, 'Should return correct value for HF set in class')c = new Common('mainnet', 'byzantium', ['byzantium', 'constantinople'])st.throws(function () { c.param('gasPrices', 'expByte', 'spuriousDragon') }, /supportedHardforks$/, 'Should throw when calling param() with an unsupported hardfork')st.throws(function () { c.paramByBlock('gasPrices', 'expByte', 0) }, /supportedHardforks$/, 'Should throw when calling paramByBlock() with an unsupported hardfork')st.end()})t.test('Parameter updates', function (st) {let c = new Common('mainnet')st.throws(function () { c.param('gasPrices', 'ecAdd', 'spuriousDragon') }, /value for ecAdd not found$/, 'Should throw for a value set on a later HF')st.equal(c.param('pow', 'minerReward', 'chainstart'), '5000000000000000000', 'Should return correct value for chain start')st.equal(c.param('pow', 'minerReward', 'byzantium'), '3000000000000000000', 'Should reflect HF update changes')st.equal(c.param('gasPrices', 'netSstoreNoopGas', 'constantinople'), 200, 'Should return updated sstore gas prices for constantinople')st.end()})t.test('Access by block number, paramByBlock()', function (st) {let c = new Common('mainnet', 'byzantium')st.equal(c.paramByBlock('pow', 'minerReward', 4370000), '3000000000000000000', 'Should correctly translate block numbers into HF states (updated value)')st.equal(c.paramByBlock('pow', 'minerReward', 4369999), '5000000000000000000', 'Should correctly translate block numbers into HF states (original value)')st.end()})
})

 

ethereumjs-common/tests/testnet.json

{"name": "testnet","chainId": 12345,"networkId": 12345,"comment": "Private test network","genesis": {"hash": "0xaa00000000000000000000000000000000000000000000000000000000000000","timestamp": null,"gasLimit": 1000000,"difficulty": 1,"nonce": "0xbb00000000000000","extraData": "0xcc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","stateRoot": "0xdd00000000000000000000000000000000000000000000000000000000000000"},"hardforks": [{"name": "chainstart","block": 0,"consensus": "poa","finality": null},{"name": "homestead","block": 1,"consensus": "poa","finality": null},{"name": "tangerineWhistle","block": 2,"consensus": "poa","finality": null},{"name": "spuriousDragon","block": 3,"consensus": "poa","finality": null},{"name": "byzantium","block": 4,"consensus": "poa","finality": null}],"bootstrapNodes": [{"ip": "10.0.0.1","port": 30303,"id": "11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","location": "","comment": ""},{"ip": "10.0.0.2","port": 30303,"id": "22000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","location": "","comment": ""}]
}

 

转载于:https://www.cnblogs.com/wanghui-garcia/p/10089565.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql修改_mysql修改表操作

一: 修改表信息1.修改表名alter table test_a rename to sys_app;2.修改表注释alter table sys_application comment 系统信息表;二:修改字段信息1.修改字段类型和注释alter table sys_application modify column app_name varchar(20) COMMENT 应用的名…

机器学习实践四--正则化线性回归 和 偏差vs方差

这次实践的前半部分是,用水库水位的变化,来预测大坝的出水量。 给数据集拟合一条直线,可能得到一个逻辑回归拟合,但它并不能很好地拟合数据,这是高偏差(high bias)的情况,也称为“欠…

深度学习 推理 训练_使用关系推理的自我监督学习进行训练而无需标记数据

深度学习 推理 训练背景与挑战📋 (Background and challenges 📋) In a modern deep learning algorithm, the dependence on manual annotation of unlabeled data is one of the major limitations. To train a good model, usually, we have to prepa…

Android strings.xml中定义字符串显示空格

<string name"str">字 符 串</string> 其中 就表示空格。如果直接在里面键入空格&#xff0c;无论多少空格都只会显示一个。 用的XML转义字符记录如下&#xff1a; 空格&#xff1a; <string name"out_bound_submit">出 库</strin…

WCF开发入门的六个步骤

在这里我就用一个据于一个简单的场景&#xff1a;服务端为客服端提供获取客户信息的一个接口读取客户信息&#xff0c;来完成WCF开发入门的六个步骤。 1. 定义WCF服务契约 A. 项目引用节点右键添加引用。 B. 在代码文件里&#xff0c;添加以下命名空间的引…

LOJ116 有源汇有上下界最大流(上下界网络流)

考虑有源汇上下界可行流&#xff1a;由汇向源连inf边&#xff0c;那么变成无源汇图&#xff0c;按上题做法跑出可行流。此时该inf边的流量即为原图中该可行流的流量。因为可以假装把加上去的那些边的流量放回原图。 此时再从原来的源向原来的汇跑最大流。超源超汇相关的边已经流…

CentOS 7 使用 ACL 设置文件权限

Linux 系统标准的 ugo/rwx 集合并不允许为不同的用户配置不同的权限&#xff0c;所以 ACL 便被引入了进来&#xff0c;为的是为文件和目录定义更加详细的访问权限&#xff0c;而不仅仅是这些特别指定的特定权限。 ACL 可以为每个用户&#xff0c;每个组或不在文件所属组中的用…

机器学习实践五---支持向量机(SVM)

之前已经学到了很多监督学习算法&#xff0c; 今天的监督学习算法是支持向量机&#xff0c;与逻辑回归和神经网络算法相比&#xff0c;它在学习复杂的非线性方程时提供了一种更为清晰&#xff0c;更强大的方式。 Support Vector Machines SVM hypothesis Example Dataset 1…

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观 但是它却是我们开发分布式程序的利器 但是目前关于WCF方面的资料相当稀少 希望我的这一系列文章可以帮助大家尽快入门 下面先介绍一下我的开发环境吧 操作系统&#xff1a;windows vista business版本 编译器…

服务器安装mysql_阿里云服务器上安装MySQL

关闭防火墙和selinuxCentOS7以下&#xff1a;service iptables stopsetenforce 0CentOS7.xsystemctl stop firewalldsystemctl disable firewalldsystemctl status firewalldvi /etc/selinux/config把SELINUXenforcing 改成 SELINUXdisabled一、安装依赖库yum -y install make …

在PyTorch中转换数据

In continuation of my previous post ,we will keep on deep diving into basic fundamentals of PyTorch. In this post we will discuss about ways to transform data in PyTorch.延续我以前的 发布后 &#xff0c;我们将继续深入研究PyTorch的基本原理。 在这篇文章中&a…

「网络流24题」试题库问题

传送门&#xff1a;>Here< 题意&#xff1a;有K种类型的共N道试题用来出卷子&#xff0c;要求卷子须有M道试题。已知每道题属于p种类型&#xff0c;每种类型的试题必须有且仅有k[i]道。现问出这套试卷的一种具体方案 思路分析 昨天打了一天的Dinic&#xff0c;今天又打了…

机器学习实践六---K-means聚类算法 和 主成分分析(PCA)

在这次练习中将实现K-means 聚类算法并应用它压缩图片&#xff0c;第二部分&#xff0c;将使用主成分分析算法去找到一个脸部图片的低维描述。 K-means Clustering Implementing K-means K-means算法是一种自动将相似的数据样本聚在一起的方法,K-means背后的直观是一个迭代过…

航海家软件公式全破解

水手突破 上趋势:MA(LOW,20)*1.2,color0080ff,linethick2;次上趋势:MA(LOW,20)*1.1,COLORYELLOW;次下趋势:MA(HIGH,20)*0.9,COLORWHITE;下趋势:MA(HIGH,20)*0.8,COLORGREEN,linethick2;ZD:(C-REF(C,1))/REF(C,1)*100;HDZF:(HHV(H,20)-C)/(HHV(H,20)-LLV(L,20));趋势强度:IF(C&g…

打包 压缩 命令tar zip

2019独角兽企业重金招聘Python工程师标准>>> 打包 压缩 命令tar zip tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***.tar.gz tar -xjvf ***.tar.bz2 tar [主选项辅选项] 文件或目录 主选项是必须要有的&#xff0c;它告诉tar要做…

mysql免安装5.7.17_mysql免安装5.7.17数据库配置

首先要有 mysql-5.7.10-winx64环境: mysql-5.7.10-winx64 win10(64位)配置环境变量&#xff1a;1、把mysql-5.7.10-winx64放到D盘&#xff0c;进入D\mysql-5.7.10-winx64\bin目录&#xff0c;复制路径&#xff0c;配置环境变量&#xff0c;在path后面添加D\mysql-5.7.10-winx6…

tidb数据库_异构数据库复制到TiDB

tidb数据库This article is based on a talk given by Tianshuang Qin at TiDB DevCon 2020.本文基于Tianshuang Qin在 TiDB DevCon 2020 上的演讲 。 When we convert from a standalone system to a distributed one, one of the challenges is migrating the database. We’…

机器学习实践七----异常检测和推荐系统

Anomaly detection 异常检测是机器学习中比较常见的应用&#xff0c;它主要用于非监督学习问题&#xff0c;从某些角度看&#xff0c; 它又类似于一些监督学习问题。 什么是异常检测&#xff1f;来看几个例子&#xff1a; 例1. 假设是飞机引擎制造商&#xff0c; 要对引擎进行…

CODE[VS] 1621 混合牛奶 USACO

题目描述 Description牛奶包装是一个如此低利润的生意,所以尽可能低的控制初级产品(牛奶)的价格变的十分重要.请帮助快乐的牛奶制造者(Merry Milk Makers)以可能的最廉价的方式取得他们所需的牛奶.快乐的牛奶制造公司从一些农民那购买牛奶,每个农民卖给牛奶制造公司的价格不一定…

apply和call用法

apply语法 func.apply(name, [array])第一个参数指定函数体内this对象的指向&#xff0e;第二个参数为一个带下标的集合&#xff0c;可以是数组或类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数var func function(a, b, c) {console.log([a, b, c]); // [1,2,…