1.
只能判斷區(qū)分基本類型,、、、和,;
typeof 0; //number;
typeof true; //boolean;
typeof undefined; //undefined;
typeof "hello world" //string;
typeof function(){}; //function;
typeof null; //object
typeof {}; //object;
typeof []; //object
判斷對象和數(shù)組都返回,因此它無法區(qū)分對象和數(shù)組。
2.
var a={};
a instanceof Object //true
a intanceof Array //false
var b=[];
b instanceof Array //true
b instanceof Object //true
因為數(shù)組屬于中的一種,所以數(shù)組 ,也是true.
var c='abc';
c instanceof String; //false
var d=new String();
d instanceof String //true
不能區(qū)分基本類型和,除非是字符串對象和布爾對象。
3.
var o={};
o.constructor==Object //true
var arr=[];
arr.constructor==Array //true
arr.constructor==Object //false
可以看出可以區(qū)分Array和。
var n=true;
n.constructor==Boolean //true
var num=1;
num.constructor==Number //true

var str='hello world';
str.constructor==String //true
var num=new Number();
num.constructor==Number //true
不過要注意,屬性是可以被修改的,會導致檢測出的結果不正確
function Person(){
}
function Student(){
}
Student.prototype = new Person();
var John = new Student();
console.log(John.constructor==Student); // false
console.log(John.constructor==Person); // true
除了和null,其他類型的變量均能使用判斷出類型.
4....call() ---------最好用
Object.prototype.toString.call(123)
//"[object Number]"
Object.prototype.toString.call('str')
//"[object String]"
Object.prototype.toString.call(true)
//"[object Boolean]"
Object.prototype.toString.call({})
//"[object Object]"
Object.prototype.toString.call([])
//"[object Array]"
封裝一個判斷數(shù)組和對象的方法
function typeObj(obj){

var type=Object.prototype.toString.call(obj);
if(type=='[object Array]'){
return 'Array';
}elseif(type=='[object Object]'){
return 'Object';
}else{
return "obj is not object or array"
}
}
..方法的在被調用的時候,會執(zhí)行如下的操作步驟:
1. 獲取對象的類名(對象類型)。
[[Class]]是一個內部屬性,所有的對象(原生對象和宿主對象)都擁有該屬性.在規(guī)范中,[[Class]]是這么定義的:
內部屬性,[[Class]] 一個字符串值,表明了該對象的類型。
2. 然后將[ 獲取的對象類型的名]組合為字符串
3. 返回字符串 “[ Array]” 。
/**
* 判斷此對象是否是Object類型
* @param {Object} obj
*/
function isObject(obj){
return Object.prototype.toString.call(obj)==='[object Object]';
};
/**
* 判斷此類型是否是Array類型
* @param {Array} arr
*/
function isArray(arr){
return Object.prototype.toString.call(arr)==='[object Array]';
};
/**
* 深度比較兩個對象是否相同
* @param {Object} oldData
* @param {Object} newData

*/
function equalsObj(oldData,newData){
// 類型為基本類型時,如果相同,則返回true
if(oldData === newData) return true;
if(isObject(oldData)&&isObject(newData)&&Object.keys(oldData).length === Object.keys(newData).length){
// 類型為對象并且元素個數(shù)相同
// 遍歷所有對象中所有屬性,判斷元素是否相同
for (const key in oldData) {
if (oldData.hasOwnProperty(key)) {
if(!equalsObj(oldData[key],newData[key]))
// 對象中具有不相同屬性 返回false
return false;
}
}
}else if(isArray(oldData)&&isArray(oldData)&&oldData.length===newData.length){
// 類型為數(shù)組并且數(shù)組長度相同
for (let i = 0,length=oldData.length; i
使用:
var oldArr = [{
name: "張三",

age: 11,
},{
name: '李四',
age: 21,
}];
var newArr = [{
name: "張三",
age: 11
},{
name: '王五',
age: 21,
}];
console.log(equalsObj(oldArr,newArr));// false
var oldArr = [{
name: "張三",
age: 11,
},{
name: '李四',
age: 21,
}];
var newArr = [{
name: "張三",
age: 11
},{
name: '李四',
age: 21,
}];
console.log(equalsObj(oldArr,newArr));// true
改進:以上方法可以判斷出兩個數(shù)組對象是否相同,但是對于以下無序數(shù)組對象上述方法得到的為falsejs判斷元素是否為空,入滿足需求可以用上述方法,但需求認為兩個數(shù)組為相同那么可以改進以上方法:
var oldArr = [{
name: "張三",
age: 11,

},{
name: '李四',
age: 21,
}];
var newArr = [{
name: "李四",
age: 21
},{
name: '張三',
age: 11,
}];
可以用
for (let i = 0, length = oldData.length; i < length; i++) {
let flag = false;
sss: for (let j = 0, length = newData.length; j < length; j++) {
if (!equalsObj(oldData[i], newData[j])) {
//兩個值不同
if (j !== newData.length-1) {
continue;
} else {
return false;
}
} else {
break sss;
}
}
}
代替以下部分
for (let i = 0,length=oldData.length; i
如果是對象可以仿照數(shù)組的實現(xiàn)方法,改進的方法可以實現(xiàn)判斷無序的數(shù)組對象是否相等。
ps:項目需求就是這樣的,文案不好js判斷元素是否為空,見諒,有問題歡迎留言探討!