1. 条件运算符(三目,三元)
condition ? exprIfTrue : exprIfFalse
条件(三元)运算符是 JavaScript 仅有的使用三个操作数的运算符。一个条件后面会跟一个问号(?),如果条件为 truthy ,则问号后面的表达式A将会执行;表达式A后面跟着一个冒号(:),如果条件为 falsy ,则冒号后面的表达式B将会执行。本运算符经常作为 if 语句的简捷形式来使用。
var a = 5;if(a > 0) {console.log('大于0');} else {console.log('小于等于0');}a > 0 ? '大于0' : '小于等于0';//----------------------------------------------------------------------------------var a = 5,str = '';if(a > 0){if(a > 3){str = '大于3';}else{str = '小于等于3';}}else{str = '小于等于0';}a > 0 ? a > 3 ? str = '大于3': str = '小于等于3': str = '小于等于0';console.log(str);
var str = 89 > 9 ? ('89' > '9' ? '通过了': '内层未通过'): '外层未通过';// 1.三元运算符// 2. 多个字符的字符串进行比较,比较Ascii,console.log(str); // '内层未通过'
2. 拷贝
Object.prototype.num = 1;var person1 = {name: '张三',age: 18,sex: 'male',height: 180,weight: 140,children: {first: {name:'张小二',age: 18},second: {name: '张小三',age: 16},third: {name: '张小四',age: 10},},car: ['Benz', 'Mazda']}// 这样拷贝,改变person2,person1也会被改变var person2 = person1;person2.name = '李四';console.log(person1, person2);
1. 浅拷贝
// 浅拷贝Object.prototype.num = 1;var person1 = {name: '张三',age: 18,sex: 'male',height: 180,weight: 140,children: {first: {name:'张小二',age: 18},second: {name: '张小三',age: 16},third: {name: '张小四',age: 10},},car: ['Benz', 'Mazda']}var person2 = {};for(var key in person1){person2[key] = person1[key];}person2.name = '李四';person2.car.push('Audi');console.log(person1, person2);// 浅拷贝的封装function clone(origin, target){var target = target || {};for(var key in origin){// target[key] = origin[key];if(origin.hasOwnProperty(key)){// hasOwnProperty判断属于origin自己本身的对象才进行浅拷贝target[key] = origin[key];}}return target}

2. 深拷贝
// 深拷贝function deepClone(origin, target){var target = target || {},toStr = Object.prototype.toString,arrType = '[object Array]';for(var key in origin){// 1.判断该项是不是 origin本身的属性if(origin.hasOwnProperty(key)){// 2.判断该项是不是对象if(typeof(origin[key]) === 'object'){// 3. 进一步判断该项为数组还是对象if(toStr.call(origin[key]) === arrType){target[key] = [];}else{target[key] = {}}target[key] = deepClone(origin[key], target[key]);}else{target[key] = origin[key];}}}return target}var person2 = deepClone(person1);person2.car.push('Audi');person2.children.forth = {name: '张小五',age: 8}console.log(person1, person2);
function deepClone(obj = {}, map = new Map()) {if (typeof obj !== "object") {return obj;}if (map.get(obj)) {return map.get(obj);}let result = {};// 初始化返回结果if (obj instanceof Array ||// 加 || 的原因是为了防止 Array 的 prototype 被重写,Array.isArray 也是如此Object.prototype.toString(obj) === "[object Array]") {result = [];}// 防止循环引用map.set(obj, result);for (const key in obj) {// 保证 key 不是原型属性if (obj.hasOwnProperty(key)) {// 递归调用result[key] = deepClone(obj[key], map);}}// 返回结果return result;}
3.JSON克隆
// JSON克隆var str = JSON.stringify(person1);// console.log(str);var person2 = JSON.parse(str);console.log(person2);person2.car.push('Audi');person2.children.forth = {name: '张小五',age: 8}console.log(person1, person2);
3. 练习
function Foo(){getName = function(){console.log(1);}return this;}Foo.getName = function(){console.log(2);}Foo.prototype.getName = function(){console.log(3);}var getName = function(){console.log(4);}function getName(){console.log(5);}Foo.getName(); // 2getName(); // 4Foo().getName(); // 1getName();// 1// .运算符优先级 高于 new 运算符new Foo.getName(); // 2// 先执行new Foo() 返回的this中没有getName, 原型上寻找new Foo().getName();// 3new new Foo().getName();// 3
// 2. 请用wp接收用户输入的年份,判断是否是闰年? (请用三目运算来做)// 1. 整除4 并且 不能整除100 2. 整除400var year = window.prompt('请您输入您要确认的年份');function isLeapYear(year){((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0)? console.log('是闰年'): console.log('不是闰年');}isLeapYear(year);
