对于 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}
对于 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}