1.转为字符串
1. x.toString();
1.toString() //'1' 数字转字符串
true.toString()//'true' 布尔值转字符串
null.toString()//报错 null转字符串
undefined.toString()//报错 undefined转字符串
({}).toSring()//'[Object][Object]'对象转字符串
2. String(x);
String(1) //'1'
String(true)// 'true'
String(null) // 'null'
String(undefined) //'undefined'
String({}) //'[Object][Object]'
3.老司机方法: x + ''
1+''// '1'
true + '' //'true'
null + '' //'null'
undefined + '' // 'undefined'
var a = {};a + '' //'[Object][Object]'
复制代码
2.转成布尔值
1.Boolean(x)
Boolean('1'); //true 字符串转布尔
Boolean(1);//true 数字转布尔
Boolean(0) //false 数字0转布尔为false
Boolean(null) //false
Boolean(undefined) //false
Boolean('') //false 空字符串
Boolean(NaN) //false NaN
Boolean({}) //true 对象转成布尔值都是true
2.!!X
!!1; //true
!!'1' //true
!!0 //false
!!null //false
!!undefined //false
!!'' //false
!!NaN //false
!!{} //true
复制代码
3.转成Number
1.Number(x)
2.parseInt(x,10) //parseInt('1') === 1
3.parseFloat(x)// parseFloat('1.23') === 1.23
4.'x' + 0 //'1' + 0 === 1
复制代码
4.包装对象
所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
Number、String和Boolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。
这三个对象作为构造函数使用(带有new)时,可以将原始类型的值转为对象;作为普通函数使用时(不带有new),可以将任意类型的值,转为原始类型的值。
var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);
基于原始类型的值,生成了三个对应的包装对象
typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"
v1 === 123 // false
v2 === 'abc' // false
v3 === true // false
复制代码
包装对象的最大目的,首先是使得 JavaScript 的对象涵盖所有的值,其次使得原始类型的值可以方便地调用某些方法
Number、String和Boolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。
Number(123) // 123
String('abc') // "abc"
Boolean(true) // true
复制代码
valueOf()
返回包装对象实例对应的的原始类型的值。
new Number(123).valueOf() // 123
new String('abc').valueOf() // "abc"
new Boolean(true).valueOf() // true
复制代码
toString()
返回对应的字符串形式
new Number(123).toString() // "123"
new String('abc').toString() // "abc"
new Boolean(true).toString() // "true"
复制代码
原始类型与实例对象的自动转换
原始类型的值,可以自动当作对象调用,即调用各种对象的方法和参数。这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,在使用后立刻销毁实例。
比如,字符串可以调用length属性,返回字符串的长度。
'abc'.length // 3
复制代码
上面代码中,abc是一个字符串,本身不是对象,不能调用length属性。JavaScript 引擎自动将其转为包装对象,在这个对象上调用length属性。调用结束后,这个临时对象就会被销毁。这就叫原始类型与实例对象的自动转换。
var str = 'abc';
str.length // 3
// 等同于
var strObj = new String(str)
// String {
// 0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"
// }
strObj.length // 3
复制代码
自动转换生成的包装对象是只读的,无法修改。所以,字符串无法添加新属性。
var s = 'Hello World';
s.x = 123;
s.x // undefined
复制代码
上面代码为字符串s添加了一个x属性,结果无效,总是返回undefined。
另一方面,调用结束后,包装对象实例会自动销毁。这意味着,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。如果要为字符串添加属性,只有在它的原型对象String.prototype上定义