道阻且长,弄懂一个是一个
待补充
function sayHi () {
console.log(name)
console.log(age)
var name = 'xiaoqiang'
let age = 21
}
sayHi()
- A:
Lydia
和undefined
- B:
Lydia
和ReferenceError
- C:
ReferenceError
和21
- D:
undefined
和ReferenceError
答案
选择:D笔点:let与var的区别
解析:输出name为undefined
:对于用var声明的变量name,在其声明之前使用输出 未定义(undefined),相当于在打印时先var name
后name = 'xiaoqiang'
输出age为ReferenceError
:对于用let声明的变量age,在其声明之前使用,输出 引用错误(ReferenceError),代表当一个不存在的变量被引用时报的错误。在ES6中明确规定变量必须声明后再使用,一切在声明前使用的变量都会报此错误
笔记
var:有变量提升(内存空间在创建阶段就被设置好了,直到程序运行到定义变量位置之前默认值都是 undefined。)
let:也有变量提升,和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。
再次注意:1.let,const 有变量提升 2.let,const的变量提升标注了暂时性死区的开始 3.你在暂时性死区里使用,就会报错
[] == ![] ? alert(true):alert(false)
答案
结果:true笔点:类型转换(隐式类型转换)
解析:
1. 取非!的优先级比==高, ![] => !true => false
2. 等号左边是引用类型 [] => [].toPrimitive()=''
3. '' == false => Number('') == Number(false)
4. 0 == 0 => true
笔记
简单来说: 在 == 符号的左右,遇到布尔类型、字符串类型和数字类型这三种基本类型,通通会`Number(x)`将其转为数字;若有一边是引用类型有一边是基本类型,则将引用类型`ToPromitive(x)`后再与另一边的数字类型做比较;若都是引用类型则看他们的指针是否指向同一个对象,是则true;(你需要弄懂ToPrimitive()的执行原理)
注意事项: 时刻牢记,只有`null undefined 空字符串 NaN 0 `会被转换为false,其他的都将转为true;null与undefined不严格相等;NaN与谁都不想等包括自身;null转数字为0,而undefined转数字为NaN
取经: >== 如何工作的?&&&>各种蛋疼的类型转换