原始值有数字、字符串、布尔值、undefined、null。
但是在JavaScript中,
-
数字可分为:原始值数字,数字类型对象。
-
字符串可分为:原始值字符串,字符串类型对象。
-
布尔值可分为:原始值布尔值,布尔值类型对象。
-
但是undefined、null没有上面这些东西。
可以像下面这样生成原始值对象:
var num = new Number(123);
var str = new String('abcd');
var bol = new Boolean('true');
------------------------
num
Number {123}
------------------------
str
String {"abcd"}
------------------------
bol
Boolean {true}
下面讲讲包装类
在下面代码中,num并不是一个对象,所以它不包含属性和方法,应该报错,但是并没有。
var num = 4;
num.len = 3; // 在这里num是原始值,原始值没有方法函数,那怎么办呢
// 创建new Number(4).len = 3; 系统会创建数字类型对象,是为了不让系统报错, 然后会delete
console.log(num.len);
// 创建new Number(4).len; 同样是为了不报错
----------------------------------
输出结果为:undefined
在num.len = 3; 这里,系统会新建一个数字对象new Number(4).len = 3; delete。
让对象的len等于3。然后删除。
当下面语句再访问num.len时,系统又会创建一个new Number(4).len,
但这个对象里面没有值,所以结果会是undefined,这个隐式的环节叫包装类。
来一道测试题:
var str = "abcd";
str.length = 2;
console.log(str);
--------------------------
abcd
这里字符串abcd并没有被截断,原理同上。
var str = "abcd";
//为不报错,创建new String('abcd').length = 2; delete
str.length = 2;
//再访问str时,上面一步对str并没有起作用,没影响,所以还是输出abcd。
console.log(str);
//而如果这里访问console.log(str.length),
//系统会创建,new String('abcd').length,输出其值,4;
再来一道测试题:
var str = "abc";
str += 1;
var test = typeof(str); str = "string"
if(test.length == 6){
test.sign = "typeof的返回结果可能为String";
}
console.log(test.sign);
--------------------------------
undefined
输出结果并不是定义好的字符串,而是undefined。解释如下:
var str = "abc";
str += 1;
var test = typeof(str); str = "string"
if(test.length == 6){
test.sign = "typeof的返回结果可能为String";
//在这创建new String(test).sign = "xxx";
}
//当要再次调用test.sign时,
//又会创建new String(test).sign,这个对象和上面的没关系。这里为空,输出值为undefined。
console.log(test.sign);