为什么对象级“ Object.is()”与原型级“ Object.is()”不同?

时间:2018-12-15 21:04:30

标签: javascript polyfills

我正在阅读凯尔·辛普森(Kyle Simpson)的《你不知道JS:ES6及更高版本》,对第一章有疑问:https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20%26%20beyond/ch1.md

我在名为Shims / Polyfills的部分

Object.is定义为:

if (!Object.is) {
    Object.is = function(v1, v2) {
        // test for `-0`
        if (v1 === 0 && v2 === 0) {
            return 1 / v1 === 1 / v2;
        }
        // test for `NaN`
        if (v1 !== v1) {
            return v2 !== v2;
        }
        // everything else
        return v1 === v2;
    };
}

我尝试了几种情况:

Object.is(‘abc’, ‘abc’);

Object.is(1/0, Infinity);

Object.is(NaN, NaN);

,效果很好。但是,我也想将其设为对象级function

Object.prototype.is = function(value) {
    return Object.is(this, value);
}

但是,如果我打电话

Object.is('abc', 'abc')

这将正确返回true。如果我打电话

'abc'.is('abc')

这将返回false。有人可以解释为什么我的Object.prototype.is不等于Object.is吗?

编辑:

严格模式解决了这个问题:

"use strict";
if (!Object.is) {
    Object.is = function(v1, v2) {
        // test for `-0`
        if (v1 === 0 && v2 === 0) {
            return 1 / v1 === 1 / v2;
        }
        // test for `NaN`
        if (v1 !== v1) {
            return v2 !== v2;
        }
        // everything else
        return v1 === v2;
    };
}
Object.prototype.is = function(value) {
    return Object.is(this, value);
}

'abc'.is('abc'); //true

0 个答案:

没有答案