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(); // 2
getName(); // 4
Foo().getName(); // 1
getName();// 1
// .运算符优先级 高于 new 运算符
new Foo.getName(); // 2
// 先执行new Foo() 返回的this中没有getName, 原型上寻找
new Foo().getName();// 3
new new Foo().getName();// 3
// 2. 请用wp接收用户输入的年份,判断是否是闰年? (请用三目运算来做)
// 1. 整除4 并且 不能整除100 2. 整除400
var year = window.prompt('请您输入您要确认的年份');
function isLeapYear(year){
((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0)
? console.log('是闰年')
: console.log('不是闰年');
}
isLeapYear(year);