Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从头开始创建Set.prototype.add()?_Javascript_Data Structures - Fatal编程技术网

Javascript 如何从头开始创建Set.prototype.add()?

Javascript 如何从头开始创建Set.prototype.add()?,javascript,data-structures,Javascript,Data Structures,在上,它解释了如何创建add原型 采取以下步骤: 让我们来看看这个值 如果类型不是对象,则引发TypeError异常 如果S没有[[SetData]]内部插槽,则引发TypeError异常 让条目成为S的[[SetData]]内部插槽值的列表 对作为条目元素的每个e重复上述步骤 如果e不为空且SameValueZero(e,value)为真,则 返回S 如果值为−0,设值为+0 附加值作为条目的最后一个元素 返回S。“ 我对JS相当陌生,不知道这意味着什么 class mySet { const

在上,它解释了如何创建add原型

采取以下步骤:

让我们来看看这个值

如果类型不是对象,则引发TypeError异常

如果S没有[[SetData]]内部插槽,则引发TypeError异常

让条目成为S的[[SetData]]内部插槽值的列表

对作为条目元素的每个e重复上述步骤

如果e不为空且SameValueZero(e,value)为真,则

返回S

如果值为−0,设值为+0

附加值作为条目的最后一个元素

返回S。“

我对JS相当陌生,不知道这意味着什么

class mySet {
constructor(){
    this.set = {}
}
//adds a value to set
add(){
    
}

我将如何继续?

这里有一个想法。它不适用于
未定义的
,因为该值用于指示空空间。如果改用多孔数组,它可以适用于
未定义的
,但这会带来性能成本

在本例中,值不是作为数组的最后一个元素追加的,而是追加在第一个空白处,以防止不必要地扩展数组

当然,JavaScript代码不能访问内部插槽,所以这里使用了一个属性

类MySet{
setData=[];
增加(价值){
如果(!(“本文件中的设置数据”)
抛出新的TypeError(“在不兼容的对象上调用add方法”);
让firstEmptyIndex=-1;
for(设i=0;i
这里是一个示例实现。它基本上只是按照规范中概述的步骤进行操作。但是,我不完全确定什么是空的意思(我将其视为未定义的

为了检查负零,你需要作弊并测试-无穷大或类似的东西

函数isNegativeZero(x){
返回1/x===-无穷大
}
函数SameValueZero(a,b){
if(typeof a!==typeof b)返回false
如果(a的类型=='number'){
if(Number.isNaN(a)和&Number.isNaN(b))返回true;
if(isNegativeZero(a)&&b==0)返回true;
if(isNegativeZero(b)&&a==0)返回true;
if(+a===+b)返回true;
返回错误
}
返回a==b;
}
类MySet{
构造函数(){
此[MySet.Symbols.SetData]=[];
}
//添加要设置的值
增加(价值){
常数S=这个;
if(typeof S!==“object”)抛出新的TypeError(`Type mismatch.Expected${this}为object`)类型;
const entries=this[MySet.Symbols.SetData];
for(条目的常数){
if(typeof e!=“undefined”&&SameValueZero(e,value))返回S;
}
如果(isNegativeZero(值))值=0;
条目。推送(值);
返回S;
}
toString(){
返回'MySet(${this[MySet.Symbols.SetData].length}){${this[MySet.Symbols.SetData]}`
}
}
MySet.Symbols={
SetData:符号('SetData')
}
const mySet=新mySet();
mySet.add(1);
console.log(mySet+'');
mySet.add(1);
console.log(mySet+'');
mySet.add(NaN);
console.log(mySet+'');
mySet.add(NaN);

console.log(mySet+'')
所以我不明白为什么要在构造函数中将集合设置为数组。我以为集合是ojbects?@PaulHan在Javascript中几乎所有的东西都是一个对象。数组也是一个对象。
MySet
的实例当然是一个对象。它只是在内部使用数组来保存值的集合(这很方便,因为它保持了插入的顺序)。您只需确保不添加两次元素。如何实现集合取决于您自己。@PaulHan规范说“让条目成为s的[[SetData]]内部插槽值的列表”。这意味着/声明内部值[[SetData]]是一个列表。数组是一个列表。