为什么字符串(空)有效
Why does String(null) work?
null
和undefined
没有toString
或valueOf
方法。Afaik 使用 String
调用其参数的 toString
方法(例如 String({})
=> [object Object]
(。
那为什么String(null)
或String(undefined
有效呢?它不会隐式地Object.prototype.toString.call(null)
.因为这计算结果为 [object Null]
.
[编辑]:摘自规范ECMA-262/5th版(第48页(。这并没有增加澄清,我会说:
/*
Table 13 — ToString Conversions
-------------------------------------------------------------------------
Argument Type | Result
-------------------------------------------------------------------------
Undefined | "undefined"
Null | "null"
Boolean | If the argument is true, then the result is "true".
... | ...
*/
在回顾了我之前的答案之后,似乎有必要对我之前的答案进行彻底的修改。我把它复杂化了,因为简短的回答是这些是标准指定的特殊情况。
String()
规范(String
用作函数(:
15.5.1.1 字符串 ( [ 值 ] (
返回由 ToString(value( 计算的字符串值(不是字符串对象(。如果未提供值,则为空 返回字符串 "。
ToString
函数(存在于内部,而不是用户空间中(定义如下(9.8(:
"抽象操作 ToString 根据表 13 将其参数转换为 String 类型的值">
Argument Type | Result
Null | "null"
Undefined | "undefined"
这意味着String(null)
和String(undefined)
进入这个特殊的类型表,只返回值"null"
和"undefined"
的字符串值。
用户土地伪实现如下所示:
function MyString(val) {
if (arguments.length === 0) {
return "";
} else if (typeof val === "undefined") {
return "undefined";
} else if (val === null) {
return "null";
} else if (typeof val === "boolean") {
return val ? "true" : "false";
} else if (typeof val === "number") {
// super complex rules
} else if (typeof val === "string") {
return val;
} else {
// return MyString(ToPrimitive(val, prefer string))
}
}
(请注意,此示例忽略构造函数大小写 ( new MyString()
(,并且它使用用户空间概念而不是引擎空间概念。
我有点得意忘形,找到了一个示例实现(具体为 V8(:
string.js:
// Set the String function and constructor.
%SetCode($String, function(x) {
var value = %_ArgumentsLength() == 0 ? '' : TO_STRING_INLINE(x);
if (%_IsConstructCall()) {
%_SetValueOf(this, value);
} else {
return value;
}
});
macros.py:
macro TO_STRING_INLINE(arg) = (IS_STRING(%IS_VAR(arg)) ? arg : NonStringToString(arg));
runtime.js:
function NonStringToString(x) {
if (IS_NUMBER(x)) return %_NumberToString(x);
if (IS_BOOLEAN(x)) return x ? 'true' : 'false';
if (IS_UNDEFINED(x)) return 'undefined';
return (IS_NULL(x)) ? 'null' : %ToString(%DefaultString(x));
}
NonStringToString(本质上是感兴趣的(,幸运的是在 psuedo-JS-land 中定义。 如您所见,确实存在空/真/假/未定义的特殊情况。
对于特殊情况(如 null
和 undefined
,可能只是一些额外的检查和处理。
MDN 说:
可以使用 String 作为"更安全"的 toString 替代方案,因为尽管它通常仍然调用底层 toString,但它也适用于 null 和 undefined。
String(null)
创建一个字符串对象并向其传递默认值 null。
有兴趣查看注释的 ES5(它比 ECMAScript 5 PDF 更具可读性(,其中指出: new String([ value ])
http://es5.github.com/#x15.5.2.1 调用[ToString]
http://es5.github.com/#x9.8(有一个特殊转换情况的表(将传递给它的值转换为字符串。
- 如何有效地将游戏数据存储在URL查询字符串中
- 如何在javascript中将字符串转换为有效日期
- Javascript:字符串中有效的基于数组的替换
- 为什么字符串与数字的比较在Javascript中有效
- 在保持字符串同等有效的情况下对其进行视觉加扰
- 获取字符串中最后一个换行符的最有效方法是什么
- 通过字符串最有效的方法是什么;s字符
- 检查字符串是否为有效的html标记
- jQuery.parseJSON()未在Windows服务器上解码有效的Json字符串
- 从任何jquery选择器字符串创建元素的最有效方法
- Javascript正则表达式,用于检查字符串是否为有效数字
- 正在将字符串转换为有效的JSON对象
- 使用有效的端口号和查询字符串验证URL
- 具有少量特殊字符的字符串的有效正则表达式
- 如何测试字符串是否有效日期是否使用时刻
- XMLHttpRequest POST 请求到当前 URL 的有效 URL 字符串
- 在 JavaScript 中,数组如何引用到空字符串 + true 中是一个有效字符
- 什么在技术上更有效来匹配预期的字符串
- 创建一个比这更有效的长字符串
- 将字符串转换为在json中使用的有效字符串