枚舉 遍歷
遍歷數(shù)組
// 如何取數(shù)組的值關(guān)鍵 :數(shù)組有l(wèi)ength
var arr = ['1蘋果', '2香蕉', '3芒果', '4檸檬'];
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]); // 1蘋果 汽畴,2香蕉戈二,3芒果,4檸檬
}
遍歷對象, var prop in obj 取出對象所有屬性的值(不取屬性 只取值)
var obj = {
a: 123,
b: 234,
c: 345,
};
for (var prop in obj) {
// console.log(obj.prop); 結(jié)果是undefined
// 底層原理結(jié)果是:console.log(obj['prop']) 此時的'prop'代表的是一個屬性名
// obj.name------>obj['name']
if (obj.hasOwnProperty(prop)) { //判斷prop 是不是自己的屬性队塘。hasOwnProperty(prop)袁梗,屬性名的字符串形式傳進去
console.log(obj[prop]); //此時的prop 代表的是一個變量 系統(tǒng)帶的不會遍歷到, 只有自己設(shè)的才會被遍歷到
// cosole.log(obj.prop) obj.prop底部原理是 ————> obj['prop']
//obj.prop 的prop 是字符串''prop''-->obj.''prop''憔古。obj[ ]內(nèi)部是變量 遮怜、表達式、基本類型
// obj[1+2] =》 obj[3]
// var a = "A"; var b="B"; obj[a+b] => obj["AB"]
}
}
數(shù)組也算特殊類型的對象鸿市,也可以用var prop in arr取出數(shù)組所有索引的值
var arr1 = ['我在圖書館', 25, 'xuexi']锯梁;
var key// 和var key in arr1 結(jié)果一樣 可以在外部申明變量
for ( key in arr1) {
console.log(arr1[key]); //我在圖書館 25 xuexi
}
知識點:
obj.name=obj['name']
1+''='1';
下面的案例很好的將這個兩個知識點運用到
var deng = {
wife1: {
name: "小趙",
},
wife2: {
name: "小趙",
},
wife3: {
name: "小趙",
}
sayWife: function(num) {
return this['wife' + num]
}
}
console.log(deng.sayWife(3)); // {name:''小孫"}
正確區(qū)分數(shù)組和對象的方法
typeof ([ ])--->"object"
typeof( {}) ---->"object"
typeof() 無法區(qū)分數(shù)組和對象。
1.instanceof
instanceof: A instanceof B -->> A對象是不是B構(gòu)造函數(shù)構(gòu)造出來的
正確說明: 看A對象的原型鏈上 有沒有 B的原型焰情,其實起作用的是 constructor
[ ] instanceof Array--->true
var obj={ },obj instanceof Array ---->false
2.constructor
[ ].constructor ---->function Array(){}
var obj={},obj.constructor ---->function Object(){ }
3.toString(){ } 推薦使用陌凳,區(qū)別數(shù)組和對象
包裝類都重寫了自己的toString方法,
Number.prototype.toString
Arry.prototype.toString
Boolean.prototype.toString
String.prototype.toString
只有Object.prototype.toString 能夠區(qū)分
Object.prototype.toString=functon(){
---》 識別調(diào)用者 并且返回相應(yīng)的結(jié)果
} //我們需要找的也是這個調(diào)用者的類型内舟。這個調(diào)用者 其實也就是函數(shù)方法的 this冯遂。
猜想:通過包裝類特點可了解 ,().toString() 是處理調(diào)用者的谒获。根據(jù)調(diào)用者的數(shù)據(jù)類型可選擇下面對應(yīng)的方法蛤肌。
Object.prototype.toString.call( [ ]); // ''[object Array ]''
bject.prototype.toString.call(123); //''[object Number]''
bject.prototype.toString.call({ }); //"[object obje
三目運算符
三目運算符號:
條件判斷?是:否 并且會返回值
比if else高端點 有返回值
var Num = 1 > 0 ? ("10" > 9 ? 1 : 0) : 2; //結(jié)果是1
var Num2 = 1 > 0 ? ("10" > 9 ? 1 : 0) : 2; //結(jié)果是0
克隆
淺度克隆,互相影響
function clone(ori, target) {
var tar = target|| {}; //排除沒有傳target —target= undefied 或者 null
for (var prop in ori) {
tar[prop] = ori[prop];
}
return tar;
}
深度克隆 各自獨立
步驟:
遍歷對象批狱,(var prop in object)
1,判斷是否是原始值 typeof() 判斷是否是 object
2,判斷是數(shù)組還是對象 使用 toString() 總共有3種方法 instanceof() constructor--->不建議使用 有跨子域的問題裸准。
3,建立相應(yīng)的數(shù)組或?qū)ο?br>
4,遞歸
function deepClone(origin, target) {
var target = target || {}, // 遍歷對象 排除沒有傳target —target= undefied 或者 null
toStr = Object.prototype.toString,
arrStr = "[object Array]";
for (var prop in origin) {
// 只取自身的屬性和值。避免拿原型鏈上的屬性和值
if (origin.hasOwnProperty(prop)) {
// 判斷是原始值是否是引用值: 方法typeof() null
if (origin[prop] !== "null" &&
typeof(origin[prop]) == 'Object') {
// 判斷是 對象還是數(shù)組的引用值
target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
deepClone(origin[prop], target[prop]);
} else {
// 原始值時:
target[prop] = origin[prop];
}
}
}
return target;
}