1. 三目运算符/三元运算符
var a = 5,str = '';str = a > 0 ? '大于0' //return 自带return的功能: '小于0'; //returnconsole.log(str);
2. 拷贝/复制/克隆
var penson1 = {name: '张三',sex: 'male',age: 18,}var penson2 = penson1;penson2.name = '李四';console.log(penson1, penson2);//{name: '李四', sex: 'male', age: 18}打印出两个相同的对象,name值都变成了李四,因为两个值都是指向同样的引用地址,改一个,另外一个也会变,因为指向的是同一个存储空间
3. 浅拷贝
var penson1 = {name: '张三',sex: 'male',age: 18,}var penson3 = {};for(var key in penson1){penson3[key] = penson1[key];}penson3.name = '王五';console.log(penson1, penson3);//打印出来两个数组,但name不同,说明penson3是独立的存储空间
再给penson1加上属性son添加三项键值对
var penson1 = {name: '张三',sex: 'male',age: 18,son: {first: 'jenney',second: 'Lucy',third: 'jone'}}//然后再到penson3添加一个sonvar penson3 = {};for(var key in penson1){penson3[key] = penson1[key];}penson3.name = '王五';penson3.son.forth = 'Ben';console.log(penson1, penson3);//打印的结果两个Array都有了forth: Ben属性
说明penson3改,pensen1也会改。所以说并没有处理掉对象中的引用值,这种现象就叫做浅拷贝
#_#封装一下浅拷贝
function clone(origin, target){var tar = target || {};for(var key in origin){if(origin.hasOwnProperty(key)){//剔除非本身原型上的属性tar[key] = origin[key];}}}
4. 深拷贝
Object.prototype.num = 1;var penson1 = {name: '张三',sex: 'male',age: 38,children: {first: {name: 'jenney',age: 18},second:{name: 'Lucy',age: 12},third: {name: 'jone',age: 7}},car: ['Banz', 'Mazda']}var penson2 = deepClone(penson1);penson2.name = '李四';penson2.children.forth = {name: 'Ben',age: 1}penson2.car.push('BYD');function deepClone(origin, target){var target = target || {},toStr = Object.prototype.toString,//判断值的类型,后面加上call直接能用arrType = '[object Array]';for(var key in origin){if(origin.hasOwnProperty(key)){if(typeof(origin[key]) === 'object' && origin[key] !== null){//判断是引用值且不为nullif(toStr.call(origin[key]) === arrType){//判断是不是数组类型target[key] = [];}else{target[key] = {};}deepClone(origin[key], target[key]);//如果数据还有一层,就递归再循环出来}else{target[key] = origin[key];}}}return target;}console.log(penson1, penson2);
//结果返回的值name不同,penson2增加对象children里的值和增加数组car里的值并不会改变penson1
深拷贝的第二种方法
利用JSON的方法,也能达到深拷贝的目的,因为先转成字符串,然后再转对象,就已经不是原先的存储空间了。但是有缺陷,例如clone方法的时候就没用。
var str = JSON.stringify(penson1),//转成字符串person2 = JSON.parse(str);//转成对象
面试题/笔试题
1. 壹
function test(){console.log(foo);//undefinedvar foo = 2;console.log(foo);//2console.log(a);//报错}test();
2. 贰
function a(){var test;test();function test(){console.log(1);//1}}a();// AO = {// test: undefined; -> function// }
3. 叁
var name = '222';var a = {name: '111',say: function(){console.log(this.name);}}var fun = a.say;//这一步也就相当于var fun = function(){console.log(this.name)}this还是指向windowfun();//222a.say();//111var b = {name: '333',say: function(fun){fun();}}b.say(a.say);//222//这一步相当于在b.say函数里面放了一个fun()方法,因为是fun函数调用的,这个时候执行的this是指向window的,又所以仍然是222b.say = a.say;b.say();//333,a.say赋给了b.say,b调用的,所以是333
4. 肆
function test(){var marty = {name: 'marty',printName: function(){console.log(this.name);}}var test1 = {name: 'test1'}var test2 = {name: 'test2'}var test3 = {name: 'test3'}test3.printName = marty.printName;marty.printName.call(test1);//test1marty.printName.apply(test2);//test2marty.printName();//martytest3.printName();//test3}test();
5. 伍
var bar = {a: '1'};function test(){bar.a = 'a';Object.prototype.b = 'b';return function inner(){console.log(bar.a);//aconsole.log(bar.b);//b}}test()();//这一句实际上就是var test = test(); test();
作业
模块化开发
window.onload = function(){init();}function init(){console.log(initFb(10));console.log(initDiv(100));}// 1. 斐波那契数列var initFb = (function(){function fb(n){if(n <= 0){return 0;}if(n <= 2){return 1;}return fb(n - 1) + fb(n - 2);}return fb;})();// 2. 能被3、5、7整数的数var initDiv = (function(){function div(n){var arr = [];for(var i = 0;i <= n;i++){if(i % 3 === 0 || i % 5 === 0 || i % 7 ===0){arr.push(i);}}return arr}return div;})();
