19、a==1&&a==2&&a==3

  • ==进行比较,如果左右两边的数据类型不相同的话那么先转换成相同的数据类型,然后再进行比较
    • {}=={}两个对象进行比较时比较堆内存的地址
    • null==undefined相等的,但是三个等号就不相等
    • NaN == NaN不相等,NaN和谁都不相等
    • [12]=="12"对象和字符串项比较,是把对象toString转换成字符串之后进行比较
    • 剩余所有的情况进行比较的时候都是转化成数字(对象转换成数字都是现toString转换成字符串,再转换成数字)(前提是类型不一样的时候)
      • 对象转化成数字都是现转化成字符串,再转化成数字
      • 字符串转化成数字,只要出现一个非数字字符,结果就是NaN
      • 布尔转数字:true => 1 false=>0
      • null转化成数字0
      • undefined转化成数字NaN
[12]==true 都是转化成数字. => Number([12].toString()) 输出12  ==  1 不相等
[] == false  []=> 0  false => 0 相等
[] == 1  []=>0  不相等
"1" == 1    相等
true == 2        不相等
var a = ?使得a==1&&a==2&&a==3

给对象添加一个私有的toString方法,重构私有方法

  • 方法一:
使得a==1&&a==2&&a==3成立

对象要先toString然后进行转化成数字

var a = {
  n:0,
  toString:function(){        //所有的值调用toString都是先看自己私有有没有,没有再原型链上找
    return ++ this.n;        
  }
}
  • 方法二
//shift删除数组第一项,返回删除的内容,原有的数组改变
var a = [1,2,3]
a.toString= a.shift
a==1&&a==2&&a==3
  • 方法三
let n = 0;
Object.defineProperty(window,'a',{
  get:function(){
    return ++n;
  }
})

//设置成全局变量实际并不好,可以优化
Object.defineProperty(window,'a',{
  get:function(){
      this.val?this.val++:this.val=1;
  }
})

ES6新增方法

  • Array
    • from将其他的转化成数组
    • isArray判断是否为数组
  • String.fromCharCode(122) => z. 'z'.charCodeAt() => 122
  • Object.create([obj])创建空对象,原型链指向空对象
  • Object.defineProperty用于定义某个对象中的参数,三个参数:对象、属性、值
let obj = {
  name:'Jane'
}
//Object.defineProperty(obj,'name','smileyqp')        //每次获取时候会触发get方法,于是可以从get方法着手
//监听获取和设置
Object.defineProperty(obj,'name',{
    get:function(){
      return 'smileyqp'
    },
    set:function(){
    return 'Mary'
    }
})

results matching ""

    No results matching ""