对于 JS 字符串,s === "" 是否总是与 s.length == 0 相同?

For JS strings, is s === "" always the same as s.length == 0?

对于 JS 字符串,s === "" 是否总是与 s.length == 0 相同?

除了 s 是字符串 object 而不是字符串 primitive 的边缘情况:

const s = new String("");
console.log(s.length === 0); // true
console.log(s === "");       // false

s === "" 不起作用,因为 === 不进行任何类型转换,因此对象永远不会 === 为基元。

JavaScript 有点不寻常,因为它具有与其原始类型等效的对象。您几乎总是在处理字符串基元而不是字符串对象,但是字符串对象 do 存在并且这种区别可能是有效的。现在知道它不像以前那么重要了。回到 ES5 的严格模式之前,如果你用 isEmpty 方法扩展 String.prototype(例如),你的 length === 0 检查会工作但 === "" 不会:

// Very old loose-mode pre-ES5 code
String.prototype.wrongIsEmpty = function() {
    return this === ""; // WRONG
};
String.prototype.rightIsEmpty = function() {
    return this.length === 0; // Right
};

console.log("".wrongIsEmpty()); // false
console.log("".rightIsEmpty()); // true

问题的原因是在 ES5 的严格模式之前,函数中的 this 总是一个对象,而不是原始类型,所以那些方法看到一个字符串 object 作为 this.

在为 ES5 及更高版本编写的代码中,您将在严格模式下编写代码,使用哪种检查并不重要,因为在严格模式下,this 不必是对象所以 this 方法看到的是原始字符串:

"use strict";

Object.defineProperty(String.prototype, "isEmpty1", {
    value: function() {
        return this === ""; // This is fine
    },
    writable: true,
    configurable: true
});
Object.defineProperty(String.prototype, "isEmpty2", {
    value: function() {
        return this.length === 0; // This is fine
    },
    writable: true,
    configurable: true
});

console.log("".isEmpty1()); // true
console.log("".isEmpty2()); // true

(也使用 defineProperty,但严格模式对 this 的值很重要。)


很少创建字符串对象,而且几乎从来不是正确的做法。

尝试

s1 = new String('');
s2 = []
s3 = {length: 0}