js高级

57 阅读3分钟
  1. undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。
  2. 数字转换
  • true为1
  • false、空字符串、[""]、[]为0
  • undefined、{}、非纯数字的字符串为NaN
// 对象转数字
Number({}) // NaN
Number(["1"]) // 1
Number([""]) // 0
Number([]) // 0
  1. 布尔值转换
  • 对象类型、非空字符串、非0的数字转boolean都为true
  • 0、NaN、""、null、undefined都为false
// ! 转换为布尔值取反
!NaN    // true NaN为false取反
!undefined    // true undefined为false取反
!0    // true 0为false取反
!null // true null为false取反
!"" // true   空串为false取反

// 对象类型转boolean都为true,非空字符串
![] // false  []为true取反
!{} // false  {}为true取反

  1. 字符串拼接
  • 基本数据类型 + "a" 直接进行拼接
  • 对象类型先调toPrimitive、valueOf、toString依次调用获取返回值
"a" + {} // a[object Object]   {}.toString()
"a" + [] // a     [].valueOf()返回 ""
"a" + ["1"] // a1 [].valueOf()返回 "1"
"a" + ["a","2"] // aa,2'
"a" + function(){} // 'afunction(){}'
  1. 原型链
  • 实例对象的__proto__指向其构造函数的prototype
function Foo() { }
const f1 = new Foo()
// 实例对象的隐式原型__proto__ = 构造函数的.prototype
console.log(f1.__proto__ === Foo.prototype, "f1.__proto__ === Foo.prototype");
console.log(Foo.__proto__ === Function.prototype, "Foo.prototype.__proto__ === Function.prototype");
  • 所有对象的construcor都指向其构造函数,只有Function的construcor指向Function本身
  function Foo() { }
  const f1 = new Foo()
  // 实例对象的constructor = 指向其构造函数
  console.log(f1.constructor === Foo, "f1.constructor === Foo");
  console.log(f1.__proto__.constructor === Foo, "f1.constructor === Foo");
  // 函数.prototype.constructor == 函数
  console.log(Foo === Foo.prototype.constructor, "Foo === Foo.prototype.constructor");
  // 普通函数的constructor = 指向Function --> Foo.constructor === Function 
  console.log(Foo.constructor === Function, "Foo.constructor === Function");
  // Function.constructor 才指向自身
  console.log(Function.constructor === Function, "Function.constructor === Function");
  console.log("aaa".constructor === String, `"aaa".constructor === String`);
  • 普通函数/Object、String、Date这种类的__proto__都指向Function.prototype
  function Foo() { }
  const f1 = new Foo()
  // 如下几个都指向Function.prototype
  console.log(Foo.__proto__ === Function.prototype, "true");
  console.log(Function.__proto__ === Function.prototype, "true");
  console.log(Object.__proto__ === Function.prototype, "true");
  console.log(String.__proto__ === Function.prototype, "true");
  • 原型链的尽头是null
 console.log(Object.prototype.__proto__ === null, "true");
  • 通过prototype.__proto__ 最终查找到的都是Object.prototype
  function Foo() { }
  const f1 = new Foo()
  // Function、Array、String的prototype.__proto__ = Object.prototype
  console.log(Function.prototype.__proto__ === Object.prototype, "Function.prototype.__proto__ === Object.prototype");
  console.log(Array.prototype.__proto__ === Object.prototype);
  console.log(String.prototype.__proto__ === Object.prototype);
  console.log(Foo.prototype.__proto__ === Object.prototype, "true");
  // new出来实例对象没有prototype,new Function的函数除外,其他都是返回undefined
  console.log(f1.prototype, "f1.prototype"); // undefined
  console.log(Foo.prototype, "Foo.prototype"); // Foo原型对象 不添加任何方法\属性,可以获取到空的{}
  // 因为f1.__proto__.__proto__ === Function.prototype.__proto__ === Object.prototype
  console.log(f1.__proto__.__proto__ === Function.prototype, "false");
  console.log(f1.__proto__.__proto__ === Object.prototype, "true");
  1. escape、encodeURI、encodeURIComponent、decodeURI
  • encodeURI对字符串进行编码转
  • encodeURIComponent比encodeURI能转义的字符更多
  • decodeURI对编译后的字符进行解码
  • escape废弃垃圾
encodeURI("&m哈哈") // '&m%E5%93%88%E5%93%88'
encodeURIComponent("&m哈哈") // '%26m%E5%93%88%E5%93%88'
  1. 正则表达式
  • 限定符
    • ? 表示?前面的字符需要出现0次或1次,也就是说?前面这个字符可有可无
    • * 表示?前面的字符可以出现0次或n次,n表示任意几次
    • + 表示+前面的字符至少出现1次或1次以上
    • {2,5}{5} 可以指定{}前面的字符串出现次数/范围
    • ()+ 在()内可以指定匹配多个字符串出现的次数
/mska?/.test("mskee,mskahahahah") // true

/ab*c/.test("aec") // false
/ab*c/.test("abbbc") // true
// +
/ab+c/.test("abbbc") // true
/ab+c/.test("ac") // false

/e(ab){2}c/.test("aaa,eababc,aaa") // true
  • 方法
    • /a/.exce("aaa")
      • 用于检索字符串中的正则表达式的匹配,匹配成功返回数组,匹配失败返回Null
      • 这个方法只会执行一次,加上修饰符 g 也只会执行一次,当再次调用的时候会从上次查询到的位置继续往后查。
// ["e", index]
  1. 白屏时间first paint和可交互时间dom ready的关系是?
  • firstPaint白屏时间,也就是开始解析DOM耗时,用户在没有滚动时候看到的内容渲染完成并且可以交互的时间。
  • domReadyTime:用户可操作时间。
  1. Symbol.for("b") 寻找Symbol有没有b这个key,没有创建,有则返回
  2. 函数提升优先级高于变量提升,但是要注意变量的赋值时机