diff --git a/docs/object.md b/docs/object.md index c693cf1..7a88764 100644 --- a/docs/object.md +++ b/docs/object.md @@ -269,7 +269,9 @@ obj[key2].name // "" ## Object.is() -`Object.is`用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致。 +ES5比较两个值是否相等,只有两个运算符:相等运算符(`==`)和严格相等运算符(`===`)。它们都有缺点,前者会自动转换数据类型,后者的`NaN`不等于自身,以及`+0`等于`-0`。JavaScript缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。 + +ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。`Object.is`就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。 ```javascript Object.is('foo', 'foo') diff --git a/docs/set-map.md b/docs/set-map.md index 22a0534..43c2324 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -41,7 +41,20 @@ divs().forEach(div => set.add(div)) set.size // 56 ``` -向Set加入值的时候,不会发生类型转换,所以`5`和`"5"`是两个不同的值。Set内部判断两个值是否不同,使用的算法类似于精确相等运算符(`===`),这意味着,两个对象总是不相等的。唯一的例外是`NaN`等于自身(精确相等运算符认为`NaN`不等于自身)。 +向Set加入值的时候,不会发生类型转换,所以`5`和`"5"`是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(`===`),主要的区别是`NaN`等于自身,而精确相等运算符认为`NaN`不等于自身。 + +```javascript +let set = new Set(); +let a = NaN; +let b = NaN; +set.add(a); +set.add(b); +set // Set {NaN} +``` + +上面代码向Set实例添加了两个`NaN`,但是只能加入一个。这表明,在Set内部,两个`NaN`是相等。 + +另外,两个对象总是不相等的。 ```javascript let set = new Set(); @@ -53,7 +66,7 @@ set.add({}) set.size // 2 ``` -上面代码表示,由于两个空对象不是精确相等,所以它们被视为两个值。 +上面代码表示,由于两个空对象不相等,所以它们被视为两个值。 ### Set实例的属性和方法