- undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。
- 数字转换
- true为1
- false、空字符串、[""]、[]为0
- undefined、{}、非纯数字的字符串为NaN
Number({})
Number(["1"])
Number([""])
Number([])
- 布尔值转换
- 对象类型、非空字符串、非0的数字转boolean都为true
- 0、NaN、""、null、undefined都为false
!NaN
!undefined
!0
!null
!""
![]
!{}
- 字符串拼接
- 基本数据类型 + "a" 直接进行拼接
- 对象类型先调toPrimitive、valueOf、toString依次调用获取返回值
"a" + {}
"a" + []
"a" + ["1"]
"a" + ["a","2"]
"a" + function(){}
- 原型链
- 实例对象的__proto__指向其构造函数的prototype
function Foo() { }
const f1 = new Foo()
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()
console.log(f1.constructor === Foo, "f1.constructor === Foo");
console.log(f1.__proto__.constructor === Foo, "f1.constructor === Foo");
console.log(Foo === Foo.prototype.constructor, "Foo === Foo.prototype.constructor");
console.log(Foo.constructor === Function, "Foo.constructor === Function");
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()
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");
console.log(Object.prototype.__proto__ === null, "true");
- 通过
prototype.__proto__ 最终查找到的都是Object.prototype
function Foo() { }
const f1 = new Foo()
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");
console.log(f1.prototype, "f1.prototype");
console.log(Foo.prototype, "Foo.prototype");
console.log(f1.__proto__.__proto__ === Function.prototype, "false");
console.log(f1.__proto__.__proto__ === Object.prototype, "true");
- escape、encodeURI、encodeURIComponent、decodeURI
- encodeURI对字符串进行编码转
- encodeURIComponent比encodeURI能转义的字符更多
- decodeURI对编译后的字符进行解码
- escape废弃垃圾
encodeURI("&m哈哈")
encodeURIComponent("&m哈哈")
- 正则表达式
- 限定符
? 表示?前面的字符需要出现0次或1次,也就是说?前面这个字符可有可无
* 表示?前面的字符可以出现0次或n次,n表示任意几次
+ 表示+前面的字符至少出现1次或1次以上
{2,5}和{5} 可以指定{}前面的字符串出现次数/范围
()+ 在()内可以指定匹配多个字符串出现的次数
/mska?/.test("mskee,mskahahahah") // true
/ab*c/.test("aec")
/ab*c/.test("abbbc")
/ab+c/.test("abbbc")
/ab+c/.test("ac")
/e(ab){2}c/.test("aaa,eababc,aaa")
- 方法
- /a/.exce("aaa")
- 用于检索字符串中的正则表达式的匹配,匹配成功返回数组,匹配失败返回Null
- 这个方法只会执行一次,加上修饰符 g 也只会执行一次,当再次调用的时候会从上次查询到的位置继续往后查。
- 白屏时间first paint和可交互时间dom ready的关系是?
- firstPaint白屏时间,也就是开始解析DOM耗时,用户在没有滚动时候看到的内容渲染完成并且可以交互的时间。
- domReadyTime:用户可操作时间。
Symbol.for("b") 寻找Symbol有没有b这个key,没有创建,有则返回
- 函数提升优先级高于变量提升,但是要注意变量的赋值时机