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) => undefined
var foo = 2
console.log(foo) => 2
console.log(a) // => 报错
}
test()
(2) this指向问题
var name = '222'
var a = {
name: '111',
say:function(){console.log(this.name)}
}
var fun = a.say
fun() // => 调用者为window,指向window window.a => '222'
a.say() // => 调用者为a,this指向a this.a
var 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.say
b.say() // => 调用者为b,函数内部this指向b 打印333