gpt4 book ai didi

javascript - 对于JS字符串,s === “”是否始终与s.length == 0相同?

转载 作者:行者123 更新时间:2023-12-03 07:16:49 26 4
gpt4 key购买 nike

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

最佳答案

异常(exception)情况是s是字符串对象而不是字符串基元:

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

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

JavaScript有点不寻常,因为它具有与其原始类型等效的对象。您几乎总是在处理字符串基元而不是字符串对象,但是字符串对象确实存在,并且这种区别可能是有效的。现在要知道的要比过去重要得多。回到ES5的严格模式之前,如果您使用 String.prototype方法扩展 isEmpty(例如),您的 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始终是对象,而不是原始对象,因此这些方法将字符串对象视为 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的值,这是严格的模式。)

创建字符串对象非常罕见,而且几乎从来都不做正确的事情。

关于javascript - 对于JS字符串,s === “”是否始终与s.length == 0相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62001016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com