基本類型:
基本類型值(數(shù)值、布爾值、字符串、null和undefined):指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段;
var a;
var b;
var obj;
var obj2;
a = 1;
b = 2;
b = a;
console.log(a);
console.log(b);
//值傳遞
引用類型:一切引用類型都是對象
對象
簡單說,所謂對象,就是一種無序的數(shù)據(jù)集合,由若干個“鍵值對”(key-value)構(gòu)
var obj = {
p: 'Hello World'
};
{key: value}
鍵名
- 對象的所有鍵名都是字符串,所以加不加引號都可以。
- 如果鍵名是數(shù)值,會被自動轉(zhuǎn)為字符串
- 但是,如果鍵名不符合標(biāo)識名的條件(比如第一個字符為數(shù)字,或者含有空格或運(yùn)算符),也不是數(shù)字,則必須加上引號,否則會報錯。
屬性
- 對象的每一個“鍵名”又稱為“屬性”(property),它的“鍵值”可以是任何數(shù)據(jù)類型。如果一個屬性的值為函數(shù),通常把這個屬性稱為“方法”,它可以像函數(shù)那樣調(diào)用。
- 對象的屬性之間用逗號分隔,最后一個屬性后面可以加逗號(trailing comma),也可以不加
讀取屬性
- 讀取對象的屬性,有兩種方法,一種是使用點(diǎn)運(yùn)算符,還有一種是使用方括號運(yùn)算符
- 注意,如果使用方括號運(yùn)算符,鍵名必須放在引號里面,否則會被當(dāng)作變量處理。但是,數(shù)字鍵可以不加引號,因為會被當(dāng)作字符串處理。
查看所有屬性
- 查看一個對象本身的所有屬性,可以使用Object.keys方法
- for...in循環(huán)用來遍歷一個對象的全部屬性
刪除屬性
delete命令用于刪除對象的屬性,刪除成功后返回true
對象的引用:
如果不同的變量名指向同一個對象,那么它們都是這個對象的引用,也就是說指向同一個內(nèi)存地址。修改其中一個變量,會影響到其他所有變量。
引用類型值(對象、數(shù)組、函數(shù)、正則):
指的是那些保存在堆內(nèi)存中的對象,變量中保存的實(shí)際上只是一個指針,這個指針執(zhí)行內(nèi)存中的另一個位置,由該位置保存對象
var obj = {
name: 'xiaohui',
sex: 'male',
age: 18,
friend: {
name: 'hello',
age: 1000
}
}
var newObj = {};
var obj2 = obj;
var obj3 = {name: 'hello'};
var obj4 = {name: 'hello'};
console.log (obj3 === obj4);
function sum(){
console.log('sum...')
}
var sum2 = sum;
sum2()
函數(shù)的參數(shù)傳遞:按值傳遞
注意:
然后看你傳的參數(shù)是基本類型還是引用類型,基本類型是復(fù)制一個值,引用類型是復(fù)制一個地址;
function inc(n){
n++;
}
var a = 10;
inc(a);
console.log(a);//10
function incObj(obj){
//var obj = o //0x0001
obj.n++;
}
var o = {n: 10}; //o = 0x0001
incObj(o);
console.log(o);
//[object Object] {n: 11}
function squireArr( arr ){
//var arr = 0x0011
for(var i = 0; i < arr.length; i++){
arr[i] = arr[i] * arr[i];
}
}
function squireArr2( arr ){
var newArr = [];
for(var i = 0; i < arr.length; i++){
newArr[i] = arr[i] * arr[i];
}
return newArr;
}
var arr = [2,1,3,6]; //arr 0x0011
squireArr(arr);
console.log(arr); // [4,1,9,36]
var arr2 = squireArr2(arr)
console.log(arr2);//[16, 1, 81, 1296]
console.log(arr);//[4, 1, 9, 36]
對象淺拷貝和深拷貝:
淺拷貝
function shallowCopy(oldObj) {
var newObj = {};
for(var i in oldObj) {
if(oldObj.hasOwnProperty(i)) {
newObj[i] = oldObj[i];
}
}
return newObj;
}
深拷貝
// 遞歸實(shí)現(xiàn)一個深拷貝
function deepCopy1(oldObj){
var newObj ={};
for ( var key in oldObj ){
if(typeof oldObj[key]==="object"){
newObj[key]=deepCopy1(oldObj[key]);
}else{
newObj[key]=oldObj[key];
}
}
return newObj;
}
//用JSON實(shí)現(xiàn)深拷貝
function deepCopy2(obj){
return JSON.parse(JSON.stringify(obj));
}
var obj = {
name:"xiao hui",
age:18,
info:{
sex:"男",
愛好:"女"
}
}
obj2=deepCopy1(obj);
obj3=deepCopy2(obj);
console.log(obj2);
console.log(obj===obj2);//false
console.log(obj3);
console.log(obj===obj3);//false
//進(jìn)階版
nation : '中國',
birthplaces:['北京','上海','廣州'],
skincolr :'yellow',
friends:['sk','ls']
}
function deepCopy(obj,res){
var res= res||{};
for( let i in obj){
if(typeof obj[i]==="object"){
if(obj[i] instanceof Object){
res[i]={};
}else{
res[i]=[];
}
deepCopy(obj[i],res[i]);
}else{
res[i]=obj[i];
}
}
return res;
}
var result = {name:'result'}
result = deepCopy(china,result)
console.dir(result)
console.dir(result===china)
// Objectbirthplaces: {0: "北京", 1: "上海", 2: "廣州"}friends: {0: "sk", 1: "ls"}name: "result"nation: "中國"skincolr: //"yellow"__proto__: Object
//false
作者:彭榮輝
鏈接:http://www.itdecent.cn/u/0f804364a8a8
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。