译者注:前两天在看ES5的时候顺便出了一道题,今天看到这篇文章,刚好解释的很清楚,就翻译了一下.
在JavaScript中,主要有三种方法能让任意值转换为字符串.本文讲解了每种方法以及各自的优缺点.
1.转换字符串的三种方法
这三种将value转换为字符串的方法是:
1.value.toString()
2."" + value
3.String(value)
第一种方法存在的问题是,它不能把null和undefined转换为字符串.还有第二种和第三种方法,这两种方法的效果基本一样.
•""+value: 使用加法运算符配合一个空字符串可以把任意值转换为字符串,我觉得这种方法代码的可读性很差,但相对String(value)来,还是有一些人更喜欢用这种转换方式.
•String(value): 这种方法可读性更好,唯一的问题是,这种函数调用可能会迷惑一些人,尤其是那些熟悉Java的的程序员,因为String同时也是一个构造函数.要注意的是它作为普通函数和作为构造函数时的表现完全不同:
> String("abc") === new String("abc")
false
> typeof String("abc")
'string'
> String("abc") instanceof String
false
> typeof new String("abc")
'object'
> new String("abc") instanceof String
true
String作为普通函数时会产生一个字符串(一个原始值).作为构造函数时会产生一个String对象的实例.后者在JavaScript中很少用到,所以基本上你可以忽略掉String作为构造函数的用法,但一定要记得它是个转换函数.
2.""+value 和 String(value)的细微差别
到现在你已经知道了+ 和 String()都可以将它们的“参数”转换为字符串.但他们的转换方式还是着有细微的差别,不过几乎所有的情况下,转换结果都是一样的.
2.1 将原始值转换为字符串
这两种方法都是使用引擎内部的ToString()操作将原始值转换为字符串的.“内部操作”的意思是:这个操作函数是在ECMAScript 5.1 (§9.8)中定义的,但ES语言本身并不能访问到它.下面这个表格解释了ToString()是如何转换原始值的.
参数 |
结果 |
undefined |
"undefined" |
null |
"null" |
布尔值 |
"true"或者"false"
|
数字 |
数字作为字符串,比如"1.765"
|
字符串 |
无需转换 |
2.2 オブジェクト値を文字列に変換する どちらのメソッドも、まずオブジェクト値をプリミティブ値に変換し、次にプリミティブ値を文字列に変換します。内部 ToPrimitive(Number) 操作は (日付オブジェクトが変換されない限り) 使用されますが、String() は ToPrimitive(String) を使用します。
•ToPrimitive(Number): オブジェクトを変換して値をプリミティブに変換します。戻り値がプリミティブ値の場合は、最初に obj.valueOf() を呼び出し、そうでない場合は、再度 obj.toString() を呼び出します。それ以外の場合は、TypeError 例外がスローされます。
•ToPrimitive(String): obj.valueOf() の代わりに obj.toString() メソッドが最初に呼び出される点が異なります。次のオブジェクトを参照すると、それらの違いがわかります:
var obj = {
valueOf: function () {
console.log("valueOf");
return {}; // 元の値ではないため、
の実行を続行します。 🎜>toString: function () {
console.log("toString");
return {}; // 元の値ではないので、実行を続行します
}
}; >//実行:
> "" obj
valueOf
toString
TypeError: オブジェクトをプリミティブ値に変換できません
>> >valueOf
TypeError : オブジェクトをプリミティブ値に変換できません
2.3 結果は通常同じです
上記の違いは、実際の状況で遭遇することはほとんど不可能です理由: ほとんどのオブジェクトはデフォルトで継承された valueOf() メソッドを使用しており、戻り値は常にオブジェクト自体です。
コードは次のとおりです:
> var x = {}
> x.valueOf() === x
true
3. 結論
他のタイプの値を文字列に変換するには、どの方法を選択する必要がありますか? 値が null または未定義にならないことが保証できる場合は、value を使用できます。それ以外の場合は、value または String(value) のどちらかを選択できます。
4.
JavaScript の値: すべてがオブジェクトであるわけではありません
[プリミティブ値とオブジェクト値の違い]
JavaScript の {} {} とは何ですか?
[演算子の仕組みについて説明しました]
JavaScript での文字列の連結
[複数の文字列をより適切に連結する方法]