1 巧转类型
js是弱类型语言
两个操作数,一个是数字,一个是字符串时: - 运算 +拼接
将变量 a 转为字符串 :a+"";
将变量 a 转为数字 : a-0;
2 ==
类型不同,尝试类型转换和比较
null==undefined //true
object == number | sring :尝试将对象转为基本类型 new String('hi')=='hi' //true
new Object ==new Object
3 ===
new Object !== new Object//对象比较比的的是引用
4 包装对象
var a = "string";
console.log(a.length) //6
a.num=10;
console.log(a.num) //undefined
5 类型判断操作符
(1)typeof判断 返回一个字符串,适合基础数据类型和函数对象
typeof null //object 历史原因.如果修改,大量网站无法访问.兼容问题
(2)instanceof 基于原型链判断的操作符
期望左操作数是对象,否则false,期望右操作数是函数对象或函数构造器,否则抛出typeErr异常
大概原理:判断左操作数的对象的原型链是否有右对象的prototype属性
myobj instanceof Object
[1,2] instanceof Array //
new Object instanceof Array //false
类型检测小结:
typeof:适合基本类型及function检测,遇到null失效
Object.prototype.toString.call( myobj ):适合内置对象和基元类型,遇到null和undefined失效(IE678等返回[Object Object]) 例 Object.prototype.toString.call([1,2]) // "[Objext Array]"
instanceof:适合自定义对象,也可用来检测原生对象,在不同window和iframe间检测时失效. 例: [] instanceof Array //true
判断日期对象:
new Date() instanceof Date //true
Object.prototype.toString.call(new Date()) //"[object Date]"
判断window对象:
Object.prototype.toString.call(window) //"[object Window]"
window instanceof Window //true
判断数组
[] instanceof Array //true
Object.prototype.toString.call([]) //"[object Array]"
判断自定义对象
var a={}; a instanceof Object //true 注:这个如果直接{ a:1} instanceof Object会报错
Object.prototype.toString.call({}) //"[object Object]"
判断null
var a; a===null //true说明变量是null,false说明不是
String,Boolean,Number,undefined,Function 用typeof就可判断
function typeTest(myobj){
var type=typeof myobj;
if(type=="object"){
if(myobj===null){
return "null";
}
if(myobj instance of Array){
return "Array"
}
if(Object.prototype.toString.call(myobj)=="[Object Date]"){
return "Date"
}
if(myobj instanceof Window){
return "window"
}
return "object";
}
return type; //String,Boolean,Number,undefined,Function
}
练习:
请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
2. 数组的长度一致。
3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
当以上全部满足,则返回"判定结果:通过",否则返回"判定结果:不通过"。
/*
* param1 Array
* param2 Array
* return true or false
*/
function arraysSimilar(arr1, arr2){
var respass="判定结果:通过",
resunpass="判定结果:不通过";
if(arr1 instanceof Array && arr2 instanceof Array){
if(arr1.length!=arr2.length){
return resunpass;
}
var arr1type=[],arr2type=[];
pushtype(arr1type,arr1)
pushtype(arr2type,arr2)
arr1type.sort();
arr2type.sort();
for(var i=0;i<arr1type.length;i++){
if(arr1type[i]!=arr2type[i]){
return resunpass
}
}
return respass;
}
}else{
return resunpass;
}
}
function typeTest(myobj){
var type=typeof myobj;
if(type=="object"){
if(myobj===null){
return "null";
}
if(myobj instance of Array){
return "Array"
}
if(Object.prototype.toString.call(myobj)=="[Object Date]"){
return "Date"
}
if(myobj instanceof Window){
return "window"
}
return "object";
}
return type;
}
function pushtype(arrtype,arr){
for(var i=0;i<arr.length;i++){
var nowi=arr[i];
var t=typeTest(nowi);
arrtype.push(t);
}
来源:http://www.cnblogs.com/zhangwl/p/8602989.html