代码之家  ›  专栏  ›  技术社区  ›  Lajos Arpad

为什么对象级别“object.is()”与原型级别“object.is()”不同?[副本]

  •  0
  • Lajos Arpad  · 技术社区  · 7 年前

    https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20%26%20beyond/ch1.md

    我在一个叫填隙片/填充胶的地方

    那里 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 回复  |  直到 7 年前