基本类型:
基本类型值(数值、布尔值、字符串、null和undefined):指的是保存在栈内存中的简单数据段;
var a;
var b;
var obj;
var obj2;
a = 1;
b = 2;
b = a;
console.log(a);
console.log(b);
//值传递
引用类型:一切引用类型都是对象
对象
简单说,所谓对象,就是一种无序的数据集合,由若干个“键值对”(key-value)构
var obj = {
p: 'Hello World'
};
{key: value}
键名
- 对象的所有键名都是字符串,所以加不加引号都可以。
- 如果键名是数值,会被自动转为字符串
- 但是,如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),也不是数字,则必须加上引号,否则会报错。
属性
- 对象的每一个“键名”又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。
- 对象的属性之间用逗号分隔,最后一个属性后面可以加逗号(trailing comma),也可以不加
读取属性
- 读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符
- 注意,如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。但是,数字键可以不加引号,因为会被当作字符串处理。
查看所有属性
- 查看一个对象本身的所有属性,可以使用Object.keys方法
- for...in循环用来遍历一个对象的全部属性
删除属性
delete命令用于删除对象的属性,删除成功后返回true
对象的引用:
如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。
引用类型值(对象、数组、函数、正则):
指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象
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()
函数的参数传递:按值传递
注意:
然后看你传的参数是基本类型还是引用类型,基本类型是复制一个值,引用类型是复制一个地址;
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;
}
深拷贝
// 递归实现一个深拷贝
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实现深拷贝
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
//进阶版
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
作者:彭荣辉
链接:https://www.jianshu.com/u/0f804364a8a8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。