1、对象属性访问方法
(1) ‘ . ‘语法
(2) 中括号访问 [ ],里面写字符串,所以可以通过字符串拼接来访问对象属性。
最开始js引擎会将’ . ‘语法,隐式转换为中括号的形式进行访问。
2、遍历对象
let obj ={
name: 'obj',
age:25
}
for(var key in obj ){
console.log(obj.key) // => undefined ,访问过程为 obj.key => obj['key'] 访问obj的key属性 ,所以返回undefined.
console.log(obj[key])
}
for in也可以遍历数组,key为元素下标(字符串 ‘0’, ‘1’等)。
3、hasOwnProperty
用来判断是否为对象自身属性,实际开发用的比较多
for in遍历对象,会把对象自身和原型链上自定义的属性遍历出来,如果只打印自身属性,就可以使用hasOwnProperty方法来判断。
4、in 判断是否有相关属性
判断自身和原型链上有无相关属性,属性名为字符串。作为了解
let car = {name: 'benz'}
Object.prototype.age = 1
console.log('name' in car) // => true 自身属性
console.log('age' in car) // => true 原型链上属性
5、instanceof
用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上
6、Object.prototype.toString.call
调用Object.prototype.toString.call(obj),改变原来方法中的this,用来判断相关对象。很常用的数据类型判断方法。
this
1、普通函数中的this和全局的this,默认指向window
function fn (){
this.guitar = 'ibanze'
}
fn()
console.log(guitar,this.guitar,window.guitar) // => 'ibanze'
//普通函数中,this默认指向window
2、构造函数预编译时,this指向window,遇到new时,将this对象返回,所以指向了实例化对象。
callee-caller
arguments.callee用于引用该函数的函数体内当前正在执行的函数,在哪个函数体内,就引用哪个函数
function test(a,b,c){
console.log(arguments.callee.length) // => test.length 3,形参个数
console.log(arguments.length) // => 2, 实参个数
}
test(1, 2)
在匿名函数中可以引用当前函数:
var sum = (function(n){
if(n <= 1) return 1
sum = n + arguments.callee(n -1)
})()
console.log(sum)
caller返回当前被调用函数的调用者
面试题
1、逗号运算符 + 立即执行函数
let f = (function fn1(){return 1}, fucntion fn2(){return 2}())
// ( function fn2(){} )(),先进行括号里的逗号运算符,再执行匿名函数
console.log(typeof(f)) // => 'number'
2、自己写一个IsNaN函数
核心点:NaN 参与的比较运算都返回NaN,但是可以转换为字符串进行比较
function myIsNaN(num){
var res = Number(num)
if( (res + '') === 'NaN'){
return true
}else{
return false
}
}
3 、空对象是否等于空对象,为什么,怎么才能相等。
console.log({} == {}) // => false,因为引用值存的是指针,两个不同对象的地址不一样,所以不相等。
如何才能相等 => 如果是同一个地址就能相等。
let obj = {};
let obj1 = obj;
console.log(obj === obj1) //=> true