1.
只能判斷區(qū)分基本類(lèi)型,、、、和,;
typeof 0; //number;
typeof true; //boolean;
typeof undefined; //undefined;
typeof "hello world" //string;
typeof function(){}; //function;
typeof null; //object
typeof {}; //object;
typeof []; //object
判斷對(duì)象和數(shù)組都返回,因此它無(wú)法區(qū)分對(duì)象和數(shù)組。
2.
var a={};
a instanceof Object //true
a intanceof Array //false
var b=[];
b instanceof Array //true
b instanceof Object //true
因?yàn)閿?shù)組屬于中的一種,所以數(shù)組 ,也是true.
var c='abc';
c instanceof String; //false
var d=new String();
d instanceof String //true
不能區(qū)分基本類(lèi)型和,除非是字符串對(duì)象和布爾對(duì)象。
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
不過(guò)要注意,屬性是可以被修改的,會(huì)導(dǎo)致檢測(cè)出的結(jié)果不正確
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,其他類(lèi)型的變量均能使用判斷出類(lèi)型.
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]"
封裝一個(gè)判斷數(shù)組和對(duì)象的方法
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"
}
}
..方法的在被調(diào)用的時(shí)候,會(huì)執(zhí)行如下的操作步驟:
1. 獲取對(duì)象的類(lèi)名(對(duì)象類(lèi)型)。
[[Class]]是一個(gè)內(nèi)部屬性,所有的對(duì)象(原生對(duì)象和宿主對(duì)象)都擁有該屬性.在規(guī)范中,[[Class]]是這么定義的:
內(nèi)部屬性,[[Class]] 一個(gè)字符串值,表明了該對(duì)象的類(lèi)型。
2. 然后將[ 獲取的對(duì)象類(lèi)型的名]組合為字符串
3. 返回字符串 “[ Array]” 。
/**
* 判斷此對(duì)象是否是Object類(lèi)型
* @param {Object} obj
*/
function isObject(obj){
return Object.prototype.toString.call(obj)==='[object Object]';
};
/**
* 判斷此類(lèi)型是否是Array類(lèi)型
* @param {Array} arr
*/
function isArray(arr){
return Object.prototype.toString.call(arr)==='[object Array]';
};
/**
* 深度比較兩個(gè)對(duì)象是否相同
* @param {Object} oldData
* @param {Object} newData

*/
function equalsObj(oldData,newData){
// 類(lèi)型為基本類(lèi)型時(shí),如果相同,則返回true
if(oldData === newData) return true;
if(isObject(oldData)&&isObject(newData)&&Object.keys(oldData).length === Object.keys(newData).length){
// 類(lèi)型為對(duì)象并且元素個(gè)數(shù)相同
// 遍歷所有對(duì)象中所有屬性,判斷元素是否相同
for (const key in oldData) {
if (oldData.hasOwnProperty(key)) {
if(!equalsObj(oldData[key],newData[key]))
// 對(duì)象中具有不相同屬性 返回false
return false;
}
}
}else if(isArray(oldData)&&isArray(oldData)&&oldData.length===newData.length){
// 類(lèi)型為數(shù)組并且數(shù)組長(zhǎng)度相同
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
改進(jìn):以上方法可以判斷出兩個(gè)數(shù)組對(duì)象是否相同,但是對(duì)于以下無(wú)序數(shù)組對(duì)象上述方法得到的為falsejs判斷元素是否為空,入滿(mǎn)足需求可以用上述方法,但需求認(rèn)為兩個(gè)數(shù)組為相同那么可以改進(jìn)以上方法:
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])) {
//兩個(gè)值不同
if (j !== newData.length-1) {
continue;
} else {
return false;
}
} else {
break sss;
}
}
}
代替以下部分
for (let i = 0,length=oldData.length; i
如果是對(duì)象可以仿照數(shù)組的實(shí)現(xiàn)方法,改進(jìn)的方法可以實(shí)現(xiàn)判斷無(wú)序的數(shù)組對(duì)象是否相等。
ps:項(xiàng)目需求就是這樣的,文案不好js判斷元素是否為空,見(jiàn)諒,有問(wèn)題歡迎留言探討!
友情鏈接: 餐飲加盟
地址:北京市海淀區(qū) 電話(huà):010- 郵箱:@126.com
備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有