1. 三目运算符/三元运算符
var a = 5,
str = '';
str = a > 0 ? '大于0' //return 自带return的功能
: '小于0'; //return
console.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添加一个son
var 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){//判断是引用值且不为null
if(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);//undefined
var foo = 2;
console.log(foo);//2
console.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还是指向window
fun();//222
a.say();//111
var b = {
name: '333',
say: function(fun){
fun();
}
}
b.say(a.say);//222
//这一步相当于在b.say函数里面放了一个fun()方法,因为是fun函数调用的,这个时候执行的this是指向window的,又所以仍然是222
b.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);//test1
marty.printName.apply(test2);//test2
marty.printName();//marty
test3.printName();//test3
}
test();
5. 伍
var bar = {
a: '1'
};
function test(){
bar.a = 'a';
Object.prototype.b = 'b';
return function inner(){
console.log(bar.a);//a
console.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;
})();