这是我参与更文挑战的第2天,活动详情查看: 更文挑战
转型函数
Boolean
var b = Boolean("herb"); // b == true
var type = typeof b; // type == "boolean"
转型函数,可以将任何数据类型转换成转成布尔值。如果是对象会返回true。
在if等流程控制语句中会自动执行其他类型值到布尔值的转换。
var ob = new Boolean("herb"); // ob.valueOf() == true
var type = typeof ob; // type == "object"
Boolean当成构造函数执行,生成一个布尔值对象。
Boolean() // false
new Boolean() // Boolean {false}
不传参数时,为false。
Number
var num = Number("123"); // num == 123
var num1 = Number(" 123"); // num1 == 123
var booleanNum = Number(true); // true == 1
var booleanNum1 = Number(false); // false == 0
var nullNum = Number(null); // null == 0
var undefinedNum = Number(undefined); // undefined == NaN
var strNum = Number(""); // "" == 0
var strNum1 = Number("0xf"); // "0xf" == 15
var strNum2 = Number("123s"); // "123s" == NaN
Number()参数不同,结果也不同。
- 如果是数字就直接返回,无需转换。
- 如果不是Number的原始类型,
Number(原始类型)转换结果如上。 - 如果是引用类型(除了符号以外),
Number(对象)。先调用对象的valueOf()方法,即Number(对象.valueOf())。- 如果对象是Number、String、Boolean这种自动包装的类型,valueOf()就会返回对象的原始类型,再按照
Number(原始类型)转换。 - 如果上述返回值是NaN,那就重新调用一次,相当于
Number(对象.toString());
- 如果对象是Number、String、Boolean这种自动包装的类型,valueOf()就会返回对象的原始类型,再按照
Number()默认返回0,和Number(undefined)不同。
String
var str = String(10); // "10"
var str1 = String(true); // "true"
var syb = String(Symbol("符号")); // "Symbol(符号)"
var nullStr = String(null); // "null"
var undefinedStr = String(undefined); // "undefined"
如果是null、undefined就返回两个值的字面量文本,因为他们俩没有toString方法。
如果是其他的数据类型,则调用toString方法,几乎所有值都有toString()方法。这样创建的对象Object.create(null)没有原型,自然没有toString()方法。
String(数据类型)可以把任何数据类型转换成字符串形式。
使用 String() 方法被认为是一种更加安全的做法,虽然该方法底层使用的也是 toString() 方法,但是针对 null/undefined/symbols,String() 方法会有特殊的处理。
如果该数据类型没有toString方法。就会报错:
String(Object.create(null));
// Uncaught TypeError: Cannot convert object to primitive value
// 不能将对象转换成原始类型。
var outputStrings = [];
for (let i = 0, n = inputValues.length; i < n; ++i) {
outputStrings.push(String(inputValues[i]));
}
ECMAScript中的字符串是不可变的,一旦创建他们的值就不能变了。要修改某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量。
String()默认返回""。
Object
Object()和new Object()没有区别,都可以把传入的参数转换成对应类型的对象。
var strObj = Object("字符串");
var strObj1 = new Object("字符串");
let arr = [1, 2, [3, 4, 5]];
Object(arr) === arr // true
let obj = {};
new Object(obj) === obj; // true
如果传入的参数本身就是一个对象,那么不会做任何处理,直接返回。
function isReferenceType(ele) {
return Object(ele) === ele
}
可以这样判断传进来的参数是否为引用类型。
包装类
Number、String、Boolean作为构造函数创建对象时,会利用自身的转型函数,将传入的参数转型。
const num = new Number(null); // new Number( Number(null) )
const str = new String({}); // new String( Strubg({}) )
const b = new Boolean(null); // new String( Boolean(null) )