1、对象属性访问方法
    (1) ‘ . ‘语法
    (2) 中括号访问 [ ],里面写字符串,所以可以通过字符串拼接来访问对象属性。
    最开始js引擎会将’ . ‘语法,隐式转换为中括号的形式进行访问。

    2、遍历对象

    1. let obj ={
    2. name: 'obj',
    3. age:25
    4. }
    5. for(var key in obj ){
    6. console.log(obj.key) // => undefined ,访问过程为 obj.key => obj['key'] 访问obj的key属性 ,所以返回undefined.
    7. console.log(obj[key])
    8. }

    for in也可以遍历数组,key为元素下标(字符串 ‘0’, ‘1’等)。
    3、hasOwnProperty
    用来判断是否为对象自身属性,实际开发用的比较多
    for in遍历对象,会把对象自身和原型链上自定义的属性遍历出来,如果只打印自身属性,就可以使用hasOwnProperty方法来判断。
    4、in 判断是否有相关属性
    判断自身和原型链上有无相关属性,属性名为字符串。作为了解

    1. let car = {name: 'benz'}
    2. Object.prototype.age = 1
    3. console.log('name' in car) // => true 自身属性
    4. 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

    1. function fn (){
    2. this.guitar = 'ibanze'
    3. }
    4. fn()
    5. console.log(guitar,this.guitar,window.guitar) // => 'ibanze'
    6. //普通函数中,this默认指向window

    2、构造函数预编译时,this指向window,遇到new时,将this对象返回,所以指向了实例化对象。

    callee-caller
    arguments.callee用于引用该函数的函数体内当前正在执行的函数,在哪个函数体内,就引用哪个函数

    1. function test(a,b,c){
    2. console.log(arguments.callee.length) // => test.length 3,形参个数
    3. console.log(arguments.length) // => 2, 实参个数
    4. }
    5. test(1, 2)

    在匿名函数中可以引用当前函数:

    1. var sum = (function(n){
    2. if(n <= 1) return 1
    3. sum = n + arguments.callee(n -1)
    4. })()
    5. console.log(sum)

    caller返回当前被调用函数的调用者

    面试题
    1、逗号运算符 + 立即执行函数

    1. let f = (function fn1(){return 1}, fucntion fn2(){return 2}())
    2. // ( function fn2(){} )(),先进行括号里的逗号运算符,再执行匿名函数
    3. console.log(typeof(f)) // => 'number'

    2、自己写一个IsNaN函数
    核心点:NaN 参与的比较运算都返回NaN,但是可以转换为字符串进行比较

    1. function myIsNaN(num){
    2. var res = Number(num)
    3. if( (res + '') === 'NaN'){
    4. return true
    5. }else{
    6. return false
    7. }
    8. }

    3 、空对象是否等于空对象,为什么,怎么才能相等。

    1. console.log({} == {}) // => false,因为引用值存的是指针,两个不同对象的地址不一样,所以不相等。

    如何才能相等 => 如果是同一个地址就能相等。

    1. let obj = {};
    2. let obj1 = obj;
    3. console.log(obj === obj1) //=> true