目录
1.转换和等价Conversions and Equality
JavaScript 对所需的值类型非常灵活。
- 当 JavaScript 需要一个布尔值时,你可以提供任何类型的值,JavaScript 会根据需要对其进行转换。 一些值(“真”值)转换为真,而其他(“假”值)转换为假。
- 如果 JavaScript 想要一个字符串,它会将你给它的任何值转换为字符串。 、
- 如果 JavaScript 需要一个数字,它会尝试将您给它的值转换为一个数字(如果它无法执行有意义的转换,则转换为 NaN)。
10 + " objects" // => "10 objects": Number 10 converts to a string
"7" * "4" // => 28: both strings convert to numbers
let n = 1 - "x"; // n == NaN; string "x" can't convert to a number
n + " objects" // => "NaN objects": NaN converts to string "NaN"
JavaScript type conversions类型转换表https://www.notion.so/9b9c808520b242d0a1af3ce57253834e
注意:空格意味着不需要转换,红色加粗意味着要特别注意
可以解析为数字的字符串将转换为这些数字。允许使用前导和尾随空格,但是任何不属于数字字面量的前导或尾随非空格字符都会导致字符串到数字的转换产生NaN。
1.转换和等价Conversions and Equality
JavaScript有两个操作符来测试两个值是否相等。
“严格相等操作符”===,如果操作数不是同一类型,则不认为其操作数相等,编码时几乎总是使用严格相等操作符。
由于JavaScript在类型转换方面非常灵活,它还定义了具有灵活相等定义的==操作符。
null == undefined // => true: These two values are treated as equal.
"0" == 0 // => true: String converts to a number before comparing. 字符串在比较之前转换为数字
0 == false // => true: Boolean converts to number before comparing. 布尔值在比较之前转换为数字
"0" == false // => true: Both operands convert to 0 before comparing! 两个操作数在比较之前都转换为 0
请记住,将一个值转换为另一个值并不意味着这两个值相等。
例如,如果在需要布尔值的地方使用 undefined,它将转换为 false。 但这并不意味着 undefined == false。
JavaScript 运算符和语句需要各种类型的值并执行到这些类型的转换。
if 语句将 undefined 转换为 false,但 == 运算符从不尝试将其操作数转换为布尔值
2.显式转换Explicit Conversions
1.通过函数
执行显式类型转换的最简单方法是使用 Boolean()、Number() 和 String() 函数
Number("3") // => 3
String(false) // => "false": Or use false.toString()
Boolean([]) // => true
除 null 或 undefined 之外的任何值都有一个 toString() 方法,该方法的结果通常与 String() 函数返回的结果相同。
Boolean()、Number() 和 String() 函数也可以使用 new 作为构造函数constructor来调用。
如果您以这种方式使用它们,您将获得一个**“包装器”对象**“wrapper” object,其行为类似于原始布尔值、数字或字符串值。a primitive boolean, number, or string value
这些包装器对象是 JavaScript 早期的历史遗留物,而且从来没有任何好的理由使用它们。
2.通过运算符
某些 JavaScript 运算符执行隐式类型转换,有时会被用于显式类型转换。
如果 + 运算符的一个操作数是字符串,则它将另一个操作数转换为字符串。
一元 + 运算符将其操作数转换为数字。
一元! 运算符将其操作数转换为布尔值并将其取反。
x + "" // => String(x)
+x // => Number(x)
x-0 // => Number(x)
!!x // => Boolean(x): Note double !
//**一些习惯用法**
3.将数字转换为字符串number-to-string
1.不同基数的转换
Number 类Number class定义的 toString() 方法接受一个可选参数,该参数指定转换的radix或base。
如果不具体指定,则转换以 10 为基数。但是,您也可以用其他基数(2 到 36 之间)转换数字。
let n = 17;
let binary = "0b" + n.toString(2); // binary == "0b10001"
let octal = "0o" + n.toString(8); // octal == "0o21"
let hex = "0x" + n.toString(16); // hex == "0x11"
2.控制位数和指数
处理财务或科学数据时,您可能希望将数字转换为字符串,以便控制输出中的小数位数decimal places或有效位数the number of significant digits,或者您可能希望控制是否使用指数表示法。
toFixed() 将数字转换为小数点后指定位数的字符串。它从不使用指数符号。
toExponential() 使用指数表示法将数字转换为字符串,小数点前有一位,小数点后有指定的位数(这意味着有效位数比您指定的值大一)。
toPrecision() 将数字转换为具有您指定的有效位数的字符串。如果有效数字的数量不足以显示数字的整个整数部分,则它使用指数表示法。
所有三种方法都将尾随数字四舍五入或酌情用零填充
let n = 123456.789;
n.toFixed(0) // => "123457"
n.toFixed(2) // => "123456.79"
n.toFixed(5) // => "123456.78900"
n.toExponential(1) // => "1.2e+5"
n.toExponential(3) // => "1.235e+5"
n.toPrecision(4) // => "1.235e+5"
n.toPrecision(7) // => "123456.8"
n.toPrecision(10) // => "123456.7890"
4.将字符串转换为数字string-to-number
如果将字符串传递给 Number() 转换函数,它会尝试将该字符串解析为整数或浮点字面量。
该函数仅适用于以 10 为基数的整数,并且不允许不属于字面量一部分的尾随字符trailing characters that are not part of the literal。
parseInt() 和 parseFloat() 函数(它们是全局函数global functions,不是任何类的方法methods of any class)更加灵活。
parseInt() 只解析整数,而 parseFloat() 解析整数和浮点数。
如果字符串以“0x”或“0X”开头,则 parseInt() 将其解释为十六进制数。
parseInt() 和 parseFloat() 都跳过前导空格,尽可能多地解析数字字符,并忽略后面的任何内容。
如果第一个非空格字符不是有效数字字面量的一部分,则返回 NaN
parseInt("3 blind mice") // => 3
parseFloat(" 3.14 meters") // => 3.14
parseInt("-12.34") // => -12
parseInt("0xFF") // => 255
parseInt("0xff") // => 255
parseInt("-0XFF") // => -255
parseFloat(".1") // => 0.1
parseInt("0.1") // => 0
parseInt(".1") // => NaN: integers can't start with "."
parseFloat("$72.47") // => NaN: numbers can't start with "$
parseInt() 接受可选的第二个参数,指定要解析的数字的基数(基数)。 合法值在 2 到 36 之间
parseInt("11", 2) // => 3: (1*2 + 1)
parseInt("ff", 16) // => 255: (15*16 + 15)
parseInt("zz", 36) // => 1295: (35*36 + 35)
parseInt("077", 8) // => 63: (7*8 + 7)
parseInt("077", 10) // => 77: (7*10 + 7)