一、number string boolean 都有对应的包装类型
可以看到 str是一个基本类型,字符串类型,strObj是一个 对象类型,是String类型对应的包装类
在最后一行打 clear();清除
str是一个基本类型,他没有属性和方法,得到str的长度str.length 可以得到值,这是为什么。
给 str 添加一个属性 t也是可以的 str.t = 10;但赋值之后再看t 为undefined
JavaScript中有一个隐藏机制,当把一个基本类型,尝试为一个对象来使用时,比如在求长度,或添加属性时,会吧基本类型转化为对应的包装类型对象,相当于new String()一个同样的值,当完成访问或设置后,这个临时对象,会被销毁。
数字 number ,boolean都类似。
二、类型检测
1.类型检测分类
- typeof
- instanceof
- Object.prototype.toString
- constructor
- duck type
1)typeof
typeof运算符会返回一个字符串,适合函数对象和基本类型的判断
- typeof 100 "number"
- typeod true "boolean"
- typeof function "function"
- typeof (undefined) "undefined"
- typeof new Object() "object"
- typeof [ 1,2 ] "object" //数组也是对象
- typeof NaN "number //NAN not number ,是number类型的一个特殊值
- typeof null "object"
为什么 typeof null ==="object" 历史原因记住就好
2、判断对象类型
1)instanceof :基于原型链判断
obj instanceof Object : 左操作数必须为对象,如果为基本类型直接返回false,。右操作数,必须为函数对象,函数构造器,否则会抛出异常。
2)判断原理
判断左操作数的 原型链 上 ,是否有 右边构造函数的 prototype 属性。
[1,2] instanceof Array === true
new Object() instanceof Array ===false
注意 不同的 window 或 iframe 间的对象检测是不可以使用instanceof的。
3)Object.Prototype.toString
- Object.prototype.toString.apply ( [ ] ) === "[ object Array ]" 传入一个数组,会返回一个[ object Array ]
- .apply(function(){}):传入一个对象 ,返回 "[ object Function]"
- 传入 null 返回 [ object null ]
- 穿入 undefined 返回 object undefined
4) constructor
任何一个对象都有一个 constructor属性,继承自原型,constructor 会指向构造这个对象的构造器、构造函数。constructor是可以改写的所以使用时小心。
3、类型检测总结
typeof
适合基本类型及Function检测,遇到null失效返回 object,用 === 方式判断
Object.Prototype.toString
适合内置对象和基元类型,数组函数、在 IE 678 null undefined返回 [ object object ]。
instanceof
适合自定义对象,也可以用来检测原生对象,在不同 iframe 和 windows间检测时失效