1、三目运算
let str = '';str = 89 > 9 ? ('89' > '9' ? '通过' : '内层未通过') //字符串比较=>对位的ASCII码比较: ('外层未通过')console.log(str) // => '内层未通过'
2、浅拷贝
创建一个新对象,遍历要复制的对象,给新对象增加每个复制对象的箭名以及其箭值。
Object.prototype.num = 1//遍历对象时,原型链上自定义的属于都会被遍历到。let obj1 = {name: 'obj1',age: 16}let obj2 = clone(obj1)function clone(orig,targ){//考虑没有传targ空对象的情况var tar = targ || {}for(key in orig){//避免赋值原型链上的属性if(orig.hasOwnProperty(key)){tar[key] = orig[key]}}return tar}
3、深拷贝
核心:
(1)判断是否为自身属性
(2)判断属性值是否为原始值,原始值就直接赋值
(3)引用类型,判断是数组还是对象,然后调用自身函数,递归赋值
function deepClone(origin){var toString = Object.prototype.toString,isOriginObj = toString.call(origin) === '[object Object]',target = isOriginObj ? {} : [];for(key in origin){//判断是否为自身属性if(origin.hasOwnProperty(key)){//判断是否为原始值if(typeof(origin[key]) === 'object' && typeof(origin[key]) + '' !== 'null'){//判断是数组还是对象if(toString.call(origin[key]) === '[object Array]' ){target[key] = []}else{target[key] = {}}//调用函数本身,递归克隆该引用值target[key] = deepClone(origin[key])}else{//原始值,直接赋值,也是递归的出口target[key] = origin[key]}}}return target}
4、Json方法也可以完成深拷贝
先将原对象转换为json字符串,再解析成对象(不推荐)
Json.stringify
Json.parse
5、一些面试题
(1) 查找未声明的变量报错,访问对象没有的属性返回undefined
fucntion test(){console.log(foo) => undefinedvar foo = 2console.log(foo) => 2console.log(a) // => 报错}test()
(2) this指向问题
var name = '222'var a = {name: '111',say:function(){console.log(this.name)}}var fun = a.sayfun() // => 调用者为window,指向window window.a => '222'a.say() // => 调用者为a,this指向a this.avar b = {name: '333',say:function(fun){fun()}}b.say(a.say)// function(fun){// console.log(this) 这个地方this指向b// fun() 而传进来的函数,前面没有调用者,所以fun内部this默认指向window//}b.say = a.sayb.say() // => 调用者为b,函数内部this指向b 打印333
