javascript中,只有null和undefined不能拥有方法,其他任何类型都可以在其上定义方法;
字符串既然不是对象,怎么会有属性呢?
只有引用了字符串的属性,那么javascript就会将字符串通过调用new String()的方式转换为对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或者销毁这个临时对象,然而整个过程看起来是这样)。
同字符串一样,数字和布尔值也具有各自的方法:通过Number()和boolean()构造函数创建一个临时对象,这些方法的调用均是来自于这个临时对象,null和undefined没有包装器,所以访问他们的属性会造成一个类型错误。
比如
var s="test";
s.len=4;
var t=s.len;
则t的值是undefined,因为在对s的属性len赋值之后便会销毁这个临时对象,那么该对象已经不存在了,所以在调用s.len的时候会返回undefined。
存取字符串,数字或者布尔值的属性时创建的对象叫做包装对象,它只是偶尔用来区分字符串值和字符串对象,数字和数字对象以及布尔值和布尔值对象。通常,包装对象只是被看做是一种实现细节,而不用特别关注。由于字符串,数字和布尔值的属性都是只读的,并且不能给他们定义新属性,因此你需要明白他们是有别于对象的。
javascript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这意味着变量在声明之前甚至已经可用。javascript的这个特性被非正式的称为声明提前(hoisting),即javascript函数里声明的所有变量(但不涉及赋值)都被“提前”至函数体的顶部。